RTC DS3231+ AT24C32 překakuje čas

hnzti
Příspěvky: 8
Registrován: 03 led 2020, 10:26
Reputation: 0

RTC DS3231+ AT24C32 překakuje čas

Příspěvek od hnzti » 08 led 2020, 13:03

Ahoj,

koupil jsem si hodiny "Arduino RTC Hodiny reálného času DS3231 AT24C32" (na https://www.laskarduino.cz/arduino-rtc- ... 1-at24c32/) v nich mám LIR2032 baterii, čas se mi ukazuje na displeji a hodiny řídí relé. To cele mám zapojené k Arduinu Unu a to je napájené ze sítě.
Zapojené a naprogramované je mám podle tohoto návodu : https://navody.arduino-shop.cz/navody-k ... modul.html.

Kód: Vybrat vše



//DHT11 teploměr a vlhkoměr
/*#include "DHT.h"
  #define pinDHT 6                  // nastavení čísla pinu s připojeným DHT senzorem
  #define typDHT11 DHT11            // DHT 22
  DHT mojeDHT(pinDHT, typDHT11);    // inicializace DHT senzoru s nastaveným pinem a typem senzoru
*/

//G3MB-202P relé 5VDC-240AC
//#define RELE_PIN_cer 12               //CH1 pro čerpadlo
//#define RELE_PIN_sve 13               //CH2 pro světlo
#define RELE_PIN_ven 12               //CH3 pro ventilátor
#define RELE_PIN_zvl 11               //CH4 pro zvlhčovač

//LM393 světelný senzor
#define pinOUT A0

//RTC DS3231 hodiny reálného času + AT24C32 paměťový modul
#include <Wire.h>                  // připojení potřebných knihoven
#include <DS3231.h>
DS3231 rtc;                        // inicializace RTC z knihovny
RTCDateTime datumCas;              // vytvoření proměnné pro práci s časem

// LCD 20x4 I2C
#include <Wire.h>                     // knihovny pro LCD přes I2C
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);   // nastavení adresy I2C (0x27 v mém případě) a dále počtu znaků a řádků LCD, zde 20x4

//HC-SR04 ultrazvukový měřič vzdálenosti
int pTrig = 4;
int pEcho = 5;
long odezva, vzdalenost;          // inicializace proměnných, do kterých se uloží data

//PH modul a sonda pro měření PH
const int pinPo = A0;

//Senzor BME280
// připojení potřebných knihoven
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
// nastavení adresy senzoru
#define BME280_ADRESA (0x76)
// inicializace senzoru BME z knihovny
Adafruit_BME280 bme;






void setup() {

  Serial.begin(9600);           // komunikace přes sériovou linku rychlostí 9600 baud

  //DHT11 Teploměr a vlhkoměr
  //  mojeDHT.begin();              // zapnutí komunikace s teploměrem DHT

  //HC-SR04 ultrazvukový měřič vzdálenosti
  pinMode(pTrig, OUTPUT);       // nastavení pinů modulu jako výstup a vstup pro měření vzdalenosti
  pinMode(pEcho, INPUT);

  //LM393 Světelný senzor
  pinMode(8, INPUT);
  pinMode(9, OUTPUT);

  //G3MB-202P relé 5VDC-240AC
  //pinMode(RELE_PIN_cer, OUTPUT);    //relé 5V-220V CH1 pro čerpadlo
  //pinMode(RELE_PIN_sve, OUTPUT);    //relé 5V-220V CH2 pro světlo
  pinMode(RELE_PIN_ven, OUTPUT);    //relé 5V-220V CH3 pro ventilátor
  pinMode(RELE_PIN_zvl, OUTPUT);    //relé 5V-220V CH4 pro zvlhčovač

  //RTC DS3231 hodiny reálného času + AT24C32 paměťový modul
  rtc.begin();                          // zahájení komunikace s RTC obvodem
  rtc.setDateTime(__DATE__, __TIME__);  // nastavení času v RTC podle času kompilace programu; přímé nastavení času pro RTC; rtc.setDateTime(__DATE__, "12:34:56");

  // LCD 20x4 I2C
  lcd.begin();                                // inicializace LCD
  lcd.backlight();                            // zapnutí podsvícení
  lcd.setCursor( 0, 0);
  lcd.print("Tep ");
  lcd.setCursor( 0, 1);
  lcd.print("Vlh ");
  lcd.setCursor( 0, 2);
  lcd.print("Tlk ");
  lcd.setCursor( 0, 3);
  lcd.print("Cas ");
  lcd.setCursor( 15, 1);
  lcd.print("HYD");
  lcd.setCursor( 15, 2);
  lcd.print("2.3.3");
  lcd.setCursor( 15, 3);
  lcd.print("Rust");
  //lcd.setCursor( 10, 0);
  //lcd.print("Rez ");
  lcd.setCursor( 13, 0);
  lcd.print("PH");
  //lcd.setCursor( 10, 2);
  //lcd.print("Cer ");
  delay(1000);

  //Senzor BME280
  // v případě chyby je vypsána hláška po sériové lince
  // a zastaven program
  if (!bme.begin(BME280_ADRESA)) {
    Serial.println("BME280 senzor nenalezen, zkontrolujte zapojeni!");
    while (1);
  }
}





void loop() {

  //DHT11 Teploměr a vlhkoměr
  //dht11(1000);


  //HC-SR04 ultrazvukový měřič vzdálenosti
  hc_sr04(1000);


  //LM393 Světelný senzor
  lm393(1000);


  //G3MB-202P relé 5VDC-240AC CH1 pro světlo
  //g3mb_202p_CH1();

  //G3MB-202P relé 5VDC-240AC CH2 pro čerpadlo
  //g3mb_202p_CH2();

  //G3MB-202P relé 5VDC-240AC CH3 pro ventilator
  g3mb_202p_CH3();

  //G3MB-202P relé 5VDC-240AC CH4 pro zvlhčovač
  g3mb_202p_CH4();


  //RTC DS3231 hodiny reálného času + AT24C32 paměťový modul
  ds3231(1000);

  //PH modul a sonda pro měření PH
  phSonda();

  //Senzor BME280
  bme280(2000);

}








//DHT11 Teploměr a vlhkoměr
/* void dht11(short dht11_Delay) {
   // pomocí funkcí readTemperature a readHumidity načteme
   // do proměnných tep a vlh informace o teplotě a vlhkosti,
   // čtení trvá cca 250 ms
   int tep = mojeDHT.readTemperature();
   int vlh = mojeDHT.readHumidity();
   // kontrola, jestli jsou načtené hodnoty čísla pomocí funkce isnan
   if (isnan(tep) || isnan(vlh)) {
     // při chybném čtení vypiš hlášku
     Serial.println("Chyba při čtení z DHT senzoru!");
     lcd.setCursor( 13, 0);
     lcd.print("Er");
   } else {
     // pokud jsou hodnoty v pořádku,
     // vypiš je po sériové lince
     Serial.print("Teplota: ");
     Serial.print(tep);
     Serial.print(" °C, ");
     lcd.setCursor( 4, 0);
     lcd.print(tep);
     lcd.print("C");
     Serial.print("vlhkost: ");
     Serial.print(vlh);
     Serial.println("  %");
     lcd.setCursor( 4, 1);
     lcd.print(vlh);
     lcd.print("%");
   }
   // pauza pro přehlednější výpis
   delay(dht11_Delay);
  }
*/

