Skocz do zawartości
plus122

Arduino problem z lcd 1602 I2C źe wyświetla

Pomocna odpowiedź

Napisano (edytowany)
//TEN DZIAŁA POPRAWNIE


#include <Wire.h>                                     
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
int wartoscAnalog=0;
byte wartoscZmapowana=0;
char info[96];

LiquidCrystal_I2C lcd(0x27,16,2); 
void setup() {
lcd.init();  
lcd.backlight();
lcd.setCursor(0,0);

}

void loop() {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(wartoscZmapowana);
  wartoscAnalog=analogRead(A0);
  wartoscZmapowana=map(wartoscAnalog, 0, 1023, 0, 100);
      
  delay(1000);
}
// TEN ZLE WYSWIETLA


#include <Wire.h>                                     
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
#include "DHT.h"
#define DHTTYPE DHT22
#define DHTPIN 6
#define WIATRAK 7

int wartoscAnalog=0;
byte wartoscZmapowana=1;
char info[96];
int buzzer=11;

LiquidCrystal_I2C lcd(0x27,16,2); 
DHT dht(DHTPIN, DHTTYPE);


  void setup() 
    {                                                             
      dht.begin();                                                            //START DHT
      lcd.init();       
      lcd.backlight();
      lcd.setCursor(0,0);
      pinMode(WIATRAK,OUTPUT);
      
     }


  void loop() 
  {

      float h = dht.readHumidity();
      float t = dht.readTemperature();
      float f = dht.readTemperature(true);
                                                  
      if (isnan(h) || isnan(t) || isnan(f)) 
        {            
          lcd.print(F("Failed to read from DHT sensor!"));
          return;
        }
        
      float hif = dht.computeHeatIndex(f, h);
      float hic = dht.computeHeatIndex(t, h, false);
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print(wartoscZmapowana);

      wartoscAnalog=analogRead(A0);
      wartoscZmapowana=map(wartoscAnalog, 0, 1023, 0, 100);
     
      if(t>35)
    {    
      wyswietlanie();       
      BuzzerWiatrak();                      
     }

    if(wartoscZmapowana==0)
      {
      lcd.clear();
      lcd.setCursor(4,0);
      lcd.print("alarm");
      }

    if(wartoscZmapowana>20)
      {
        wyswietlanie();
        BuzzerWiatrak();
      }
    else 
      {
        digitalWrite(WIATRAK, LOW);      
      }
    //delay(1000);

    
  }
  
  void wyswietlanie()
    {  
      lcd.clear();
      lcd.setCursor(4,0);
      lcd.print("Pozar");      
    }

  void BuzzerWiatrak()
     {
       digitalWrite(WIATRAK, HIGH);   
       tone(buzzer,450);         
       delay(500);
       noTone(buzzer);
       delay(500);
     }

Witam, mam problem, mianowicie mam projekcik(lcd, czujka dymu, czujka temperatury, buzzer i wiatrak). Arduino nie wyświetla poprawnie teksu( nie wyswietla wszystkiego).W momencie wykonania warunku (if) gdy np temperatura jest za wysoka wszystko działa(wyświetla prawidłowo) Natomiast gdy wgram prosty program(tylko czujka dymu i lcd) wszystko wyświetla prawidłowo. Dodam że wyświetlacz to LCD 1602 pod magistrale I2C a arduino uno klon. Macie jakieś pomysły jak to naprawic? W załączniku prześle jedno zdjecie z niewłaściwym wyświetleniem, a drugie z poprawnym(przy maly programie). Dzieki i pozdrawiam 

91429686_209052940353390_9157314224366551040_n.jpg

91793309_828406354335420_8350759438222622720_n.jpg

Edytowano przez plus122
wstawienie kodu

Udostępnij ten post


Link to post
Share on other sites

No to jeśli istnieje program w którym wyświetlacz działa poprawnie, to znaczy, że sam hardware jest OK a problem leży w tym drugim kodzie. Może pokaż jeden i drugi program (za pomocą tagu "Wstaw kod") i daj nam szansę oceny Twoich wysiłków i w ogóle jakiejkolwiek pomocy bez konieczności czytania w Twoich myślach. Czy przed wysłaniem swojego postu czytałeś obowiązujące tu zasady zakładania wątków z prośbami o pomoc?

Udostępnij ten post


Link to post
Share on other sites

Ja tak z ciekawości: dlaczego najpierw wyświetlasz wartość zmiennej "wartoscZmapowana" a potem dopiero ją obliczasz?

Co się stanie jak odkomentujesz ten delay(1000) na końcu loop?

Udostępnij ten post


Link to post
Share on other sites
29 minut temu, ethanak napisał:

Ja tak z ciekawości: dlaczego najpierw wyświetlasz wartość zmiennej "wartoscZmapowana" a potem dopiero ją obliczasz?

Co się stanie jak odkomentujesz ten delay(1000) na końcu loop?

Delay wprowadzał źle działanie if z czujka temperatury. A ta wartośćzmapowana nie ma znaczenia bo działa dobrze a wcześniej była niżej 😛

Udostępnij ten post


Link to post
Share on other sites

Zapytałem:

34 minuty temu, ethanak napisał:

Co się stanie jak odkomentujesz ten delay(1000) na końcu loop?

Czy ma to wpływ na wyświetlanie? Daruj sobie na razie czujniki.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

#include <SoftwareSerial.h>  po co to??

 

Po prostu ardunio nie wyrabia dlatego "krzaki"

Edytowano przez Jarewa

Udostępnij ten post


Link to post
Share on other sites
9 godzin temu, ethanak napisał:

Zapytałem:

Czy ma to wpływ na wyświetlanie? Daruj sobie na razie czujniki.

