Skocz do zawartości

Dwa czujniki temperatury DS18B20


_krzaku

Pomocna odpowiedź

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();
 }
}
Link do komentarza
Share on other sites

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);
Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

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

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.