//HC-SR04 ultrazvukový měřič vzdálenosti
void hc_sr04(short hc_sr04_Delay) {
  // nastavíme na 2 mikrosekundy výstup na GND (pro jistotu)
  // poté nastavíme na 5 mikrosekund výstup rovný napájení
  // a poté opět na GND
  digitalWrite(pTrig, LOW);
  delayMicroseconds(2);
  digitalWrite(pTrig, HIGH);
  delayMicroseconds(5);
  digitalWrite(pTrig, LOW);
  // pomocí funkce pulseIn získáme následně
  // délku pulzu v mikrosekundách (us)
  odezva = pulseIn(pEcho, HIGH);
  // přepočet získaného času na vzdálenost v cm
  vzdalenost = odezva / 58.31;
  Serial.print("Vzdalenost je ");
  Serial.print(vzdalenost);
  Serial.println(" cm.");
  //lcd.setCursor( 14, 0);
  //lcd.print(vzdalenost);
  // pauza 0.5 s pro přehledné čtení
  delay(hc_sr04_Delay);
}


//LM393 Světelný senzor
void lm393(short lm393_Delay) {
  int temp = digitalRead(8);                  //assign value of LDR sensor to a temporary variable
  Serial.println("Intenzita");                //print on serial monitor using ""
  Serial.println(temp);                       //display output on serial monitor
  if (temp == 0) {
    //lcd.setCursor( 16, 0);
    //lcd.print("ZAP");
  }
  if (temp == 1) {
    //lcd.setCursor( 16, 1);
    //lcd.print("VYP");
  }
  delay(lm393_Delay);
}


//RTC DS3231 hodiny reálného času + AT24C32 paměťový modul
void ds3231(short DS3231_delay) {
  // načtení času z RTC do proměnné
  datumCas = rtc.getDateTime();
  // postupný tisk informací po sériové lince
  Serial.print("Datum a cas DS3231: ");
  Serial.print(datumCas.year);   Serial.print("-");
  Serial.print(datumCas.month);  Serial.print("-");
  Serial.print(datumCas.day);    Serial.print(" ");
  Serial.print(datumCas.hour);   Serial.print(":");
  Serial.print(datumCas.minute); Serial.print(":");
  Serial.print(datumCas.second); Serial.println("");
  lcd.setCursor( 4, 3);
  lcd.print(datumCas.hour);
  lcd.setCursor( 6, 3);
  lcd.print(":");
  lcd.setCursor( 7, 3);
  lcd.print(datumCas.minute);
  lcd.setCursor( 9, 3);
  lcd.print(":");
  lcd.setCursor( 10, 3);
  lcd.print(datumCas.second);
  // pauza na konci smyčky loop
  delay(DS3231_delay);
}



//}

//G3MB-202P relé 5VDC-240AC CH1 pro světlo
//void g3mb_202p_CH1(){
//
//  //sepnuté světlo
//  if (datumCas.hour < 21 && datumCas.hour > 3) {
//    digitalWrite(RELE_PIN_sve, LOW);
//  }
//  else{
//    digitalWrite(RELE_PIN_sve, HIGH);
//}
//}

//G3MB-202P relé 5VDC-240AC CH2 pro čerpadlo
/*void g3mb_202p_CH2(){

  //sepnutý čerpadlo
  if (datumCas.minute >= 0 && datumCas.minute <= 5 || datumCas.minute >= 30 && datumCas.minute <= 35) {
  digitalWrite(RELE_PIN_cer, LOW);
  }
  //rozepnutý čerpadlo
  else{
  digitalWrite(RELE_PIN_cer, HIGH);
  }
  }*/

//G3MB-202P relé 5VDC-240AC CH3 pro ventilátor
void g3mb_202p_CH3() {
  int tep = bme.readTemperature();
  int vlh = bme.readHumidity();

  if (tep >= 25 && datumCas.hour >= 0 && datumCas.hour <= 17) {
    //sepnutý ventilátor Den
    digitalWrite(RELE_PIN_ven, LOW);
    lcd.setCursor( 8, 0);
    lcd.print("ZAP1");
  };

  if (tep <= 22 && datumCas.hour >= 0 && datumCas.hour <= 17) {
    //rozepnutý ventilátor
    digitalWrite(RELE_PIN_ven, HIGH);
    lcd.setCursor( 8, 0);
    lcd.print("VYP1");
  };

  if (tep >= 22 && datumCas.hour <= 23 && datumCas.hour >= 18) {
    //sepnutý ventilátor Noc
    digitalWrite(RELE_PIN_ven, LOW);
    lcd.setCursor( 8, 0);
    lcd.print("ZAP4");
  };

  if (tep <= 20 && datumCas.hour <= 23 && datumCas.hour >= 18) {
    //rozepnutý ventilátor
    digitalWrite(RELE_PIN_ven, HIGH);
    lcd.setCursor( 8, 0);
    lcd.print("VYP2");
  };

  if (vlh >= 75 && datumCas.hour <= 23 && datumCas.hour >= 18) {
    //sepnutý ventilátor
    digitalWrite(RELE_PIN_ven, LOW);
    lcd.setCursor( 8, 0);
    lcd.print("ZAP5");
  };

  if (vlh >= 65 && datumCas.hour >= 0 && datumCas.hour <= 17) {
    //sepnutý ventilátor
    digitalWrite(RELE_PIN_ven, LOW);
    lcd.setCursor( 8, 0);
    lcd.print("ZAP6");
  };
}

//G3MB-202P relé 5VDC-240AC CH4 pro zvlhčovač
void g3mb_202p_CH4() {
  int vlh = bme.readHumidity();

  if (vlh <= 60 && datumCas.hour >= 0 && datumCas.hour <= 17) {
    //sepnutý zvlhčovač Den
    digitalWrite(RELE_PIN_zvl, LOW);
    lcd.setCursor( 8, 1);
    lcd.print("ZAP1");
  };
  if (vlh >= 70 && datumCas.hour >= 0 && datumCas.hour <= 17) {
    //rozepnutý zvlhčovač
    digitalWrite(RELE_PIN_zvl, HIGH);
    lcd.setCursor( 8, 1);
    lcd.print("VYP1");
  }
  if (vlh <= 50 && datumCas.hour <= 23 && datumCas.hour >= 18) {
    //sepnutý zvlhčovač Noc
    digitalWrite(RELE_PIN_zvl, LOW);
    lcd.setCursor( 8, 1);
    lcd.print("ZAP2");
  };
  if (vlh >= 60 && datumCas.hour <= 23 && datumCas.hour >= 18) {
    //rozepnutý zvlhčovač
    digitalWrite(RELE_PIN_zvl, HIGH);
    lcd.setCursor( 8, 1);
    lcd.print("VYP2");
  };
}


//PH modul a sonda pro měření

