Skocz do zawartości

Ciekawy zegar + temperatura


Pomocna odpowiedź

Witajcie.

Chciałbym się pochwalić drugim projektem ( mieszanina kilku gotowców do jednego ). Mianowicie Przyjemny Zegar połączony z datą oraz pokazaniem aktualnej temperatury.

Wiadomo, że w skład zestawu wchodzi Arduino UNO, zegar RTC DS3231 + 24c32 , Sonda-czujnik temperatury DS18B20 ( wodoodporny  - będzie na zewnątrz budynku 🙂 ) do tego wyświetlacz LCD 20x4 I2C , a przewodziki i płytka 🙂 

Kod jest jeszcze w trakcie poprawek. Mianowicie są błędy jeśli chodzi o pokazanie na LCD znaku "stopnia Celsjusza" . Kombinuje i na razie zostawiłem jak jest. Może ktoś ma inny pomysł ? 🙂 Chciałem z tego wszystkiego podpiąć pod RF czyli standardowy transmiter i receiver 433MHz, ale coś są kłopoty z tymi dwiema rzeczami. Niby nadaje, ale przy sprawdzaniu portu COM na odbiorniku to nic nie wyświetla. Nadajnik standardowy FS1000A i odbiornik do niego. Podłączone kabelki ( antenki ) 17cm. i za "grzybka" nie wiem co jest grane. A pomysłem było, aby nadawało mi temperaturę zdalnie  ( arduino Nano ) za pomocą sondy, do właśnie UNO i pokazywało to samo co jest na screenach. Jeśli ma ktokolwiek pomysł na poprawki, zmiany, to proszę śmiało pisać  🙂 z góry dzięki. 

Aha, jeszcze kod wrzucę 🙂

#include <Wire.h>  //WireLibrary comes with arduino
#include <LiquidCrystal_I2C.h> //i2c LCD Library 
#define DS3231_I2C_ADDRESS 0x68 //RTC Address
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is conntec to the Arduino digital pin 4
#define ONE_WIRE_BUS 4
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 20, 4);  // Set the LCD I2C address

//Degree symbol:
byte Degree[] = {
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
};
void setup()
{
//  lcd.createChar(0, byte degree);
  Wire.begin(); //initialise the TWI
  lcd.begin(20, 4);  //20 x 4 LCD (Change if required)

  for (int i = 0; i < 2; i++) //Flash LCD backlight 2 times on startup
  {
    lcd.backlight();
    delay(250);
  }
  lcd.backlight(); // finish with backlight on
  lcd.setCursor(0, 0); //Start at character 0 on line 0
  lcd.print("   Witaj Marku :)");
// Start serial communication for debugging purposes
Serial.begin(115200);     // initialize the Serial Monitor at a baud rate of 9600
// Start up the library
sensors.begin();        // initialize the DS18B20 temperature sensor:
}

void loop()
{
  displayTime(); //calls the display time function

  {
   sensors.requestTemperatures();            //zazadaj odczyt temperatury z czujnika
 // lcd.clear();                              //wyczysc ekran
  lcd.setCursor(0,3);                       //ustaw kursor w pozycji 0,0
  lcd.print("Temperatura: ");               //wyswietl "Temperatura: "
  lcd.print(sensors.getTempCByIndex(0));    //wyswietl wartosc z czujnika 0
  //lcd.print((char)0);                       //wyswietl znak stopnia
  lcd.print("C");         
  delay(50);  


  }
  delay(100); 
}


