_krzaku Napisano Maj 4, 2017 Udostępnij Napisano Maj 4, 2017 Witajcie! Robię stację pogodową na Arduino UNO, z dwoma czujnikami temperatury, czujnikiem opadów i modułem czasu. Wszystko podpięte jest do wyświetlacza LCD 16,2. Czujniki temperatury są podpięte na jednym pinie cyfrowym dwoma przewodami. Program odczytuje temperaturę ale wyświetla ją w dziwny sposób, otóż pierwsza temperatura jest wyświetlana na ułamek sekundy a następnie jest wyświetlana druga w tym samym miejscu. Dodatkowo przy każdym odczycie wyświetlacz jest jakby na nowo odświeżany i wszystko zanika i pojawia się. Na wyświetlaczu jest pokazywany odczyt z czujników, procent zawilgocenia płytki z komentarzem i godzina. Chciałbym żeby wszystko było wyświetlane płynnie bez skoków i migania oraz żeby temperatury były wyodrębnione, jak to zrobić? Kod poniżej. Pomocy!!! // Program odczytuje temperaturę kilku czujników #include <Wire.h> #include <OneWire.h> #include <DS18B20.h> #include <LiquidCrystal_I2C.h> #include <DS3231.h> // moduł czasu LiquidCrystal_I2C lcd(0x3F, 16,2); // Numer pinu do którego podłaczasz czujnik #define ONEWIRE_PIN 8 // Ilość czujników #define SENSORS_NUM 2 // Adresy czujników const byte address[SENSORS_NUM][8] PROGMEM = { 0x28, 0xFF, 0xB0, 0x9, 0xB5, 0x16, 0x5, 0x64, 0x28, 0xFF, 0x95, 0x24, 0XB5, 0x16, 0x5, 0xA3 }; OneWire onewire(ONEWIRE_PIN); DS18B20 sensors(&onewire); // zegar DS3231 clock; RTCDateTime dt; // zegar koniec // deszcz int sensor_A0 = A0; // podłączenie od A0 na czujniku do A0 na Arduino int sensor_D0 = 4; // podłączenie od D0 na czujniku do pinu 2 na Arduino int wartosc_A0; // zmienna dla wartości A0 int wartosc_D0; // zmienna dla wartości A0 // deszcz koniec void setup() { while(!Serial); Serial.begin(9600); sensors.begin(); sensors.request(); lcd.init(); lcd.init(); lcd.backlight(); // deszcz pinMode(4, INPUT); // ustawienie pinu 2 jako wejście // deszcz koniec } void loop() { if (sensors.available()) { for (byte i=0; i<SENSORS_NUM; i++) { float temperature = sensors.readTemperature(FA(address[i])); Serial.print(F("#")); Serial.print(i); Serial.print(F(": ")); Serial.print(temperature); Serial.println(F(" 'C")); // tu umieść resztę twojego programu // Będzie działał bez blokowania { // zegar Wire.beginTransmission(0x68); Wire.write((byte)0); Wire.endTransmission(); Wire.requestFrom(0x68, 3); while (Wire.available()) { int seconds = Wire.read(); int minutes = Wire.read(); int hours = Wire.read(); seconds = (((seconds & 0b11110000) >> 4) * 10 + (seconds & 0b00001111)); // convert BCD to decimal minutes = (((minutes & 0b11110000) >> 4) * 10 + (minutes & 0b00001111)); // convert BCD to decimal hours = (((hours & 0b00100000) >> 5) * 20 + ((hours & 0b00010000) >> 4) * 10 + (hours & 0b00001111)); // convert BCD to decimal (assume 24 hour mode) lcd.setCursor(11, 1); if (hours < 10) { lcd.print("0"); } lcd.print(hours); lcd.print(":"); if (minutes < 10) { lcd.print("0"); } lcd.print(minutes); // lcd.print(":"); // if(seconds<10){lcd.print("0");} // lcd.print(seconds); } // zegar koniec // czujnik deszczu wartosc_A0 = analogRead(sensor_A0); // pobranie wartości z A0 wartosc_D0 = digitalRead(sensor_D0); // pobranie wartości z D0 int opady = map (wartosc_A0, 1023, 0, 0, 100); lcd.setCursor(0, 1); lcd.print(opady); lcd.print("% "); if (opady <= 30) { lcd.print("SUCHO "); } if (opady >= 31 and opady <= 50) { lcd.print("KROPI "); } if (opady >= 51 and opady <= 87) { lcd.print("LEJE "); } if (opady >= 87) { lcd.print("PIŹDŹI"); } // deszcz koniec } lcd.init(); lcd.backlight(); lcd.print(temperature); } sensors.request(); } } Cytuj Link do komentarza Share on other sites More sharing options...
Lukaszm Maj 4, 2017 Udostępnij Maj 4, 2017 Ekran miga bo zbyt często uaktualniasz napisy na nim. Rób to np. 2 razy na sekundę i nie będzie takiego efektu. Temperatury są wyświetlanie naprzemiennie - jak inaczej skoro masz tylko jedno wywołanie lcd.print(temperature); Cytuj Link do komentarza Share on other sites More sharing options...
_krzaku Maj 4, 2017 Autor tematu Udostępnij Maj 4, 2017 Pisząc, że ekran miga chodziło mi o to, że po wyświetleniu temperatury napisy znikają i nie ma nic wyświetlonego po czym znowu się pojawiają i tak w pętli. Odnośnie jednego wywołania to jak zrobić to dwa razy osobno dla każdego z odczytu? Przy prędkości dwa razy na sekundę ekran nawet nie zdąży wyświetlić niczego, już próbowałem. Cytuj Link do komentarza Share on other sites More sharing options...
Lukaszm Maj 4, 2017 Udostępnij Maj 4, 2017 Uporządkuj wcięcia, teraz ciężko się połapać. Co robi w loop ta linijka? lcd.init(); Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!