void phSonda() {
  // vytvoření pomocných proměnných
  int pole[10];
  int zaloha;
  unsigned long int prumerVysl = 0;
  // načtení deseti vzorků po 10 ms do pole
  for (int i = 0; i < 10; i++) {
    pole[i] = analogRead(pinPo);
    delay(10);
  }
  // seřazení členů pole naměřených výsledků podle velikosti
  for (int i = 0; i < 9; i++) {
    for (int j = i + 1; j < 10; j++) {
      if (pole[i] > pole[j]) {
        zaloha = pole[i];
        pole[i] = pole[j];
        pole[j] = zaloha;
      }
    }
  }
  // uložení 2. až 8. výsledku do
  // proměnné, z které se vypočte průměr
  // (vynechání dvou členů pole na začátku
  // a konci pro lepší přesnost)
  for (int i = 2; i < 8; i++) {
    prumerVysl += pole[i];
  }
  // výpočet hodnoty pH z průměru
  // měření a přepočet na rozsah 0-14 pH
  float prumerPH = (float)prumerVysl * 5.0 / 1024 / 6;
  float vyslednePH = -5.70 * prumerPH + 21.34;
  // vytištění výsledků po sériové lince
  Serial.print("Namerene pH: ");
  Serial.println(vyslednePH);
  lcd.setCursor( 15, 0);
  lcd.print(vyslednePH);
  // pauza 900 ms před novým měřením, celkem tedy 1s
  delay(900);
}

//Sensor BME280
void bme280(short bme280_delay) {
  // výpis všech dostupných informací ze senzoru BMP
  int tep = bme.readTemperature();
  int vlh = bme.readHumidity();
  float tlk = bme.readPressure() / 100.0F;
  // výpis teploty
  Serial.print("Teplota: ");
  Serial.print(bme.readTemperature());
  Serial.println(" stupnu Celsia.");
  lcd.setCursor( 4, 0);
  lcd.print(tep);
  lcd.print("C");
  // výpis relativní vlhkosti
  Serial.print("Relativni vlhkost: ");
  Serial.print(bme.readHumidity());
  Serial.println(" %");
  lcd.setCursor( 4, 1);
  lcd.print(vlh);
  lcd.print("%");
  // výpis tlaku s přepočtem na hektoPascaly
  Serial.print("Tlak: ");
  Serial.print(bme.readPressure() / 100.0F);
  Serial.println(" hPa.");
  lcd.setCursor( 4, 2);
  lcd.print(tlk);
  lcd.print("hPa");
  // vytištění prázdného řádku a pauza po dobu 2 vteřin
  Serial.println();
  delay(bme280_delay);
}
První problém je, když po nahrání programu uběhne asi 10 min, tak začnou nejdřív přeskakovat minuty a pak i hodiny, asi po sesti hodinách to ukazovalo přes 70. hodinu a 60 minutu.

A druhý problém nastává při restartu arduina, čas začne znovu odpočítávat od času nahrání programu.

Měl byněkdo nápad, co s tím.

Díky za každou radu

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: RTC DS3231+ AT24C32 překakuje čas

Příspěvek od pavel1tu » 08 led 2020, 13:23

Co takhle projít kod a hledat v něm nějakou chybu ?

Tohle ti nevadí ?

Kód: Vybrat vše

rtc.setDateTime(__DATE__, __TIME__);  // nastavení času v RTC podle času kompilace programu; přímé nastavení času pro RTC; rtc.setDateTime(__DATE__, "12:34:56");
PS: kde to ukazovalo ty blbosti - po seriové lince nebo na displeji, já tam nemohu najít kde se maže display

toto je taky nic moc

Kód: Vybrat vše

delay(DS3231_delay);
řešil bych jinak, ale zásadně to asi nevadí
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: RTC DS3231+ AT24C32 překakuje čas

Příspěvek od pavel1tu » 08 led 2020, 13:32

Tamto řeší problém času po restartu

Ten čas a minuty nad 60 - musíš minuty a hodiny když mají méně jak "10" vypisovat s mezerou na začátku !!!

příklad - 00 minut na 01 minut ti zobrazí 10, ta jednička je nová, ta nula z toho "00" - chápeš ?

PS: NIKDO mu neraďte - ať si najde formátování výstupu pomocí "%"
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

hnzti
Příspěvky: 8
Registrován: 03 led 2020, 10:26
Reputation: 0

Re: RTC DS3231+ AT24C32 překakuje čas

Příspěvek od hnzti » 09 led 2020, 09:19

Takže pokud to teď dobře chápu, musím po restartu vymanit tento kód

Kód: Vybrat vše

rtc.setDateTime(__DATE__, __TIME__)
.

Pouze na displeji je problém po seriové lince to jde.

Nakonecc jsem přidal lcd.clear.

Kód: Vybrat vše


//DHT11 teploměr a vlhkoměr
/*#include "DHT.h"
  #define pinDHT 6                  // nastavení čísla pinu s připojeným DHT senzorem
  #define typDHT11 DHT11            // DHT 22
  DHT mojeDHT(pinDHT, typDHT11);    // inicializace DHT senzoru s nastaveným pinem a typem senzoru
*/

//G3MB-202P relé 5VDC-240AC
//#define RELE_PIN_cer 12               //CH1 pro čerpadlo
//#define RELE_PIN_sve 13               //CH2 pro světlo
#define RELE_PIN_ven 12               //CH3 pro ventilátor
#define RELE_PIN_zvl 11               //CH4 pro zvlhčovač

//LM393 světelný senzor
#define pinOUT A0

//RTC DS3231 hodiny reálného času + AT24C32 paměťový modul
#include <Wire.h>                  // připojení potřebných knihoven
#include <DS3231.h>
DS3231 rtc;                        // inicializace RTC z knihovny
RTCDateTime datumCas;              // vytvoření proměnné pro práci s časem

// LCD 20x4 I2C
#include <Wire.h>                     // knihovny pro LCD přes I2C
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);   // nastavení adresy I2C (0x27 v mém případě) a dále počtu znaků a řádků LCD, zde 20x4

//HC-SR04 ultrazvukový měřič vzdálenosti
int pTrig = 4;
int pEcho = 5;
long odezva, vzdalenost;          // inicializace proměnných, do kterých se uloží data

//PH modul a sonda pro měření PH
const int pinPo = A0;

//Senzor BME280
// připojení potřebných knihoven
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
// nastavení adresy senzoru
#define BME280_ADRESA (0x76)
// inicializace senzoru BME z knihovny
Adafruit_BME280 bme;






