Arduino Polska Forum

Pełna wersja: DS3231 i DS18B20 Jak dokończyć dodać menu do ustawień z klawiatury
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Jestem od kilku dni użytkownikiem arduino. Czytam i staram się coś nauczyć ale moja wiedza w C i jak działają niektóre moduły są bliskie zera. Potrzebuje pomocy. Chciałem dodać ustawianie zegara i temperatury z np. klawiszy lub encodera ale przerosło mnie znacznie. Kod jest pobrany z różnych przykładów. Może ktoś pomoże? Dosiego Roku 2018.
To co mam teraz:
Kod:
#include <DS18B20.h>
#include <Wire.h>
#include <OneWire.h>
#include <LiquidCrystal_I2C.h>
#include <DS3231.h>
DS3231 clock;
#define TEMPERATURE_PRECISION 12  // rozdzielczosc czujnika
#include <EEPROM.h>
OneWire onewire(2); //ustawia pin podłączenia DS18B20
DS18B20 sensors(&onewire);;
LiquidCrystal_I2C lcd(0x27, 20, 4);  // Ustawienie adresu ukladu na 0x27
#define DS3231_I2C_ADDRESS 0x68
byte stopnie[8] = { //konfigurajca znaku stopnie
0b00110,
0b01001,
0b01001,
0b00110,
0b00000,
0b00000,
0b00000,
0b00000
};
// 0x28, 0x60, 0xE0, 0xBE, 0x8, 0x0, 0x0, 0xA6
// 0x28, 0xD2, 0xD7, 0xE2, 0x8, 0x0, 0x0, 0xD0
byte address2[8] = {0x28, 0x60, 0xE0, 0xBE, 0x8, 0x0, 0x0, 0xA6};
byte address1[8] = {0x28, 0xD2, 0xD7, 0xE2, 0x08, 0x00, 0x00, 0xD0}; // wpisany adres DS18B20
// Konwersja liczby dziesiętnej do postaci binarnej
byte decToBcd(byte val){
  return( (val/10*16) + (val%10) );
}
// Konwersja liczby binarnej do postaci dziesiętnej
byte bcdToDec(byte val){
  return( (val/16*10) + (val%16) );
}

void setup(){
  Wire.begin();
// Ustawienie czasu w momencie inicjacji układu: 6- piątek, 7-sobota, 1-niedziela
// DS3231 seconds, minutes, hours, day, date, month, year
// setDS3231time(03,26,23,6,29,12,17); //ustawienie czasu i daty na DS3231 (sekundy, minuty, godzina, nazwa dnia, dzień, miesiąć,)
// Inicjacja czujnika
  sensors.begin();
  sensors.request(address1);
  sensors.request(address2);
  lcd.begin(20,4);   
  lcd.backlight(); // załączenie podświetlenia
 lcd.setCursor(0,0);
 lcd.print("Dzien:");
  lcd.setCursor(0,1);
 lcd.print("Data :");
  lcd.setCursor(0,2);
 lcd.print("Czas :");
//  lcd.setCursor(0,3);
// lcd.print("Temp.:");
lcd.createChar(0, stopnie);
  delay(200);  
}
/*
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)

{
  // ustawienie czasu i daty w DS3231
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0);                    // określa, że następna wartość ma trafić do rejestru sekund
  Wire.write(decToBcd(second));     // ustawienie sekund
  Wire.write(decToBcd(minute));     // ustawienie minuty
  Wire.write(decToBcd(hour));       // ustawienie godziny
  Wire.write(decToBcd(dayOfWeek));  // ustawienie dnia tygodnia (1=niedziela, 7=sobota itd.)
  Wire.write(decToBcd(dayOfMonth)); // ustawienie dnia (1-31)
  Wire.write(decToBcd(month));      // ustawienie miesiąca
  Wire.write(decToBcd(year));       // ustawienie roku (0-99)
  Wire.endTransmission();
}
*/
void readDS3231time(
byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // ustawia rejestr DS3231 na 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  // żąda 7 bajtów danych od modułu DS3231 począwszy od rejestru 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;
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  &year);
// Przekazanie danych do wyświetlenie LCD
// CZAS
// Godziny
// podczas wyświetlania konwertuje wartość zmiennej typu bitowego do postaci dziesiętnej
// Serial.print(hour, DEC);
  if (hour<10) {
    lcd.setCursor(7,2);
    lcd.print("0");
    lcd.print(hour, DEC);
  } else {
    lcd.setCursor(7,2);
    lcd.print(hour, DEC);
    }
  lcd.print(":");
  // Minuty
  if (minute<10) {
  //  Serial.print("0");
    lcd.setCursor(10,2);
    lcd.print("0");
    lcd.print(minute, DEC);
  } else {
    lcd.setCursor(10,2);
    lcd.print(minute, DEC);
    }
  lcd.print(":");
  //Sekundy
  if (second<10){
  lcd.setCursor(13,2);
  lcd.print("0");
  lcd.print(second, DEC);
  } else {
    lcd.setCursor(13,2);
    lcd.print(second, DEC);
 //   lcd.print("'");
    }
