Skocz do zawartości

Wyświetlanie czasu przy pomocy pilota IR


Pomocna odpowiedź

Napisano

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

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

- 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

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?

  • 2 miesiące później...

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?

3 godziny temu, Treker napisał:

W jakim standardzie pracuje pilot, który teraz zakupiłeś?

RC6. Mniejsza wersja pilota, również RC6, sypie kodami aż miło. A ten większy ciągle tylko jednym.

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?

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