void setup() {

  Serial.begin(9600);           // komunikace přes sériovou linku rychlostí 9600 baud

  //DHT11 Teploměr a vlhkoměr
  //  mojeDHT.begin();              // zapnutí komunikace s teploměrem DHT

  //HC-SR04 ultrazvukový měřič vzdálenosti
  pinMode(pTrig, OUTPUT);       // nastavení pinů modulu jako výstup a vstup pro měření vzdalenosti
  pinMode(pEcho, INPUT);

  //LM393 Světelný senzor
  pinMode(8, INPUT);
  pinMode(9, OUTPUT);

  //G3MB-202P relé 5VDC-240AC
  //pinMode(RELE_PIN_cer, OUTPUT);    //relé 5V-220V CH1 pro čerpadlo
  //pinMode(RELE_PIN_sve, OUTPUT);    //relé 5V-220V CH2 pro světlo
  pinMode(RELE_PIN_ven, OUTPUT);    //relé 5V-220V CH3 pro ventilátor
  pinMode(RELE_PIN_zvl, OUTPUT);    //relé 5V-220V CH4 pro zvlhčovač

  //RTC DS3231 hodiny reálného času + AT24C32 paměťový modul
  rtc.begin();                          // zahájení komunikace s RTC obvodem
  rtc.setDateTime(__DATE__, __TIME__);  // nastavení času v RTC podle času kompilace programu; přímé nastavení času pro RTC; rtc.setDateTime(__DATE__, "12:34:56");

  // LCD 20x4 I2C
  lcd.begin();                                // inicializace LCD
  lcd.backlight();                            // zapnutí podsvícení
  lcd.setCursor( 0, 0);
  lcd.print("Tep ");
  lcd.setCursor( 0, 1);
  lcd.print("Vlh ");
  lcd.setCursor( 0, 2);
  lcd.print("Tlk ");
  lcd.setCursor( 0, 3);
  lcd.print("Cas ");
  lcd.setCursor( 15, 1);
  lcd.print("HYD");
  lcd.setCursor( 15, 2);
  lcd.print("2.3.3");
  lcd.setCursor( 15, 3);
  lcd.print("Rust");
  //lcd.setCursor( 10, 0);
  //lcd.print("Rez ");
  lcd.setCursor( 13, 0);
  lcd.print("PH");
  //lcd.setCursor( 10, 2);
  //lcd.print("Cer ");
  delay(1000);

  //Senzor BME280
  // v případě chyby je vypsána hláška po sériové lince
  // a zastaven program
  if (!bme.begin(BME280_ADRESA)) {
    Serial.println("BME280 senzor nenalezen, zkontrolujte zapojeni!");
    while (1);
  }
}





void loop() {

  //DHT11 Teploměr a vlhkoměr
  //dht11(1000);


  //HC-SR04 ultrazvukový měřič vzdálenosti
  hc_sr04(1000);


  //LM393 Světelný senzor
  lm393(1000);


  //G3MB-202P relé 5VDC-240AC CH1 pro světlo
  //g3mb_202p_CH1();

  //G3MB-202P relé 5VDC-240AC CH2 pro čerpadlo
  //g3mb_202p_CH2();

  //G3MB-202P relé 5VDC-240AC CH3 pro ventilator
  g3mb_202p_CH3();

  //G3MB-202P relé 5VDC-240AC CH4 pro zvlhčovač
  g3mb_202p_CH4();


  //RTC DS3231 hodiny reálného času + AT24C32 paměťový modul
  ds3231(1000);

  //PH modul a sonda pro měření PH
  phSonda();

  //Senzor BME280
  bme280(2000);

}








//DHT11 Teploměr a vlhkoměr
/* void dht11(short dht11_Delay) {
   // pomocí funkcí readTemperature a readHumidity načteme
   // do proměnných tep a vlh informace o teplotě a vlhkosti,
   // čtení trvá cca 250 ms
   int tep = mojeDHT.readTemperature();
   int vlh = mojeDHT.readHumidity();
   // kontrola, jestli jsou načtené hodnoty čísla pomocí funkce isnan
   if (isnan(tep) || isnan(vlh)) {
     // při chybném čtení vypiš hlášku
     Serial.println("Chyba při čtení z DHT senzoru!");
     lcd.setCursor( 13, 0);
     lcd.print("Er");
   } else {
     // pokud jsou hodnoty v pořádku,
     // vypiš je po sériové lince
     Serial.print("Teplota: ");
     Serial.print(tep);
     Serial.print(" °C, ");
     lcd.setCursor( 4, 0);
     lcd.print(tep);
     lcd.print("C");
     Serial.print("vlhkost: ");
     Serial.print(vlh);
     Serial.println("  %");
     lcd.setCursor( 4, 1);
     lcd.print(vlh);
     lcd.print("%");
   }
   // pauza pro přehlednější výpis
   delay(dht11_Delay);
  }
*/

//HC-SR04 ultrazvukový měřič vzdálenosti
void hc_sr04(short hc_sr04_Delay) {
  // nastavíme na 2 mikrosekundy výstup na GND (pro jistotu)
  // poté nastavíme na 5 mikrosekund výstup rovný napájení
  // a poté opět na GND
  digitalWrite(pTrig, LOW);
  delayMicroseconds(2);
  digitalWrite(pTrig, HIGH);
  delayMicroseconds(5);
  digitalWrite(pTrig, LOW);
  // pomocí funkce pulseIn získáme následně
  // délku pulzu v mikrosekundách (us)
  odezva = pulseIn(pEcho, HIGH);
  // přepočet získaného času na vzdálenost v cm
  vzdalenost = odezva / 58.31;
  Serial.print("Vzdalenost je ");
  Serial.print(vzdalenost);
  Serial.println(" cm.");
  //lcd.setCursor( 14, 0);
  //lcd.print(vzdalenost);
  // pauza 0.5 s pro přehledné čtení
  delay(hc_sr04_Delay);
}


//LM393 Světelný senzor
void lm393(short lm393_Delay) {
  int temp = digitalRead(8);                  //assign value of LDR sensor to a temporary variable
  Serial.println("Intenzita");                //print on serial monitor using ""
  Serial.println(temp);                       //display output on serial monitor
  if (temp == 0) {
    //lcd.setCursor( 16, 0);
    //lcd.print("ZAP");
  }
  if (temp == 1) {
    //lcd.setCursor( 16, 1);
    //lcd.print("VYP");
  }
  delay(lm393_Delay);
}


//RTC DS3231 hodiny reálného času + AT24C32 paměťový modul
void ds3231(short DS3231_delay) {
  // načtení času z RTC do proměnné
  datumCas = rtc.getDateTime();
  // postupný tisk informací po sériové lince
  Serial.print("Datum a cas DS3231: ");
  Serial.print(datumCas.year);   Serial.print("-");
  Serial.print(datumCas.month);  Serial.print("-");
  Serial.print(datumCas.day);    Serial.print(" ");
  Serial.print(datumCas.hour);   Serial.print(":");
  Serial.print(datumCas.minute); Serial.print(":");
  Serial.print(datumCas.second); Serial.println("");
  lcd.setCursor( 4, 3);
  lcd.print(datumCas.hour);
  lcd.setCursor( 6, 3);
  lcd.print(":");
  lcd.setCursor( 7, 3);
  lcd.print(datumCas.minute);
  lcd.setCursor( 9, 3);
  lcd.print(":");
  lcd.setCursor( 10, 3);
  lcd.print(datumCas.second);
  // pauza na konci smyčky loop
  delay(DS3231_delay);
}



//}

//G3MB-202P relé 5VDC-240AC CH1 pro světlo
//void g3mb_202p_CH1(){
//
//  //sepnuté světlo
//  if (datumCas.hour < 21 && datumCas.hour > 3) {
//    digitalWrite(RELE_PIN_sve, LOW);
//  }
//  else{
//    digitalWrite(RELE_PIN_sve, HIGH);
//}
//}

