Problemi RTC ed valore di lettura

Ciao, ho 2 problemi che riscontro.. uno non so come fare per accendere e spegnere un relè in base al ora voluta.. il secondo ho provato a fare un if/else con il valore della temperatura ma non credo mi funzioni in quanto uso:

if(dht.readHumidity() < 50)
{
digitalWrite(pin5, HIGH);
}

(ESEMPIO)

E per i comando RTC non so come coportarmi. grazie mille a tutti

[code]
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>  
#include "DHT.h" 
#include <RTClib.h>
             
#define DHTPIN 2                
#define DHTTYPE DHT22   // DHT 22  (AM2302)  

char buffer1[20];
char buffer2[20];

int sensore = A0;
float valCo = 0;
const int setpin = 6;
boolean statepin = 0;
DHT dht(DHTPIN, DHTTYPE);
RTC_DS1307 RTC;

LiquidCrystal_I2C lcd(0x3f,20,4);  //imposta i dati del LCD

void setup()
{
  pinMode(6, OUTPUT);
  digitalWrite(6, HIGH);
  Wire.begin();
  RTC.begin();
  if (! RTC.isrunning()) {
   RTC.adjust(DateTime(__DATE__, __TIME__));
   }
  lcd.init();                      
  lcd.backlight();    //accendi retroilluminazione
}


void loop()
{
  statepin = digitalRead (setpin);
 if (statepin == LOW)
 {
  RTC.adjust(DateTime(__DATE__, __TIME__));
 }
  DateTime now = RTC.now();
  sprintf(buffer1,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
  lcd.setCursor(12,3);
  lcd.print(buffer1);
  sprintf(buffer2,  "%02d/%02d/%d", now.day(), now.month(), now.year());
  lcd.setCursor(0,3);
  lcd.print(buffer2);
  valCo = analogRead(sensore)*10;
  lcd.setCursor(0,0);
  lcd.print("Temperatura");
  lcd.setCursor(13,0);
  lcd.print(dht.readTemperature());
  lcd.setCursor(18,0);
  lcd.print(" C");
  lcd.setCursor(0,1);
  lcd.print("Umidita");
  lcd.setCursor(13,1);
  lcd.print(dht.readHumidity());
  lcd.setCursor(18,1);
  lcd.print(" %");
  lcd.setCursor(0,2);
  lcd.print("Co2");
  lcd.setCursor(11,2);
  lcd.print(valCo);
  lcd.setCursor(17,2);
  lcd.print("ppm");
  }

[/code]

Nell'esempio che hai postato non c'è nulla che riguarda il controlo dell'ora, solo la stampa di quanto letto dall'rtc su lcd. Manca anche la parte di lettura del sensore DHT22. Nello spezone di codice inserito prima (fuori dai tag code) leggi l'umidità non la temperatura

... aggiungo a quanto già detto da "fabpolli", sai vero che le righe: RTC.adjust(DateTime(DATE, TIME)); non fanno altro che impostare, ogni volta, la data/ora del RTC alla data/ora in cui hai COMPILATO il programma? ... con tutto quello che ne consegue ... ::slight_smile:

Guglielmo

Infatti la " RTC.adjust(DateTime(DATE, TIME));" va usata solo la prima volta che si fa partire il sistema per settare automaticamente data e ora con quella corrente sul pc, ovvero data e ora di compilazione, poi quella riga va commentata e ricaricato il codice, se non si fa così ad ogni avvio di Arduino l'RTC viene sempre riportato a quella data e ora.

ok fino li sono a posto però ora non so come sono i comandi per dire a tal ora accendi il relè e spegnilo. non trovo i comandi o dei esempi. Ora dallo sketch dovrei solamente dire alle 7 accendi e alle 22 spegni tutto qua..

grazie mille per l'aiuto

Se ( (ora == 7) e (minuti == 0) ) allora accendi ... non mi sembra complicato ... hai gli appositi metodi che ti ritonano l'ora corrente, i minuti correnti ed anche i secondi (ma quelli NON usarli, rischi che l'IF avviene un secondo dopo e non lo prendi). Idem per spegnere.

Guglielmo

Basta creare un codice di tempo: secondi+minuti100+ore10000. Ad es.: 15:22m:45s darà il codice 152245. A quel punto è fare fare semplicemente un if(codiceDellOraCorrente>220000) Spegni();

Più precisamente, dovrebbe essere if(codiceDellOraCorrente>=220000) Spegni();

Datman:
Basta creare un codice di tempo: secondi+minuti100+ore10000. Ad es.: 15:22m:45s darà il codice 152245. A quel punto è fare fare semplicemente un if(codiceDellOraCorrente>220000) Spegni();

Ripeto che lascerei fuori i secondi ...
... NON sai cosa fa i loop() e, se malaguratamente (... non dovrebbe mai, ma ... ::slight_smile:) dura più di 1 secondo ... il codice rischia di non beccare mai il momento esatto. Tanto per il suo scopo, ore/minuti sono più che sufficenti.

Guglielmo

P.S.: Se comunque ti piace fare quei calcoli, per uniformità con il "resto del mondo" :D, si fa minuti60 e ore3600 così da avere un numero univoco che rappresenta i secondi del giorno (da 0 a 86399) :wink:

  1. Puoi anche usare ore e minuti. Comunque, se guardi bene, uso >=, non ==, quindi lo spegnimento avviene anche se sfugge l'orario esatto! :slight_smile:

  2. E' evidente che, se volessi fare il conteggio in secondi, dovrei fare in quel modo, ma chi me lo fa fare??? Moltiplicando per 10000 e per 100 ore e minuti e sommando i secondi (se uso anche i secondi, altrimenti basta moltiplicare le ore per 100 e sommare i minuti) rimangono immediatamente leggibili e possono essere impostati in fase di programmazione senza prendere la calcolatrice!