oo faktycznie odkomentowanie delay "naprawiło wyświetlacz"  :D. Ale czemu if z czujka dymu i wiatrakiem działa wtedy impulsowo? Działa i sie konczy i znowu działa. I możecie polecic jakiś tani moduł gsm do arduino(najlepiej zeby nie byl mi potrzebny konwerter stanow logicznych i aby tylko SMS dochodzil)

      if(t>35)
    {    
      wyswietlanie();       
      BuzzerWiatrak();                      
     }

 

Oszukałem troche bezwładność arduino i ludzka i przy delay(200) wiatrak nie zdaży się zatrzymac(ale słychać chwilowe zaniki zasilania), buzzer ma w miare jednolity dzwiek i wyswietlacz dobrze działa :D. A ktoś może mi powiedzieć dlaczego delay wprowadza takie coś?  I prosiłbym bym o rade z tanim modułem GSM  aby tylko SMS dochodziły

Udostępnij ten post


Link to post
Share on other sites
8 minut temu, plus122 napisał:

A ktoś może mi powiedzieć dlaczego delay wprowadza takie coś?

Jakbyś dokładnie poczytał co w tym kodzie nawyczyniałeś to byś wiedział.

Po prostu Twój program robi coś takiego:

  1. robi jakieś odczyty (co trwa jakiś ułamek sekundy)
  2. czyści wyświetlacz (co trwa jakiś tam ułamek sekundy)
  3. wyświetla coś na wyświetlaczu (co też trwa)
  4. sprawdza, czy coś trzeba zrobić; dochodzi do wniosku że nie (co trwa bardzo krótko) , w związku z tym przechodzi  do punktu 1

Wskutek tego tekst jest widoczny na wyświetlaczu tylko przez krótką chwilę, a z uwagi na bezwładność wzroku masz wrażenie, że obraz jest nieprawidłowy.

Czy da się tego uniknąć nie wprowadzając delaya?

Oczywiście - wystarczy że będziesz operował wyświetlaczem tylko wtedy, gdy wyświetlana wartość się zmieniła.

 

 

 

Udostępnij ten post


Link to post
Share on other sites
10 minut temu, ethanak napisał:

Jakbyś dokładnie poczytał co w tym kodzie nawyczyniałeś to byś wiedział.

Po prostu Twój program robi coś takiego:

  1. robi jakieś odczyty (co trwa jakiś ułamek sekundy)
  2. czyści wyświetlacz (co trwa jakiś tam ułamek sekundy)
  3. wyświetla coś na wyświetlaczu (co też trwa)
  4. sprawdza, czy coś trzeba zrobić; dochodzi do wniosku że nie (co trwa bardzo krótko) , w związku z tym przechodzi  do punktu 1

Wskutek tego tekst jest widoczny na wyświetlaczu tylko przez krótką chwilę, a z uwagi na bezwładność wzroku masz wrażenie, że obraz jest nieprawidłowy.

Czy da się tego uniknąć nie wprowadzając delaya?

Oczywiście - wystarczy że będziesz operował wyświetlaczem tylko wtedy, gdy wyświetlana wartość się zmieniła.

 

 

 

Czyli jak? Jak operować wyswietlaczem gdy wartosc sie zmienia? Bo w sumie chcialem napis statyczny umiescic. Początkowo chciałem to umieścić w void setup() ale nie działało.

Udostępnij ten post


Link to post
Share on other sites
1 godzinę temu, plus122 napisał:

Początkowo chciałem to umieścić w void setup() ale nie działało.

Raczej po prostu zrobiłeś to źle. Jeśli chcesz mieć tekst na ekranie stały przez całe działanie programu to robisz sobie bufor - tablice char, o ilości znaków na cały ekran +1 i tylko na niej "piszesz", a raz na sekundę (poczytaj tu w kursie o millis(), zobacz przykład w Arduino blinkwithoutdelay) wysyłasz taką tablicę na drugą linię LCD, to nadpisuje całą linię LCD, ale tylko tą drugą, napis na pierwszej pozostaje bez zmian. Jeśli w którymkolwiek momencie użyjesz lcd.clear(); to cały ekran znika i musisz wszystko odrysować od nowa. Oczywiście możesz sobie ekran podzielić na 4 części, ale nie można po prostu wrzucać tam zmiennej, bo ta raz może być 133, raz -2 i zostawałby "duchy" poprzednich wartości, np. z tych dwóch by zostało -23. Tak można zrobić to w miarę szybko, operacje na tablicy są znacznie szybsze niż wysłanie na ekran 16 spacji by wyczyścić linię, a potem tekst właściwy, a najwolniejsze jest .clear(). Możesz zrobić tak, że natychmiast po wysłaniu ekranu tablicę zapełniasz spacjami, a potem uzupełniasz danymi w odpowiednie miejsca, wysyłasz  i powtarzasz.

Kolejnym krokiem jest mieć w pamięci kilka takich całych ekranów (każda linia to 16B+1 na zero kończące napis) i je sobie zmieniać w zależności od sytuacji, np. migające menu nastaw na zmianę z ekranem głównym.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
7 godzin temu, plus122 napisał:

Jak operować wyswietlaczem gdy wartosc sie zmienia?

Po prostu nie operować, jeśli się nie zmienia 🙂

Przykład:


// globalna zmienna
int poprzedniaWartosc = -1; // najlepiej jakaś niemożliwa wartość, np. -100 dla termometru pokojowego

// w loop:

int wyswietlanaWartosc = cośtam();
if (wyswietlanaWartosc != poprzedniaWartosc) {
  wyczysc_wyswietlacz_i_wyswietl_wartosc();
  poprzedniaWartosc = wyswietlanaWartosc;
}

 

Udostępnij ten post


Link to post
Share on other sites

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!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...