//G3MB-202P relé 5VDC-240AC CH2 pro čerpadlo
/*void g3mb_202p_CH2(){

  //sepnutý čerpadlo
  if (datumCas.minute >= 0 && datumCas.minute <= 5 || datumCas.minute >= 30 && datumCas.minute <= 35) {
  digitalWrite(RELE_PIN_cer, LOW);
  }
  //rozepnutý čerpadlo
  else{
  digitalWrite(RELE_PIN_cer, HIGH);
  }
  }*/

//G3MB-202P relé 5VDC-240AC CH3 pro ventilátor
void g3mb_202p_CH3() {
  int tep = bme.readTemperature();
  int vlh = bme.readHumidity();

  if (tep >= 25 && datumCas.hour >= 0 && datumCas.hour <= 17) {
    //sepnutý ventilátor Den
    digitalWrite(RELE_PIN_ven, LOW);
    lcd.setCursor( 8, 0);
    lcd.print("ZAP1");
  };

  if (tep <= 22 && datumCas.hour >= 0 && datumCas.hour <= 17) {
    //rozepnutý ventilátor
    digitalWrite(RELE_PIN_ven, HIGH);
    lcd.setCursor( 8, 0);
    lcd.print("VYP1");
  };

  if (tep >= 22 && datumCas.hour <= 23 && datumCas.hour >= 18) {
    //sepnutý ventilátor Noc
    digitalWrite(RELE_PIN_ven, LOW);
    lcd.setCursor( 8, 0);
    lcd.print("ZAP4");
  };

  if (tep <= 20 && datumCas.hour <= 23 && datumCas.hour >= 18) {
    //rozepnutý ventilátor
    digitalWrite(RELE_PIN_ven, HIGH);
    lcd.setCursor( 8, 0);
    lcd.print("VYP2");
  };

  if (vlh >= 75 && datumCas.hour <= 23 && datumCas.hour >= 18) {
    //sepnutý ventilátor
    digitalWrite(RELE_PIN_ven, LOW);
    lcd.setCursor( 8, 0);
    lcd.print("ZAP5");
  };

  if (vlh >= 65 && datumCas.hour >= 0 && datumCas.hour <= 17) {
    //sepnutý ventilátor
    digitalWrite(RELE_PIN_ven, LOW);
    lcd.setCursor( 8, 0);
    lcd.print("ZAP6");
  };
}

//G3MB-202P relé 5VDC-240AC CH4 pro zvlhčovač
void g3mb_202p_CH4() {
  int vlh = bme.readHumidity();

  if (vlh <= 60 && datumCas.hour >= 0 && datumCas.hour <= 17) {
    //sepnutý zvlhčovač Den
    digitalWrite(RELE_PIN_zvl, LOW);
    lcd.setCursor( 8, 1);
    lcd.print("ZAP1");
  };
  if (vlh >= 70 && datumCas.hour >= 0 && datumCas.hour <= 17) {
    //rozepnutý zvlhčovač
    digitalWrite(RELE_PIN_zvl, HIGH);
    lcd.setCursor( 8, 1);
    lcd.print("VYP1");
  }
  if (vlh <= 50 && datumCas.hour <= 23 && datumCas.hour >= 18) {
    //sepnutý zvlhčovač Noc
    digitalWrite(RELE_PIN_zvl, LOW);
    lcd.setCursor( 8, 1);
    lcd.print("ZAP2");
  };
  if (vlh >= 60 && datumCas.hour <= 23 && datumCas.hour >= 18) {
    //rozepnutý zvlhčovač
    digitalWrite(RELE_PIN_zvl, HIGH);
    lcd.setCursor( 8, 1);
    lcd.print("VYP2");
  };
}


//PH modul a sonda pro měření

void phSonda() {
  // vytvoření pomocných proměnných
  int pole[10];
  int zaloha;
  unsigned long int prumerVysl = 0;
  // načtení deseti vzorků po 10 ms do pole
  for (int i = 0; i < 10; i++) {
    pole[i] = analogRead(pinPo);
    delay(10);
  }
  // seřazení členů pole naměřených výsledků podle velikosti
  for (int i = 0; i < 9; i++) {
    for (int j = i + 1; j < 10; j++) {
      if (pole[i] > pole[j]) {
        zaloha = pole[i];
        pole[i] = pole[j];
        pole[j] = zaloha;
      }
    }
  }
  // uložení 2. až 8. výsledku do
  // proměnné, z které se vypočte průměr
  // (vynechání dvou členů pole na začátku
  // a konci pro lepší přesnost)
  for (int i = 2; i < 8; i++) {
    prumerVysl += pole[i];
  }
  // výpočet hodnoty pH z průměru
  // měření a přepočet na rozsah 0-14 pH
  float prumerPH = (float)prumerVysl * 5.0 / 1024 / 6;
  float vyslednePH = -5.70 * prumerPH + 21.34;
  // vytištění výsledků po sériové lince
  Serial.print("Namerene pH: ");
  Serial.println(vyslednePH);
  lcd.setCursor( 15, 0);
  lcd.print(vyslednePH);
  // pauza 900 ms před novým měřením, celkem tedy 1s
  delay(900);
}

//Sensor BME280
void bme280(short bme280_delay) {
  // výpis všech dostupných informací ze senzoru BMP
  int tep = bme.readTemperature();
  int vlh = bme.readHumidity();
  float tlk = bme.readPressure() / 100.0F;
  // výpis teploty
  Serial.print("Teplota: ");
  Serial.print(bme.readTemperature());
  Serial.println(" stupnu Celsia.");
  lcd.setCursor( 4, 0);
  lcd.print(tep);
  lcd.print("C");
  // výpis relativní vlhkosti
  Serial.print("Relativni vlhkost: ");
  Serial.print(bme.readHumidity());
  Serial.println(" %");
  lcd.setCursor( 4, 1);
  lcd.print(vlh);
  lcd.print("%");
  // výpis tlaku s přepočtem na hektoPascaly
  Serial.print("Tlak: ");
  Serial.print(bme.readPressure() / 100.0F);
  Serial.println(" hPa.");
  lcd.setCursor( 4, 2);
  lcd.print(tlk);
  lcd.print("hPa");
  // vytištění prázdného řádku a pauza po dobu 2 vteřin
  Serial.println();
  delay(bme280_delay);
  lcd.clear();
}
Když jsem to dal takto, tak display blikal. Budu asi muset dát lcd.clear pouze na ty pozice, kde je čas.

Díky

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: RTC DS3231+ AT24C32 překakuje čas

Příspěvek od pavel1tu » 09 led 2020, 10:59

NE, jde to i formátováním výstupu (což je jednodušší) a nebo takto
upravil jsem to jen pro hodiny

Kód: Vybrat vše