Datman:
2. E' evidente che, se volessi fare il conteggio in secondi, dovrei fare in quel modo, ma chi me lo fa fare???

... come detto ... lo standard che usa TUTTO IL MONDO :smiley:

Guglielmo

Ciao scusate ma non la capisco proprio questa come funziona ci ho provato ma nulla.. Ci sarebbe una buona anima che me lo scriverebbe nello sketch? (non per pigrizia mia.. ma sto impazzendo) vi sarei veramente riconoscenti... grazie

[/[code]
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>  
#include "DHT.h" 
#include <RTClib.h>
             
#define DHTPIN 2                
#define DHTTYPE DHT22   // DHT 22  (AM2302)  

char buffer1[20];
char buffer2[20];

int sensore = A0;
int lettura = 13;
int ventilazione = 8;
int luce = 9;
int rele = 12;

float valCo = 0;
const int setpin = 6;
boolean statepin = 0;
DHT dht(DHTPIN, DHTTYPE);
RTC_DS1307 RTC;

LiquidCrystal_I2C lcd(0x3f,20,4);  //imposta i dati del LCD

void setup()
{
  pinMode(6, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(12, OUTPUT);
  digitalWrite(6, HIGH);
  Wire.begin();
  RTC.begin();
  if (! RTC.isrunning()) {
   RTC.adjust(DateTime(__DATE__, __TIME__));
   }
  lcd.init();                      
  lcd.backlight();    //accendi retroilluminazione
}


void loop()
{
  digitalWrite(lettura,HIGH);
  digitalWrite(rele,HIGH);
  statepin = digitalRead (setpin);
 if (statepin == LOW)
 {
  RTC.adjust(DateTime(__DATE__, __TIME__));
 }
  DateTime now = RTC.now();
  sprintf(buffer1,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
  lcd.setCursor(12,3);
  lcd.print(buffer1);
  sprintf(buffer2,  "%02d/%02d/%d", now.day(), now.month(), now.year());
  lcd.setCursor(0,3);
  lcd.print(buffer2);
  valCo = analogRead(sensore)*10;
  lcd.setCursor(0,0);
  lcd.print("Temperatura");
  lcd.setCursor(13,0);
  lcd.print(dht.readTemperature());
  lcd.setCursor(18,0);
  lcd.print(" C");
  lcd.setCursor(0,1);
  lcd.print("Umidita");
  lcd.setCursor(13,1);
  lcd.print(dht.readHumidity());
  lcd.setCursor(18,1);
  lcd.print(" %");
  lcd.setCursor(0,2);
  lcd.print("Co2");
  lcd.setCursor(11,2);
  lcd.print(valCo);
  lcd.setCursor(17,2);
  lcd.print("ppm");
  {
    digitalWrite(rele, HIGH);  // fai tirare il relé
  }
  if (dht.readTemperature() < 20);
  {
    digitalWrite(8,LOW);
  }
  digitalWrite (lettura,LOW);
                                           //spegni il relé
  }

code]

eccomi ho trovato un comando che faccia enablealarm e disablealarm sarebbero quelli per poter far funzionare un relé?

perché fare if(hour <=12) non mi funziona
grazie mille

Ciao una qualche buon anima mi potrebbe aiutare? :o :o ho finito tutto il progetto manca solo il timer a relé.. in base al ora..

Grazie mille e scusate il disturbo

Scusa ma lo hai letto il mio post #5 ? ? ? :o ... perché ti ho chiaramente scritto come devi fare ... ::slight_smile:

Guglielmo

Se ( (ora == 7) e (minuti == 0) ) allora accendi
in linguaggio arduino sarebbe if((hour == 12) (minute == 00)) non mi funziona.. perché?

Cosa è 'hour' ? e cosa è 'minute' ? ...
... i metodi che ritornano le varie parti della data/ora si chiamano (... nel tuo codice) now.hour(), now.minute() ... le hai anche usate e NON sai a cosa servono ? ? ? :o :o :o

Guglielmo

P.S.: Ovviemente 'now' deve essere creato/aggiornato come hai fatto: DateTime now = RTC.now();

ok credevo servissero solo per impostare l'ora io avevo letto il codice enableAlarm() e credevo si usasse quello o altri comandi. proverò.. grazie mille e scusa il disturbo

cncduino:
ok credevo servissero solo per impostare l'ora

... ma no, le hai usate proprio TU per stampare l'ora, quindi le hai usate in un contesto diverso dall'impostare l'ora.

cncduino:
... proverò.. grazie mille e scusa il disturbo

Ma quale distrubo? :smiley:

... invece, quello che NON capisco, è perché non approfondisci le cose che usi. :confused: Stai usado la libreria RTC, stai usando alcuni dei suoi metodi, perché non ti metti con calma a capire cosa fanno e come sfruttarli? :wink:

Guglielmo

Ok ma dove trovo tutta la lista dei comandi da eseguire? alla fine io devo fare un if qualcosa ma non riesco a trovare la parte dopo. grazie mille

cncduino:
Ok ma dove trovo tutta la lista dei comandi da eseguire?

... non capisco ... QUALE lista di comandi cerchi ? ? ? :o

Guglielmo