25-10-2018, 11:01
Witam wszystkich. Napisałem kod programu który odpowiada za układ regulacji trójstawny(trójpołożeniowy). Wszystko działa jak należy jednak wyświetlacz OLED zawiesza się w momencie strefy nieczułości - to znaczy : gdy wartość zadaną ustawię na np 70% a wartość wilgotności wynosi 72% to według warunku " else {}" nie powinno działać żadne urządzenie , tylko dioda LED. Tak też się dzieje jednak po chwili gdy wartość zadaną ustawiam na np.80% wartość na wyświetlaczu nie zmienia się , mimo iż przekaźnik działa jak należy. Wyświetlacz zaczyna znowu działać w momencie odłączenia i ponownego załączenia arduino do prądu. Zawieszanie wyświetlacza występuje tylko i wyłącznie właśnie w tej strefie nieczułości. Czy ktoś wie czemu tak się dzieje?
Kod programu:
Kod programu:
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 histereza=2;
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
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);
}
// glowna petla programu
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 obrazu
u8g.firstPage();
do {
u8g.setFont(u8g_font_helvB08); // czcionka
u8g.drawStr( 2, 27, "Wilgotnosc :");
u8g.drawStr( 80, 27, dtostrf(WILG, 5, 2, str));
u8g.drawStr( 110, 27, "%");
u8g.drawStr( 2, 42, "Temperatura :");
u8g.drawStr( 80, 42, dtostrf(TEMP, 5, 2, str));
u8g.drawStr( 110, 42, "\260C");
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
// PETLA OD WARUNKOW
if(wartosc>(WILG+2)) {
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)){
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
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
}
}