//RTC DS3231 hodiny reálného času + AT24C32 paměťový modul
void ds3231(short DS3231_delay) {
  // načtení času z RTC do proměnné
  datumCas = rtc.getDateTime();
  // postupný tisk informací po sériové lince
  Serial.print("Datum a cas DS3231: ");
  Serial.print(datumCas.year);   Serial.print("-");
  Serial.print(datumCas.month);  Serial.print("-");
  Serial.print(datumCas.day);    Serial.print(" ");
  Serial.print(datumCas.hour);   Serial.print(":");
  Serial.print(datumCas.minute); Serial.print(":");
  Serial.print(datumCas.second); Serial.println("");
 
  if (datumCas.hour < 10) {  //pokud je mene nez 2 znaky
     lcd.setCursor( 4, 3);
     lcd.print("0");
     lcd.setCursor( 5, 3);
     lcd.print(datumCas.hour);
     } else {                         //pokud jsou 2 znaky
     lcd.setCursor( 4, 3);  
     lcd.print(datumCas.hour);
     }
     
  lcd.setCursor( 6, 3);
  lcd.print(":");
  lcd.setCursor( 7, 3);
  lcd.print(datumCas.minute);
  lcd.setCursor( 9, 3);
  lcd.print(":");
  lcd.setCursor( 10, 3);
  lcd.print(datumCas.second);
  // pauza na konci smyčky loop
  delay(DS3231_delay);
}





UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

hnzti
Příspěvky: 8
Registrován: 03 led 2020, 10:26
Reputation: 0

Re: RTC DS3231+ AT24C32 překakuje čas

Příspěvek od hnzti » 10 led 2020, 15:48

Paráda, upravil jsem to i pro min a sec a funguje to dobře. Děkuji

A k tomu restartu mě napadlo nahrát ten muj kód a až se nahraje čas z PC, tak to nahraju znovu, ale dám

Kód: Vybrat vše

//rtc.setDateTime(__DATE__, __TIME__);  // nastavení času v RTC podle času kompilace programu; přímé nastavení času pro RTC; rtc.setDateTime(__DATE__, "12:34:56");
Jinak mě to řešit nenapadlo... :/

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: RTC DS3231+ AT24C32 překakuje čas

Příspěvek od AstroMiK » 10 led 2020, 18:41

Myslím, že by bylo dobré udělat alespoň jednoduchou funkci pro nastavení času přes sériový terminál.

V té verzi co máš teď by se čas musel nastavovat vždycky dvojitou kompilací a to je hodně nepohodlné.

Ta funkce nastavení času by mohla vypadat nějak takhle:

Kód: Vybrat vše

void loop(void)
  {
    if (Serial.available())
      {
        if (Serial.read() == 'T')  nastav_cas();      // když je první znak velké 'T', nastaví se čas podle následujících čísel
        while(Serial.available())  Serial.read();     // všechno ostatní ze sériové linky se smaže
      }

  
    // ... tady bude pokračovat původní program
  
  
 
  
  //  ---- konec smyčky loop
  
  }




// očekávají se čísla oddělená čárkami ve formátu RR,MM,DD,HH,NN   ( RR je poslední dvojčíslí roku, NN jsou minuty)
//  POZOR: program nekontroluje zadávání správného datumu
void nastav_cas(void)
  {
    delay(10);                               // chvilku pauza, aby se stačil načíst celý řetězec z komunikace
    byte rok    = Serial.parseInt();   
    byte mesic  = Serial.parseInt();   
    byte den    = Serial.parseInt();   
    byte hodina = Serial.parseInt();   
    byte minuta = Serial.parseInt();   
    rtc.setDateTime(rok+2000, mesic, den, hodina, minuta, 0);        
    Serial.println("Nastaveno");
  }



Přenastavení datumu a času se provede zadáním jednoduché sekvence čísel do sériového terminálu - například:

T 20,1,10,18,56 = 10.ledna 2020 ; 18:56

Program je hodně jednoduchý, takže nekontroluje zadání nesmyslů, ale pořád je to lepší, než nastavovat RTC tak, jak to máš teď.

hnzti
Příspěvky: 8
Registrován: 03 led 2020, 10:26
Reputation: 0

Re: RTC DS3231+ AT24C32 překakuje čas

Příspěvek od hnzti » 12 led 2020, 14:42

To máš pravdu.

Zapsal jsem to takhle

Kód: Vybrat vše


//G3MB-202P relé 5VDC-240AC
//#define RELE_PIN_cer 12               //CH1 pro čerpadlo
#define RELE_PIN_cer 13               //CH2 pro světlo
#define RELE_PIN_ven 12               //CH3 pro ventilátor
#define RELE_PIN_zvl 11               //CH4 pro zvlhčovač


//RTC DS3231 hodiny reálného času + AT24C32 paměťový modul
#include <Wire.h>                  // připojení potřebných knihoven
#include <DS3231.h>
DS3231 rtc;                        // inicializace RTC z knihovny
RTCDateTime datumCas;              // vytvoření proměnné pro práci s časem

// LCD 20x4 I2C
#include <Wire.h>                     // knihovny pro LCD přes I2C
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);   // nastavení adresy I2C (0x27 v mém případě) a dále počtu znaků a řádků LCD, zde 20x4


//Senzor BME280
// připojení potřebných knihoven
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
// nastavení adresy senzoru
#define BME280_ADRESA (0x76)
// inicializace senzoru BME z knihovny
Adafruit_BME280 bme;









void setup() {

  Serial.begin(9600);           // komunikace přes sériovou linku rychlostí 9600 baud


  //G3MB-202P relé 5VDC-240AC
  //pinMode(RELE_PIN_sve, OUTPUT);    //relé 5V-220V CH1 pro světlo
  pinMode(RELE_PIN_cer, OUTPUT);    //relé 5V-220V CH2 pro čerpadlo
  pinMode(RELE_PIN_ven, OUTPUT);    //relé 5V-220V CH3 pro ventilátor
  pinMode(RELE_PIN_zvl, OUTPUT);    //relé 5V-220V CH4 pro zvlhčovač


  //RTC DS3231 hodiny reálného času + AT24C32 paměťový modul
  rtc.begin();                          // zahájení komunikace s RTC obvodem
  //rtc.setDateTime(__DATE__, __TIME__);  // nastavení času v RTC podle času kompilace programu; přímé nastavení času pro RTC; rtc.setDateTime(__DATE__, "12:34:56");


  // LCD 20x4 I2C
  lcd.begin();                                // inicializace LCD
  lcd.backlight();                            // zapnutí podsvícení
  lcd.setCursor( 0, 0);
  lcd.print("Tep ");
  lcd.setCursor( 0, 1);
  lcd.print("Vlh ");
  lcd.setCursor( 0, 2);
  lcd.print("Tlk ");
  lcd.setCursor( 0, 3);
  lcd.print("Cas ");
  lcd.setCursor( 15, 0);
  lcd.print("Cer ");
  lcd.setCursor( 15, 1);
  lcd.print("HYD");
  lcd.setCursor( 15, 2);
  lcd.print("2.4.1");
  lcd.setCursor( 15, 3);
  lcd.print("Rust");
  delay(1000);


  //Senzor BME280
  // v případě chyby je vypsána hláška po sériové lince
  // a zastaven program
  if (!bme.begin(BME280_ADRESA)) {
    Serial.println("BME280 senzor nenalezen, zkontrolujte zapojeni!");
    while (1);
  }
}










