Skocz do zawartości

Pomocna odpowiedź

Napisano

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();
 }
}

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);

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.

Uporządkuj wcięcia, teraz ciężko się połapać.

Co robi w loop ta linijka?

lcd.init();

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...