Skocz do zawartości

Niechciane cyferki na wyświetlaczu LCD 2x16 podczas robienia stacji pogodowej z czujnikiem DHT22 oraz ATTiny85.


BeeKeyPro

Pomocna odpowiedź

Witam. Podczas robienia stacji pogodowej z czujnikiem DHT22 oraz ATTiny85 na wyświetlaczu pojawiło się za dużo liczb.

GOPR1553.thumb.JPG.2df72772b0429397e0fd222c042a88b3.JPG

Ja bym chciał żeby pojawiły się same cyferki 26, 63 oraz znaki °C i %. Kod który pisałem i wgrałem:

#include "DHT.h"
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);

DHT dht;

byte znak_stopnia[8] = 
              {
                0b00111,
                0b00101,
                0b00111,
                0b00000,
                0b00000,
                0b00000,
                0b00000,
                0b00000
              };

int w;
int t;

void setup(){
  dht.setup(4);
  lcd.init();                      
  lcd.backlight();
  lcd.print("Temperatura");
  lcd.setCursor(0,1);
  lcd.print("Wilgotnosc");
  lcd.createChar(1, znak_stopnia);
  lcd.setCursor(14,0);
  lcd.write(1);
  lcd.print("C");
  lcd.setCursor(13,1);
  lcd.print("%");
}

void loop(){
  w = dht.getHumidity();
  t = dht.getTemperature();
  lcd.setCursor(12,0);
  lcd.print(t);
  lcd.setCursor(11,1);
  lcd.print(w);
}

Biblioteka którą użyłem do DHT to ta: https://github.com/jscrane/DHT?tab=readme-ov-file. Podłączenie jest dobre. Teraz ja proszę o pomoc w zasłonięciu tych dodatkowych cyferek żeby wyglądało to w ten sposób:

image.thumb.png.8d90afd87dd5bf7633e72821be9bed31.png

Z góry dziękuję za poświęcony czas!

Link do komentarza
Share on other sites

Chodzi chyba o to że kod pokazujący znaki *C i % wywołujesz tylko raz, a potem zasłaniasz je liczbami w void loop. Kod rysujący znaki powinien wywaływać się za każdym razem po wypisaniu liczb żeby zasłonić długie końcówki. Proponuję tak:

#include "DHT.h"
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);

DHT dht;

byte znak_stopnia[8] = 
              {
                0b00111,
                0b00101,
                0b00111,
                0b00000,
                0b00000,
                0b00000,
                0b00000,
                0b00000
              };

int w;
int t;

void setup(){
  dht.setup(4);
  lcd.init();                      
  lcd.backlight();
  lcd.print("Temperatura");
  lcd.setCursor(0,1);
  lcd.print("Wilgotnosc");
}

void loop(){
  w = dht.getHumidity();
  t = dht.getTemperature();
  lcd.setCursor(12,0);
  lcd.print(t);
  lcd.setCursor(11,1);
  lcd.print(w);
  lcd.createChar(1, znak_stopnia);
  lcd.setCursor(14,0);
  lcd.write(1);
  lcd.print("C");
  lcd.setCursor(13,1);
  lcd.print("%");
}

 

Link do komentarza
Share on other sites

A czemu je cały czas wyświetlasz? Pytanie kontrolne: jaki jest minimalny odstęp czasowy między dwoma kolejnymi odczytami z dht22? I co się stanue jeśli przestaniesz pchać dane do wyświetlacza? Upewniam Cię że nie zgaśnie.

Edytowano przez ethanak
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

20 minut temu, BeeKeyPro napisał:

efekt jest taki że cyferki migają mega szybko

54 minuty temu, BeeKeyPro napisał:
int w;
int t;

Funkcje `getHumidity()` i `getTemperature()` zwracają wartości float, nie int. Wartości po przecinku możesz później obciąć lub zaokrąglić.

Jak @ethanak napisał, nie musisz rysować za każdym taktem wartości:

17 minut temu, ethanak napisał:

jaki jest minimalny odstęp czasowy między dwoma kolejnymi odczytami z dht22

Odstęp czasowy sprawdzisz funkcją z biblioteki. Przykład masz w ReadMe.

Edytowano przez KatzePL
Link do komentarza
Share on other sites

Okej dodałem do kodu delay(dht.getMinimumSamplingPeriod());

#include "DHT.h"
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);

DHT dht;

byte znak_stopnia[8] = 
              {
                0b00111,
                0b00101,
                0b00111,
                0b00000,
                0b00000,
                0b00000,
                0b00000,
                0b00000
              };

int w;
int t;

void setup(){
  dht.setup(4);
  lcd.init();                      
  lcd.backlight();
  lcd.print("Temperatura");
  lcd.setCursor(0,1);
  lcd.print("Wilgotnosc");
}

void loop(){
  delay(dht.getMinimumSamplingPeriod());
  w = dht.getHumidity();
  t = dht.getTemperature();
  lcd.setCursor(12,0);
  lcd.print(t);
  lcd.setCursor(11,1);
  lcd.print(w);
  lcd.createChar(1, znak_stopnia);
  lcd.setCursor(14,0);
  lcd.write(1);
  lcd.print("C");
  lcd.setCursor(13,1);
  lcd.print("%");
}

I wygląda to tak:

GOPR1557.thumb.JPG.668469e30d3c7dfac9af80d3c29d80ad.JPG

ale jak się pozbyć tej 35 z lewej strony

 

Link do komentarza
Share on other sites

1 minutę temu, BeeKeyPro napisał:

ale jak się pozbyć tej 35 z lewej strony

Pomyśl... potrzebujesz na pewnej pozycji wyświetlić jakiś znak. Spacja jest białym znakiem 

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Jeju chłopaki, dziękuję wam bardzo! Tak wygląda finalny działający kod:

#include "DHT.h"
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);

DHT dht;

byte znak_stopnia[8] = 
              {
                0b00111,
                0b00101,
                0b00111,
                0b00000,
                0b00000,
                0b00000,
                0b00000,
                0b00000
              };

int w;
int t;

void setup(){
  dht.setup(4);
  lcd.init();                      
  lcd.backlight();
  lcd.print("Temperatura");
  lcd.setCursor(0,1);
  lcd.print("Wilgotnosc");
}

void loop(){
  delay(dht.getMinimumSamplingPeriod());
  w = dht.getHumidity();
  t = dht.getTemperature();
  lcd.setCursor(12,0);
  lcd.print(t);
  lcd.setCursor(11,1);
  lcd.print(w);
  lcd.createChar(1, znak_stopnia);
  lcd.setCursor(14,0);
  lcd.write(1);
  lcd.print("C");
  lcd.setCursor(13,1);
  lcd.print("%  ");
}

 

Link do komentarza
Share on other sites

3 minuty temu, BeeKeyPro napisał:

Tak wygląda finalny działający kod

Brawo, a teraz trudniejsze zadanie, chcesz obie wyświetlane wartości wyrównać do prawej strony tak aby znak % i °C zawsze zamykały wiersz. Spróbuj wyświetlić(choćby zasymulować) kiedy wartość temperatury będzie miała 9°C albo na przykład -1°C i aby nadal się to prawidłowo wyświetlało.

Link do komentarza
Share on other sites

55 minut temu, _LM_ napisał:

9°C albo na przykład -1°C i aby nadal się to prawidłowo wyświetlało.

O kurcza, zupełnie o tym zapomniałem! To będzie fajne wyzwanie, już wiem co będę robił jutro. 🙂 

Link do komentarza
Share on other sites

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.