void loop() {


  //G3MB-202P relé 5VDC-240AC CH1 pro světlo
  //g3mb_202p_CH1();

  //G3MB-202P relé 5VDC-240AC CH2 pro čerpadlo
  g3mb_202p_CH2();

  //G3MB-202P relé 5VDC-240AC CH3 pro ventilator
  g3mb_202p_CH3();

  //G3MB-202P relé 5VDC-240AC CH4 pro zvlhčovač
  g3mb_202p_CH4();


  //RTC DS3231 hodiny reálného času + AT24C32 paměťový modul
  ds3231(1000);

  void ();{
  if (Serial.available())
  {
    if (Serial.read() == 'T')  nastav_cas();      // když je první znak velké 'T', nastaví se čas podle následujících čísel
    while (Serial.available())  Serial.read();    // všechno ostatní ze sériové linky se smaže
  }
  }

    //Senzor BME280
    bme280(2000);

  }










  //}

  //G3MB-202P relé 5VDC-240AC CH1 pro světlo
  //void g3mb_202p_CH1(){
  //
  //  //sepnuté světlo
  //  if (datumCas.hour <= 21 && datumCas.hour >= 3) {
  //    digitalWrite(RELE_PIN_sve, LOW);
  //  }
  //  else{
  //    digitalWrite(RELE_PIN_sve, HIGH);
  //}
  //}

  //G3MB-202P relé 5VDC-240AC CH2 pro čerpadlo
  void g3mb_202p_CH2() {

    //sepnutý čerpadlo
    if (datumCas.minute >= 0 && datumCas.minute <= 5 || datumCas.minute >= 30 && datumCas.minute <= 35) {
      digitalWrite(RELE_PIN_cer, LOW);
      lcd.setCursor( 19, 0);
      lcd.print("1");
    }
    //rozepnutý čerpadlo
    else {
      digitalWrite(RELE_PIN_cer, HIGH);
      lcd.setCursor( 19, 0);
      lcd.print("0");
    }
  }

  //G3MB-202P relé 5VDC-240AC CH3 pro ventilátor
  void g3mb_202p_CH3() {
    int tep = bme.readTemperature();
    int vlh = bme.readHumidity();

    if (tep >= 27 && datumCas.hour >= 0 && datumCas.hour <= 17) {
      //sepnutý ventilátor Den
      digitalWrite(RELE_PIN_ven, LOW);
      lcd.setCursor( 8, 0);
      lcd.print("ZAP1");
    };

    if (tep <= 23 && datumCas.hour >= 0 && datumCas.hour <= 17) {
      //rozepnutý ventilátor
      digitalWrite(RELE_PIN_ven, HIGH);
      lcd.setCursor( 8, 0);
      lcd.print("VYP1");
    };

    if (datumCas.hour <= 23 && datumCas.hour >= 18 && datumCas.minute >= 0 && datumCas.minute <= 5 || datumCas.minute >= 30 && datumCas.minute <= 35) {
      //sepnutý ventilátor Noc
      digitalWrite(RELE_PIN_ven, LOW);
      lcd.setCursor( 8, 0);
      lcd.print("ZAP2");
    };

    if (tep >= 21 && datumCas.hour <= 23 && datumCas.hour >= 18) {
      //sepnutý ventilátor Noc
      digitalWrite(RELE_PIN_ven, LOW);
      lcd.setCursor( 8, 0);
      lcd.print("ZAP4");
    };

    if (tep <= 20 && datumCas.hour <= 23 && datumCas.hour >= 18 && datumCas.minute >= 6 && datumCas.minute <= 29 || datumCas.minute >= 36 && datumCas.minute <= 59) {
      //rozepnutý ventilátor
      digitalWrite(RELE_PIN_ven, HIGH);
      lcd.setCursor( 8, 0);

      lcd.print("VYP2");
    };

    if (vlh >= 90 && datumCas.hour <= 23 && datumCas.hour >= 18 && datumCas.minute >= 6 && datumCas.minute <= 29 || datumCas.minute >= 36 && datumCas.minute <= 59) {
      //sepnutý ventilátor
      digitalWrite(RELE_PIN_ven, LOW);
      lcd.setCursor( 8, 0);
      lcd.print("ZAP5");
    };

    if (vlh >= 80 && datumCas.hour >= 0 && datumCas.hour <= 17 && datumCas.hour >= 18 && datumCas.minute >= 6 && datumCas.minute <= 29 || datumCas.minute >= 36 && datumCas.minute <= 59) {
      //sepnutý ventilátor
      digitalWrite(RELE_PIN_ven, LOW);
      lcd.setCursor( 8, 0);
      lcd.print("ZAP6");
    };
  }

  //G3MB-202P relé 5VDC-240AC CH4 pro zvlhčovač
  void g3mb_202p_CH4() {
    int vlh = bme.readHumidity();

    if (vlh <= 70 && datumCas.hour >= 0 && datumCas.hour <= 17) {
      //sepnutý zvlhčovač Den
      digitalWrite(RELE_PIN_zvl, LOW);
      lcd.setCursor( 8, 1);
      lcd.print("ZAP1");
    };
    if (vlh >= 85 && datumCas.hour >= 0 && datumCas.hour <= 17) {
      //rozepnutý zvlhčovač
      digitalWrite(RELE_PIN_zvl, HIGH);
      lcd.setCursor( 8, 1);
      lcd.print("VYP1");
    }
    if (vlh <= 60 && datumCas.hour <= 23 && datumCas.hour >= 18 && datumCas.minute >= 6 && datumCas.minute <= 29 || datumCas.minute >= 36 && datumCas.minute <= 59) {
      //sepnutý zvlhčovač Noc
      digitalWrite(RELE_PIN_zvl, LOW);
      lcd.setCursor( 8, 1);
      lcd.print("ZAP2");
    };
    if (vlh >= 75 && datumCas.hour <= 23 && datumCas.hour >= 18) {
      //rozepnutý zvlhčovač
      digitalWrite(RELE_PIN_zvl, HIGH);
      lcd.setCursor( 8, 1);
      lcd.print("VYP2");
    };
  }


  //RTC DS3231 hodiny reálného času + AT24C32 paměťový modul
  void ds3231(short DS3231_delay) {
    // načtení času z RTC do proměnné
    datumCas = rtc.getDateTime();
    // postupný tisk informací po sériové lince
    Serial.print("Datum a cas DS3231: ");
    Serial.print(datumCas.year);   Serial.print("-");
    Serial.print(datumCas.month);  Serial.print("-");
    Serial.print(datumCas.day);    Serial.print(" ");
    Serial.print(datumCas.hour);   Serial.print(":");
    Serial.print(datumCas.minute); Serial.print(":");
    Serial.print(datumCas.second); Serial.println("");

    //display
    lcd.setCursor( 6, 3);
    lcd.print(":");
    lcd.setCursor( 9, 3);
    lcd.print(":");

    if (datumCas.hour < 10) {  //pokud je mene nez 2 znaky
      lcd.setCursor( 4, 3);
      lcd.print("0");
      lcd.setCursor( 5, 3);
      lcd.print(datumCas.hour);
    } else {                         //pokud jsou 2 znaky
      lcd.setCursor( 4, 3);
      lcd.print(datumCas.hour);
    }
    if (datumCas.minute < 10) {  //pokud je mene nez 2 znaky
      lcd.setCursor( 7, 3);
      lcd.print("0");
      lcd.setCursor( 8, 3);
      lcd.print(datumCas.minute);
    } else {                         //pokud jsou 2 znaky
      lcd.setCursor( 7, 3);
      lcd.print(datumCas.minute);
    }
    if (datumCas.second < 10) {  //pokud je mene nez 2 znaky
      lcd.setCursor( 10, 3);
      lcd.print("0");
      lcd.setCursor( 11, 3);
      lcd.print(datumCas.second);
    } else {                         //pokud jsou 2 znaky
      lcd.setCursor( 10, 3);
      lcd.print(datumCas.second);
    }

    // pauza na konci smyčky loop
    delay(DS3231_delay);
  }

  void nastav_cas(void)
  {
    delay(10);                               // chvilku pauza, aby se stačil načíst celý řetězec z komunikace
    byte rok    = Serial.parseInt();
    byte mesic  = Serial.parseInt();
    byte den    = Serial.parseInt();
    byte hodina = Serial.parseInt();
    byte minuta = Serial.parseInt();
    byte vterina= Serial.parseInt();
    rtc.setDateTime(rok + 2000, mesic, den, hodina, minuta, vterina, 0);
    Serial.println("Nastaveno");
  }

  //Sensor BME280
  void bme280(short bme280_delay) {
    // výpis všech dostupných informací ze senzoru BMP
    int tep = bme.readTemperature();
    int vlh = bme.readHumidity();
    float tlk = bme.readPressure() / 100.0F;
    // výpis teploty
    Serial.print("Teplota: ");
    Serial.print(bme.readTemperature());
    Serial.println(" stupnu Celsia.");
    lcd.setCursor( 4, 0);
    lcd.print(tep);
    lcd.print("C");
    // výpis relativní vlhkosti
    Serial.print("Relativni vlhkost: ");
    Serial.print(bme.readHumidity());
    Serial.println(" %");
    lcd.setCursor( 4, 1);
    lcd.print(vlh);
    lcd.print("%");
    // výpis tlaku s přepočtem na hektoPascaly
    Serial.print("Tlak: ");
    Serial.print(bme.readPressure() / 100.0F);
    Serial.println(" hPa.");
    lcd.setCursor( 4, 2);
    lcd.print(tlk);
    lcd.print("hPa");
    // vytištění prázdného řádku a pauza po dobu 2 vteřin
    Serial.println();
    delay(bme280_delay);
  }
