28-10-2018, 23:41
Kod:
#include "DHT.h" // biblioteka DHT
#include "U8glib.h" // bibioteka OLED I2C
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI
#define DHTPIN 2 // definicja PIN dla DHT
#define DHTTYPE DHT22 // DHT 22
DHT dht(DHTPIN, DHTTYPE, 6); // deklaracja DHT
char str[10]; // znak stopni celsujsza i procent
int WILG; // zmienna wilgotnosc
float TEMP; // zmienna temperatura w stopniach C
unsigned long aktualnyCzas = 0; // do millis
unsigned long zapamietanyCzas = 0; // do millis
int relay_pin = 8; // przekaznik
int relay_pin2 = 12; // przekaznik
int relay_pin3 = 7; // przekaznik
int relay_pin4 = 9;
#define led_info_promiennik 4 // dioda od promiennika
#define led_info_generator 13 // dioda od generatora pary
#define led_info_nic 1
int potencjometr = A0; // odczyt napiecia z potentcjometru pinem analogowym 0
int wartosc = 0; // zmienna przechowujaca wartosc napiecia odczytanego
int dane[5]; // do potencjometru do sredniej
int i=0; // do potencjometru do sredniej
int srednia; // do potencjometru do sredniej
//------------------------------------------------------------------//
// Sekcja ".initX" (ZERO zainicjalizowane) //
//------------------------------------------------------------------//
#define NOINIT __attribute__ ((section(".noinit")))
unsigned char DnoStosu NOINIT; // Kontrola stosu
void ClrIntRam(void) __attribute__ ((naked)) __attribute__ ((section (".init3")));
void ClrIntRam(void)
{
unsigned char *AdrRam;
//--- Zapisujemy od ostatniej zajetej komórki ram do wierzchołka stosu -32 bajty rezerwy ---
for (AdrRam=&DnoStosu; AdrRam < (unsigned char*)RAMEND-32; AdrRam++) // Wpisanie do IntRam $FF
{
*AdrRam = 0xFF;
}
}
void setup()
{
dht.begin(); // inicjalizacja DHT
pinMode(potencjometr, INPUT); //pin A0 (pot) jako wejście
pinMode(relay_pin, OUTPUT);
pinMode(relay_pin2, OUTPUT);
pinMode(relay_pin3, OUTPUT);
pinMode(relay_pin4, OUTPUT);
digitalWrite(relay_pin, HIGH);
digitalWrite(relay_pin2, HIGH);
digitalWrite(relay_pin3, HIGH);
digitalWrite(relay_pin4, HIGH);
pinMode(led_info_promiennik, OUTPUT);
pinMode(led_info_generator, OUTPUT);
pinMode(led_info_nic, OUTPUT);
}
void draw(void){
u8g.firstPage();
do {
u8g.setFont(u8g_font_helvB08); // czcionka
u8g.drawStr( 2, 27, "Zwiekszanie wilgotnosci!");
u8g.drawStr( 2, 42, "Wilgotnosc :");
u8g.drawStr( 80, 42, dtostrf(WILG, 5, 2, str));
u8g.drawStr( 110, 42, "%");
u8g.drawStr( 2, 57, "Wilg. zad.:");
u8g.drawStr( 80, 57, dtostrf(wartosc, 5, 2, str));
u8g.drawStr( 110, 57, "%");
} while( u8g.nextPage() ); // koniec petli obrazu
}
void draw2(void){
u8g.firstPage();
do {
u8g.setFont(u8g_font_helvB08); // czcionka
u8g.drawStr( 2, 27, "Zmniejszanie wilgotnosci!");
u8g.drawStr( 2, 42, "Wilgotnosc :");
u8g.drawStr( 80, 42, dtostrf(WILG, 5, 2, str));
u8g.drawStr( 110, 42, "%");
u8g.drawStr( 2, 57, "Wilg. zad.:");
u8g.drawStr( 80, 57, dtostrf(wartosc, 5, 2, str));
u8g.drawStr( 110, 57, "%");
} while( u8g.nextPage() ); // koniec petli obrazu
}
void draw3(void){
u8g.firstPage();
do {
u8g.setFont(u8g_font_helvB08); // czcionka
u8g.drawStr( 2, 27, "Strefa Nieczulosci");
u8g.drawStr( 2, 42, "Wilgotnosc :");
u8g.drawStr( 80, 42, dtostrf(WILG, 5, 2, str));
u8g.drawStr( 110, 42, "%");
u8g.drawStr( 2, 57, "Wilg. zad.:");
u8g.drawStr( 80, 57, dtostrf(wartosc, 5, 2, str));
u8g.drawStr( 110, 57, "%");
} while( u8g.nextPage() ); // koniec petli obrazu
}
void loop() {
aktualnyCzas = millis();
if (aktualnyCzas - zapamietanyCzas >= 50UL) {
//Zapamietaj aktualny czas
zapamietanyCzas = aktualnyCzas;
}
WILG = dht.readHumidity(); // odczytaj wilgotnosc
TEMP = dht.readTemperature(); // odczytaj temp
wartosc = analogRead(A0);
dane[i]=wartosc; // do sredniej potencjoemtru
i++;
if(i==5){
i=0;
}
for(int j=0;j<5;j++){
srednia+=dane[j]; // do sredniej potencjoemtru
}
srednia/=5.0; // do sredniej potencjoemtru
wartosc = map(wartosc, 0, 1023, 0, 100); // skalowanie od 0 do 100
// PETLA OD WARUNKOW
if(wartosc>(WILG+2)) {
u8g.firstPage();
do {
draw();
} while (u8g.nextPage() );
digitalWrite(relay_pin2, HIGH); //Wyłączenie Promiennika
digitalWrite(relay_pin3, LOW); // ON wentylatora
digitalWrite(relay_pin4, LOW); //ON wentylatora
digitalWrite(relay_pin, LOW); // Wlaczenie GENERATORA PARY
digitalWrite(led_info_generator, HIGH); //Włączenie diody od GENERATORA
digitalWrite(led_info_promiennik, LOW); //WYLACZENIE diody od PROMIENNIKA
digitalWrite(led_info_nic, LOW); // Wyłączenie diody od Strefy Nieczułości
}
else if(wartosc<(WILG-2)){
u8g.firstPage();
do {
draw2();
} while (u8g.nextPage() );
digitalWrite(relay_pin3, HIGH); // OFF wentylatorow
digitalWrite(relay_pin4, HIGH); // OFF wentylatorów
digitalWrite(relay_pin, HIGH); // Wylaczenie GENERATORA
digitalWrite(relay_pin2, LOW); // Wlaczenie Promiennika
digitalWrite(led_info_promiennik, HIGH); //Włączenie diody od PROMIENNIKA
digitalWrite(led_info_generator, LOW); //Wyłączenie diody od GENERATORA
digitalWrite(led_info_nic, LOW); // Wyłączenie diody od Strefy Nieczułosci
}
else { // tolerancja 2 stopni odnosnie rownosci ze wzgledu na te wahania potencjometru
u8g.firstPage();
do {
draw3();
} while (u8g.nextPage() );
digitalWrite(relay_pin, HIGH); // Wyłaczenie generatora
digitalWrite(relay_pin2, HIGH); // Wyłączenie promiennika
digitalWrite(relay_pin3, HIGH); // OFF wentylatorow
digitalWrite(relay_pin4, HIGH); // OFF wentylatorów
digitalWrite(led_info_promiennik, LOW); //WYLACZENIE diody od PROMIENNIKA
digitalWrite(led_info_generator, LOW); //WYLACZENIE diody od GENERATORA
digitalWrite(led_info_nic, HIGH); // Włączenie diody od Strefy Nieczułosci
}
}
//----------------------------------------------------------------------//
// Sprawdz zajetość stosu //
//----------------------------------------------------------------------//
void TestStosu()
{
unsigned char *AdrRam;
unsigned int cnt=0;
//--- Sprawdzamy od ostatniej zajetej komórki ram do wierzchołka stosu -32 bajty rezerwy ---
for (AdrRam=(&DnoStosu)+1; AdrRam < (unsigned char*)RAMEND-32; AdrRam++) // Wpisanie do IntRam $FF
{
cnt++;
if (*AdrRam != 0xFF)
{
FreeRam = cnt; // Wolny obszar RAM'u
if (FreeRam < 32 )
{ // Jesli za mały obszar to generuj błąd
PrintError( ERR_STOS );
StanLedErr=LED_ERR_STOS;
sprintf_P(str, PSTR(" Free $%04x RAM"CRLF), FreeRam); PrintString(str); _delay_ms(TIMUARTFREE);
}
return;
}
}
}