Skocz do zawartości

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


Pomocna odpowiedź

Napisano

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!

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

 

(edytowany)

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
(edytowany)
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

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

 

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

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

 

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.

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

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