byte decToBcd(byte val)//used when sending time
{
  return ( (val / 10 * 16) + (val % 10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return ( (val / 16 * 10) + (val % 16) );
}

void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  // request seven bytes of data from DS3231 starting from register 00h
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}

void displayTime()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
                 &year);
  if (hour < 10)
  {
    lcd.setCursor(0, 1);
    lcd.print("0");
    lcd.setCursor(1, 1);
    lcd.print(hour , DEC);
  }
  if (hour > 9)
  {
    lcd.setCursor(0, 1);
    lcd.print(hour , DEC);
  }
  lcd.setCursor(2, 1);
  lcd.print(":");
  if (minute < 10)
  {
    lcd.setCursor(3, 1);
    lcd.print("0");
    lcd.setCursor(4, 1);
    lcd.print(minute , DEC);
  }
  if (minute > 9)
  {
    lcd.setCursor(3, 1);
    lcd.print(minute , DEC);
  }
  lcd.setCursor(5, 1);
  lcd.print(":");
  if (second < 10)
  {
    lcd.setCursor(6, 1);
    lcd.print("0");
    lcd.setCursor(7, 1);
    lcd.print(second, DEC);
  }
  if (second > 9)
  {
    lcd.setCursor(6, 1);
    lcd.print(second, DEC);
  }
  if (dayOfMonth < 10)
  {
    lcd.setCursor(9, 1);
    lcd.print("0");
    lcd.setCursor(10, 1);
    lcd.print(dayOfMonth, DEC);
    lcd.setCursor(11, 1);
    lcd.print("/");
  }
  if (dayOfMonth > 9)
  {
    lcd.setCursor(9, 1);
    lcd.print(dayOfMonth, DEC);
    lcd.setCursor(11, 1);
    lcd.print("/");
  }
  if (month < 10)
  {
    lcd.setCursor(12, 1);
    lcd.print("0");
    lcd.setCursor(13, 1);
    lcd.print(month, DEC);
    lcd.setCursor(14, 1);
    lcd.print("/");
  }
  if (month > 9)
  {
    lcd.setCursor(12, 1);
    lcd.print(month, DEC);
    lcd.setCursor(14, 1);
    lcd.print("/");
  }
  lcd.setCursor(15, 1);
  lcd.print(year, DEC);

  switch (dayOfWeek) {
    case 1:
      lcd.setCursor(0, 2);
      lcd.print("Dzis Poniedzialek");
      break;
    case 2:
      lcd.setCursor(0, 2);
      lcd.print("Dzis jest Wtorek");
      break;
    case 3:
      lcd.setCursor(0, 2);
      lcd.print("Dzis jest Sroda");
      break;
    case 4:
      lcd.setCursor(0, 2);
      lcd.print("Dzis jest Czwartek");
      break;
    case 5:
      lcd.setCursor(0, 2);
      lcd.print("Dzis jest Piatek");
      break;
    case 6:
      lcd.setCursor(0, 2);
      lcd.print("Dzis jest Sobota");
      break;
    case 7:
      lcd.setCursor(0, 2);
      lcd.print("Dzis jest Niedziela");
      break;
  }


}

 

IMG_20220812_225851.jpgIMG_20220812_225858.jpgIMG_20220812_225959.jpg

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

W ramach rozbudowania projektu możesz jeszcze pokusić się o dodanie czujnika wilgotności. Jednak trzeba pamiętać, że popularne tanie czujniki wilgotności raczej nie są zbyt dokładne - to bardziej w kategoriach wprawi progrmaistycznej.

Jeśli chodzi o własny znak dla "stopni", to zamień aktualną linię:

lcd.createChar(0, byte degree);

Na:

lcd.createChar(0, Degree);

Daj znać, czy pomogło 🙂

Link do komentarza
Share on other sites

Dzięki za informacje. Czujnik wilgotności ( a raczej wilgotność ), nie jest mi potrzebny. Tylko temperatura. Gdzieś TU jest błąd ( screen ) i nie pokazuje "stopnia" . 

Chciałem Wysłać informację z czujnika temperatury przez nadajnik FS1000A, no ale jakoś ani nie nadaje jakiegokolwiek komunikatu, ani nie odbiera ( transmiter i receiver ). Zakupiłem więc NRF24L01. Czekam na dostawę. Oczywiście chciałbym aby mi wyświetlało wszystko to , co jest na wyświetlaczu ( pierwszy post ). Może ktoś pomoże z linijką ?

Bez tytułu.jpg

Link do komentarza
Share on other sites

W kodzie, który wklejałeś pierwotnie było (poprawnie):

//Degree symbol:

W tym co widać na Twoim zrzucie ekranu, linia ta jest niepotrzebnie od komentowana. To zwykły komentarz, nie ma nic wspólnego z działaniem programy. Stad bierze się ten błąd - musisz to zakomentować lub usunąć.

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

Wpadłem na pomysł włączenia i wyłączenia LCD na określony czas ( jak to było w przypadku "przypominacza". Program robi to co powinien ale zauważyłem defekt na wyświetlaczu. Nie odlicza czasu jeśli chodzi o zliczanie sekund tylko stoi w miejscu, jeśli LCD jest podświetlony. Zgasza się i po 5ciu sekundach się spowrotem włącza, czas oczywiście jest dalej. W czym tkwi problem ? Dodane linijki są skomentowane ( na samym dole ). Tu leży gdzieś usterka i dlatego na razie nie używam NoBacklight

#include <Wire.h>  //WireLibrary comes with arduino
#include <LiquidCrystal_I2C.h> //i2c LCD Library 
#define DS3231_I2C_ADDRESS 0x68 //RTC Address
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is conntec to the Arduino digital pin 4
#define ONE_WIRE_BUS 4
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 20, 4);  // Set the LCD I2C address