nevím, zda to mám dobře vložené do mého kódu, ale když jsem si tam přidal i vteřiny, tak to pak hlásí chybu

Kód: Vybrat vše

Arduino: 1.8.10 (Mac OS X), Vývojová deska: "Arduino/Genuino Uno"

/Users/honza/Documents/Arduino/HYD_2.4.1_Rust/HYD_2.4.1_Rust.ino: In function 'void nastav_cas()':
HYD_2.4.1_Rust:318:71: error: no matching function for call to 'DS3231::setDateTime(int, byte&, byte&, byte&, byte&, byte&, int)'
     rtc.setDateTime(rok + 2000, mesic, den, hodina, minuta, vterina, 0);
                                                                       ^
In file included from /Users/honza/Documents/Arduino/HYD_2.4.1_Rust/HYD_2.4.1_Rust.ino:13:0:
/Users/honza/Documents/Arduino/libraries/Arduino-DS3231-master/DS3231.h:95:7: note: candidate: void DS3231::setDateTime(uint16_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t)
  void setDateTime(uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second);
       ^~~~~~~~~~~
/Users/honza/Documents/Arduino/libraries/Arduino-DS3231-master/DS3231.h:95:7: note:   candidate expects 6 arguments, 7 provided
/Users/honza/Documents/Arduino/libraries/Arduino-DS3231-master/DS3231.h:96:7: note: candidate: void DS3231::setDateTime(uint32_t)
  void setDateTime(uint32_t t);
       ^~~~~~~~~~~
/Users/honza/Documents/Arduino/libraries/Arduino-DS3231-master/DS3231.h:96:7: note:   candidate expects 1 argument, 7 provided
/Users/honza/Documents/Arduino/libraries/Arduino-DS3231-master/DS3231.h:97:7: note: candidate: void DS3231::setDateTime(const char*, const char*)
  void setDateTime(const char* date, const char* time);
       ^~~~~~~~~~~
/Users/honza/Documents/Arduino/libraries/Arduino-DS3231-master/DS3231.h:97:7: note:   candidate expects 2 arguments, 7 provided
Byly nalezené násobné knihovny "Wire.h"
 Použitý: /Users/honza/Library/Arduino15/packages/arduino/hardware/avr/1.8.1/libraries/Wire
Byly nalezené násobné knihovny "DS3231.h"
 Použitý: /Users/honza/Documents/Arduino/libraries/Arduino-DS3231-master
Byly nalezené násobné knihovny "LiquidCrystal_I2C.h"
 Použitý: /Users/honza/Documents/Arduino/libraries/Arduino-LiquidCrystal-I2C-library-master
Byly nalezené násobné knihovny "SPI.h"
 Použitý: /Users/honza/Library/Arduino15/packages/arduino/hardware/avr/1.8.1/libraries/SPI
Byly nalezené násobné knihovny "Adafruit_Sensor.h"
 Použitý: /Users/honza/Documents/Arduino/libraries/Adafruit_Unified_Sensor
Byly nalezené násobné knihovny "Adafruit_BME280.h"
 Použitý: /Users/honza/Documents/Arduino/libraries/Adafruit_BME280_Library
exit status 1
no matching function for call to 'DS3231::setDateTime(int, byte&, byte&, byte&, byte&, byte&, int)'

Táto zpráva by měla mít víc informacií v
"Zobrazení podrobného výstupu při kompilaci"
podle zapnuté volby v Soubor -> Nastavení.

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: RTC DS3231+ AT24C32 překakuje čas

Příspěvek od AstroMiK » 12 led 2020, 15:55

Ta nula jako poslední parametr v následující řádce znamenala sekundy:

Kód: Vybrat vše

rtc.setDateTime(rok+2000, mesic, den, hodina, minuta, 0); 
Takže v tom tvém rozšíření by ta řádka měla vypadat takhle:

Kód: Vybrat vše

rtc.setDateTime(rok + 2000, mesic, den, hodina, minuta, vterina);

A ten kus kódu tam máš vložený blbě.


Tohle celý smaž:

Kód: Vybrat vše

  void ();{
  if (Serial.available())
  {
    if (Serial.read() == 'T')  nastav_cas();      // když je první znak velké 'T', nastaví se čas podle následujících čísel
    while (Serial.available())  Serial.read();    // všechno ostatní ze sériové linky se smaže
  }
  }
  

a místo toho nech jen:

Kód: Vybrat vše

  if (Serial.available())
  {
    if (Serial.read() == 'T')  nastav_cas();      // když je první znak velké 'T', nastaví se čas podle následujících čísel
    while (Serial.available())  Serial.read();    // všechno ostatní ze sériové linky se smaže
  }

hnzti
Příspěvky: 8
Registrován: 03 led 2020, 10:26
Reputation: 0

Re: RTC DS3231+ AT24C32 překakuje čas

Příspěvek od hnzti » 13 led 2020, 22:27

Super, takto to funguje bez problému.

Díky moc

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 7 hostů