// DATA
  lcd.setCursor(7,1);
  if (dayOfMonth<10){
    lcd.setCursor(7,1);
    lcd.print("0");
    lcd.print(dayOfMonth, DEC);
  } else {
    lcd.setCursor(7,1);
    lcd.print(dayOfMonth, DEC);
    }
    lcd.print(".");
  // Miesiąc
  if (month<10){
    lcd.setCursor(10,1);
    lcd.print("0");
    lcd.print(month, DEC);
  } else {
    lcd.setCursor(10,1);
    lcd.print(month, DEC);
    }
    lcd.print(".");
   //Rok
    lcd.print("20");
    if (year<10){
    lcd.setCursor(15,1);
    lcd.print("0");
    lcd.print(year, DEC);
  } else {
    lcd.setCursor(15,1);
    lcd.print(year, DEC);
    }
  lcd.setCursor(7,0);
  switch(dayOfWeek){
  case 1:
    lcd.print("Niedziela   ");
    break;
  case 2:
    lcd.print("Poniedzialek");
    break;
  case 3:
    lcd.print("Wtorek      ");
    break;
  case 4:
    lcd.print("Sroda       ");
    break;
  case 5:
    lcd.print("Czwartek    ");
    break;
  case 6:
    lcd.print("Piatek      ");
    break;
  case 7:
    lcd.print("Sobota      ");
    break;
  }
}
void loop()
{ if (sensors.available())
  {
    float temperature = sensors.readTemperature(address1);
    float temperature2 = sensors.readTemperature(address2);
    sensors.request(address1);
    sensors.request(address2);
 byte temperatura2;   
  displayTime(); // wyświetlanie czasu rzeczywistego
lcd.setCursor(0,3);
lcd.print("CWU:");
lcd.print((temperature),1);
lcd.print((char)0);
lcd.print("C ");
lcd.setCursor(11,3);
lcd.print("CO:");
lcd.print((temperature2),1);
lcd.print((char)0);
lcd.print("C");
// if (sensors.readTemperature(address2)>55){
// lcd.noBacklight();
// delay(1000);
// lcd.backlight();
// }
// mruga : po godzinie
 delay(500);
 lcd.setCursor(9,2);
 lcd.print(" ");
 delay(500);
 }}
O ho, ho... Na dzień dobry z Arduino zastosowałeś 5 bibliotek...
Czy aby przerobiłeś podstawy typu mruganie diodą, obsługa przycisków i łączenie prostych kodów?
Nie to, że nie chcę Ci pomóc ale na tym etapie podanego przez Ciebie kodu to już trzeba coś umieć aby można było rozmawiać.
Tak to jest bezcelowe. Proszę Cię zacznij od podstaw a będzie dużo łatwiej.

Pozdr.
ANT
(31-12-2017, 18:18)ANT napisał(a): [ -> ]O ho, ho... Na dzień dobry z Arduino zastosowałeś 5 bibliotek...
Czy aby przerobiłeś podstawy typu mruganie diodą, obsługa przycisków i łączenie prostych kodów?
Nie to, że nie chcę Ci pomóc ale na tym etapie podanego przez Ciebie kodu to już trzeba coś umieć aby można było rozmawiać.
Tak to jest bezcelowe. Proszę Cię zacznij od podstaw a będzie dużo łatwiej.

Pozdr.
ANT
Tak przerobiłem. Wiesz jak to jest jak brak kogoś kto pomoże fizycznie. Czytanie jakiś poradników bez pomocnej dłoni mija się z celem jak widać na moim przykładzie. To co zamieściłem to sklejka kilku gotowców i metodą prób i błędów dojście do działającego zegarka i termometru. No i efekt pozostałości po ZX80 (mało kto pamięta taki komputerek) i BESICu.
Wiem że idę po bandzie i proszę o dużo ale mam nadzieje że znajdzie się dobra dusz która ma taki projekt i pokaże mi jak to rozwiązał. Pomógł mi dużo Włoch Giosimo ale bariera językowa zrobiła swoje.
DO SIEGO ROKU 2018 Wszystkim. Pozdrawiam
Może ktoś pomoże jak wprowadzić te zmienne do DS3231 z przykładu Jw. 

{
 if(digitalRead(OK)==LOW) // gdy wcisniemy przycisk
 {
   t.hour ++;
   delay(100);
   if(t.hour > 23)
   {
   t.hour=0;
   } 
 xxxxxxxx........( t.rok, t.miesiac, t.dzien, t.nazwadnia, t.hour, t.min, t.second);     // ?????????????
 }

 if(digitalRead(DOWN)==LOW) // gdy wcisniemy przycisk
 {
   t.min ++;
   delay(100);
   if(t.min > 59)
   {
   t.min=0;
   } 
  xxxxxx......(t.hour, t.min, t.second);     
 }

 if(digitalRead(UP)==LOW) // gdy wcisniemy przycisk
 {
   t.sec ++;
   delay(100);
   if(t.second > 59)
   {
   t.sec=0;
   } 
 xxxxxx......(t.hour, t.min, t.second);     
 }