Arduino Polska Forum

Pełna wersja: Zegar Ardduino Akademia Nettiego
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Kod pochodzi z   https://starter-kit.nettigo.pl/2018/01/zegar-z-arduino/
Zegar działa, ale nie potrafię ustawić w nim czasu. Sposoby sugerowane na stronie nie wywołują reakcji poza mrugnięciem diody na płytce. Proszę o pomoc. Pozdr. Andrzej.
#include <DS3231.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
DS3231 clock;

void setup() {
  Wire.begin();
  lcd.begin(16, 2);
  lcd.setBacklight(true);
 
  lcd.print("Zagar");
  lcd.setCursor(0, 1);
  lcd.print("Arduino");
  delay(1000);
  lcd.clear();

  Serial.begin(9600);
  // Ustawienie czasu w momencie inicjacji układu:
  // DS3231 seconds, minutes, hours, day, date, month, year
  // setDS3231time(00,01,11,7,11,03,17);
}

void loop() {
  displayDateTime();
  delay(1000);

}

void displayDateTime() {
  lcd.clear();
  lcd.print(getDateString());
  lcd.setCursor(0, 1);
  lcd.print(getTimeString());
}

String getDateString() {
  bool century;
 
  String day = toStringWithLeadingZeros(clock.getDate());
  String month = toStringWithLeadingZeros(clock.getMonth(century));
  String year = String(clock.getYear() + 2023);

  return day + "." + month + "." + year + "r.";
}

String getTimeString() {
  bool h12, pm;
 
  String hour = toStringWithLeadingZeros(clock.getHour(h12, pm));
  String minute = toStringWithLeadingZeros(clock.getMinute());
  String second = toStringWithLeadingZeros(clock.getSecond());

  return hour + ":" + minute + ":" + second;
}

String toStringWithLeadingZeros(byte number) {
  String result = String(number);
  if(number < 10) {
    result = "0" + result;
  }
  return result;
}
Ale nie pokazujesz wersji, w której ustawia się czas. Masz plik jak wyżej, wgrywasz i pobiera czas z zegara, nic więcej.
Za pierwszym razem masz wgrać ten szkic z odkomentowaną linijką:
// Ustawienie czasu w momencie inicjacji układu:
// DS3231 seconds, minutes, hours, day, date, month, year
setDS3231time(00,01,11,7,11,03,17);
A w niej podać wszystkie parametry.
Zaraz po pierwszym uruchomieniu z powrotem komentujesz tą linię i wgrywasz ponownie, tak by po każdym resecie nie ustawiał już na nowo czasu, by brał ten biegnący w zegarze.
Jest to sposób bardzo ułomny, bo musisz uwzględnić ile czasu będzie się szkic kompilował i wgrywał.

Użyj biblioteki DS3231 by Eric Ayars, w niej jest szkic S3231_set, wgrywasz taki szkic i z monitora serial wysyłasz linię:
// Call this if you notice something coming in on
// the serial port. The stuff coming in should be in
// the order YYMMDDwHHMMSS, with an 'x' at the end.
YYMMDDwHHMMSSx
Czyli np. 23071560837x
ten dzień tygodnia to sobie sprawdź tylko, bo nie pamiętam czy liczy od 1 czy od 0, wstawiłem 6 dla soboty.
W tej wersji nie ma też potrzeby wgrania ponownie szkicu z ustawieniami zegara.
Bardzo dziękuję za obszerne wyjaśnienia. Za cienki jestem, aby pojąć dlaczego, ale program po
odkomentowaniu wskazanych linijek nie kompiluje się.
Co mi się "udało" : skorzystałem z przykładów ( DS3231set) i na monitorze szeregowym wyświetla się czas (zmiany co sekundę). Nie mam pojęcia jak z monitor wysłać linię do układu Sad
A to ten plik:

#include <Wire.h>

void setup()
{
Wire.begin();
Serial.begin(9600);

// clear /EOSC bit
// Sometimes necessary to ensure that the clock
// keeps running on just battery power. Once set,
// it shouldn't need to be reset but it's a good
// idea to make sure.
Wire.beginTransmission(0x68); // address DS3231
Wire.write(0x0E); // select register
Wire.write(0b00011100); // write register bitmap, bit 7 is /EOSC
Wire.endTransmission();
}

void loop()
{
// send request to receive data starting at register 0
Wire.beginTransmission(0x68); // 0x68 is DS3231 device address
Wire.write((byte)0); // start at register 0
Wire.endTransmission();
Wire.requestFrom(0x68, 3); // request three bytes (seconds, minutes, hours)

while(Wire.available())
{
int seconds = Wire.read(); // get seconds
int minutes = Wire.read(); // get minutes
int hours = Wire.read(); // get hours

seconds = (((seconds & 0b11110000)>>4)*10 + (seconds & 0b00001111)); // convert BCD to decimal
minutes = (((minutes & 0b11110000)>>4)*10 + (minutes & 0b00001111)); // convert BCD to decimal
hours = (((hours & 0b00100000)>>5)*20 + ((hours & 0b00010000)>>4)*10 + (hours & 0b00001111)); // convert BCD to decimal (assume 24 hour mode)

Serial.print(hours); Serial.print(":"); Serial.print(minutes); Serial.print(":"); Serial.println(seconds);
}

delay(1000);
}
Twój ostatni problem jest tak niedorzeczny na etapie zadawania pytań na forum, że to może być tylko trolowanie lub prowokacja.
Obejrzyj tutoriale na Youtube, przepracuj kurs podstawowy: https://forbot.pl/blog/kurs-arduino-srod...owac-id936.
(16-07-2023, 21:19)kaczakat napisał(a): [ -> ]Twój ostatni problem jest tak niedorzeczny na etapie zadawania pytań na forum, że to może być tylko trolowanie lub prowokacja.
Obejrzyj tutoriale na Youtube, przepracuj kurs podstawowy: https://forbot.pl/blog/kurs-arduino-srod...owac-id936.
Przykro mi, że tak to traktujesz, przecież to piaskownica.... Widocznie Ty się narodziłeś z umiejętnościami i wiedzą, ja niestety nie. Kursy, tuturiale...oczywiście, że to wspaniałe i potrzebne i użyteczne i konieczne itd.. Teoria to jedno, praktyka drugie.  Czasem głupi błąd i trudno z niego wyjść.
Wydaje mi się, że po to właśnie jest forum, aby pomóc w rozwiązywaniu nawet lamerskich problemów  Dla wielu początkujących niemożliwość skompilowania jest dużym problemem i nie każdy szybko znajdzie rozwiązanie.
Nauczyciel mówiący uczniowi : nie pytaj głupio, naucz się z internetu.....
Pomijając to wszystko i tak Ci dziękuję za rady bo doprowadziło mnie to do rozwiązania problemu.
A wystarczyło pewnie tylko doczytać artykuł na nettigo do końca...
Gratuluję.
Zadałeś pytanie i dostałeś prawidłową odpowiedź, ale co z tego, skoro pomijając naukę podstaw nie byłeś w stanie jej zrozumieć, a informacja o tym była dla Ciebie tak wstrząsająca, przepraszam.