Skocz do zawartości

Wyświetlanie czasu przy pomocy pilota IR


frankmartin

Pomocna odpowiedź

Witam, 

od kilku dni próbuję zrozumieć dlaczego nie wyświetlany tekst (godzina, temperatura i inne) nie odświeża się tak samo jak przy zwykłym lcd print. 
Chodzi mi o to, że chcę używać pilota do zmiany wyświetlanych treści. I owszem zawartość się zmienia, ale np. odmierzany czas ma "zamrożone" sekundy. Czy można to jakoś poprawić? Podobnie ma się rzecz z wyświetlaną temperaturą. 

#include <SoftwareSerial.h>
#include <IRremote.h>
#include <DS3231.h>
#include <Adafruit_BMP280.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>

Adafruit_BMP280 bmp280;
DS3231  rtc(SDA, SCL);
Time t;
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht11(8,DHT11);

const byte IR_RECEIVE_PIN = 10;
const int hot = 25.00;

char cieplo[14]; 
char cisnienie[15];
char wysokosc[14];

//remote buttons
#define on_off 12
#define b_up 18
#define b_down 19
#define b_next 33
#define b_prev 32
#define b__up 30
#define b__down 31
#define b_start 13

void setup() {
  Serial.begin(9600);
  
  //lcd.begin(); 
  lcd.init();
  //rtc begin
  rtc.begin();
  //rtc settings
    //rtc.setDOW(7);
    //rtc.setTime(19,36,0);
    //rtc.setDate(23,10,2022);
  //start odbiornika IR
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
  //check bmp280
  if (!bmp280.begin(0x76)) //w nawiasie podajemy nasz adres I2C tutaj wpisałem 0x76
  {  // sprawdzamy czy czujnik odpowiada jesli nie wyświetlamy komunikat o błędzie
    Serial.println("Nie znaleziono czujnika - sprawdź połączenie!");
    while (1);
  }
  
}

void loop() {
  //rtc
  Serial.print(rtc.getTimeStr(2));
  Serial.print(" - ");
  Serial.println(rtc.getDateStr());
  Serial.println(rtc.getDOWStr(1));
  delay(1000);
  //dht11
  float hum = dht11.readHumidity();
  float temperature_ = dht11.readTemperature();
  Serial.println("Temperatura:");
  Serial.println(temperature_);
  Serial.println("Wilgotnosc:");
  Serial.println(hum);
  //bmp280
  float temperature = bmp280.readTemperature();  // get temperature
  float pressure    = bmp280.readPressure();     // get pressure
  float altitude_   = bmp280.readAltitude(1013.25);
  sprintf(cieplo, "%d.%02u%cC  ", (int)temperature, (int)(temperature * 100)%100, 223);
  sprintf(cisnienie, "%u.%02u hPa ", (int)(pressure/100), (int)((uint32_t)pressure % 100));
  //czy cieplo?
  if(temperature >= hot){
    pinMode(7,OUTPUT);
    digitalWrite(7,HIGH);
  }
  else {
    pinMode(7,OUTPUT);
    digitalWrite(7,LOW);
  }
  //IR
  if (IrReceiver.decode())
   {
      Serial.println(IrReceiver.decodedIRData.command);
       switch(IrReceiver.decodedIRData.command){
      case 12:
        if(digitalRead(6) == LOW){
          pinMode(6,OUTPUT);
          digitalWrite(6,HIGH);
          lcd.backlight();
        }
        else {
           digitalWrite(6,LOW);
           lcd.noBacklight();
           lcd.clear();
        }
       break;
       case 13:
        lcd.backlight();
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print(rtc.getTimeStr(FORMAT_SHORT));
        lcd.setCursor(6,0);
        lcd.print("  ");
        lcd.setCursor(8,0);
        lcd.print(rtc.getDateStr(FORMAT_SHORT));
        lcd.setCursor(0, 1);
        lcd.print(rtc.getDOWStr());
        lcd.setCursor(8,1);
        lcd.print(cieplo);
      break;
      case 18:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(altitude_);
      lcd.setCursor(0, 1);
      lcd.print(hum);
      break;
      case 19:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(cisnienie);
      lcd.setCursor(0, 1);
      lcd.print(rtc.getDOWStr());
      break;
     }
      IrReceiver.resume();
   }
    
}

 

  • Lubię! 1
Link do komentarza
Share on other sites

Druga sprawa to problem ciągłego wyświetlania co przy dłuższym kodzie może powodować widoczny efekt "stroboskopu" danych...warto do każdego case dorzucić warunek w którym będziesz sprawdzał czy nowa godzina jest inna od starej...

if (godzina != kopia_godzina) {
  //wyświetl dane 
  kopia_godzina = godzina;
 }

W ten sposób wyświetlasz tylko wtedy kiedy faktycznie coś się zmieniło...

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

- program nie jest sformatowany, po sformatowaniu widać że program jest napisany poprawnie. 

- wg mnie może być tylko problem z linia IrReceiver.resume();

- chyba powinna być poza warunkiem if (IrReceiver.decode()) {

 

Capture-1.jpg

  • Lubię! 1
Link do komentarza
Share on other sites

Ciekawa sprawa.  Przez około 30 minut treści wyświetlają się prawidłowo czyli odmierza czas, sprawdza temperaturę. Po tym czasie obraz na wyświetlaczu zamarza. Jedna z diod włącza się przy temperaturze powyżej 25 stopni i przy wymuszeniu (przyłożenie palca do modułu BMP280) temperatura rośnie i dioda zapala się. Co oznacza, że program działa. Ponadto przy każdej próbie uruchomienia monitora portu szeregowego wyświetlacz wyłącza się. Co może być nie tak?

Link do komentarza
Share on other sites

Witam po dłuższej przerwie. Pierwotny projekt rozwinął się w troszkę innym kierunku, ale sens zachowany. Zakupiłem kolejnego pilota, którego chciałem zaadoptować do projektu. Niestety trafiłem na wysoką ścianę. Przy próbie odczytania kodów przycisków za każdym razem dostaję kod 64. Czyżby uszkodzony pilot?

Link do komentarza
Share on other sites

Jeśli oba działają w tym samym standardzie i jeden działa poprawnie, a drugi nie to podejrzana sprawa. To jest zwykły, prosty pilot, bez żadnych udziwnień i ustawień? Masz może analizator stanów logicznych?

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.