byte Degree[] = {
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
};
void setup()
{
lcd.createChar(0, Degree);
  Wire.begin(); //initialise the TWI
  lcd.begin(20, 4);  //20 x 4 LCD (Change if required)

  for (int i = 0; i < 2; i++) //Flash LCD backlight 2 times on startup
  {
    lcd.backlight();
    delay(250);
  }
  lcd.backlight(); // finish with backlight on
  lcd.setCursor(0, 0); //Start at character 0 on line 0
  lcd.print("....WELCOME HOME....");
// Start serial communication for debugging purposes
Serial.begin(115200);     // initialize the Serial Monitor at a baud rate of 9600
// Start up the library
sensors.begin();        // initialize the DS18B20 temperature sensor:
}

void loop()
{
  displayTime(); //calls the display time function

  {
   sensors.requestTemperatures();            //zazadaj odczyt temperatury z czujnika
  lcd.setCursor(0,3);                       //ustaw kursor w pozycji 0,0
  lcd.print("Temperatura: ");               //wyswietl "Temperatura: "
  lcd.print(sensors.getTempCByIndex(0));    //wyswietl wartosc z czujnika 0
  lcd.print((char)0);                       //wyswietl znak stopnia
  lcd.print("C");         
  delay(50);  


  }
  delay(100); 
}



byte decToBcd(byte val)//used when sending time
{
  return ( (val / 10 * 16) + (val % 10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return ( (val / 16 * 10) + (val % 16) );
}

void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  // request seven bytes of data from DS3231 starting from register 00h
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}

void displayTime()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
                 &year);
  if (hour < 10)
  {
    lcd.setCursor(0, 1);
    lcd.print("0");
    lcd.setCursor(1, 1);
    lcd.print(hour , DEC);
  }
  if (hour > 9)
  {
    lcd.setCursor(0, 1);
    lcd.print(hour , DEC);
  }
  lcd.setCursor(2, 1);
  lcd.print(":");
  if (minute < 10)
  {
    lcd.setCursor(3, 1);
    lcd.print("0");
    lcd.setCursor(4, 1);
    lcd.print(minute , DEC);
  }
  if (minute > 9)
  {
    lcd.setCursor(3, 1);
    lcd.print(minute , DEC);
  }
  lcd.setCursor(5, 1);
  lcd.print(":");
  if (second < 10)
  {
    lcd.setCursor(6, 1);
    lcd.print("0");
    lcd.setCursor(7, 1);
    lcd.print(second, DEC);
  }
  if (second > 9)
  {
    lcd.setCursor(6, 1);
    lcd.print(second, DEC);
  }
  if (dayOfMonth < 10)
  {
    lcd.setCursor(9, 1);
    lcd.print("0");
    lcd.setCursor(10, 1);
    lcd.print(dayOfMonth, DEC);
    lcd.setCursor(11, 1);
    lcd.print("/");
  }
  if (dayOfMonth > 9)
  {
    lcd.setCursor(9, 1);
    lcd.print(dayOfMonth, DEC);
    lcd.setCursor(11, 1);
    lcd.print("/");
  }
  if (month < 10)
  {
    lcd.setCursor(12, 1);
    lcd.print("0");
    lcd.setCursor(13, 1);
    lcd.print(month, DEC);
    lcd.setCursor(14, 1);
    lcd.print("/");
  }
  if (month > 9)
  {
    lcd.setCursor(12, 1);
    lcd.print(month, DEC);
    lcd.setCursor(14, 1);
    lcd.print("/");
  }
  lcd.setCursor(15, 1);
  lcd.print(year, DEC);

  switch (dayOfWeek) {
    case 1:
      lcd.setCursor(0, 2);
      lcd.print("Dzis Poniedzialek");
      break;
    case 2:
      lcd.setCursor(0, 2);
      lcd.print("Dzis jest Wtorek");
      break;
    case 3:
      lcd.setCursor(0, 2);
      lcd.print("Dzis jest Sroda");
      break;
    case 4:
      lcd.setCursor(0, 2);
      lcd.print("Dzis jest Czwartek");
      break;
    case 5:
      lcd.setCursor(0, 2);
      lcd.print("Dzis jest Piatek");
      break;
    case 6:
      lcd.setCursor(0, 2);
      lcd.print("Dzis jest Sobota");
      break;
    case 7:
      lcd.setCursor(0, 2);
      lcd.print("Dzis jest Niedziela");
      break;
  }
//lcd.noBacklight(); // brak wyświetlacza
//  delay(5000); // 60 sekund, jedna minuta
//lcd.backlight(); // włączenie wyświetlacza
//delay(5000);
}

 

 

Link do komentarza
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!

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

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.