Go Down

Topic: problema lettura secondi RTC (Read 9483 times) previous topic - next topic

qsecofr

ecco qua.
soliti avvisi di sempre: ci sono sicuramente errori e bisogna fare un controllo generale.
Magari se posti il codice attuale non sarebbe male.

Immagino che la fase di fade poi duri qualche ora?


Code: [Select]
#include <DallasTemperature.h>
#include <OneWire.h>
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal.h>
#define ONE_WIRE_BUS 8


OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float temperatura;


char buffer[10];

RTC_DS1307 RTC;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup () {
    sensors.begin();
    Wire.begin();
    RTC.begin();
    lcd.begin(20, 4);

    RTC.sqw(1);  // qsecofr: MI DA ERRORE: NON POSSO CORREGGERE IO
    if (! RTC.isrunning()) {
      RTC.adjust(DateTime(__DATE__, __TIME__));
    }
   
   
   
    // qsecofr: questa istruzione disattiva l'attesa della conversione
   
  sensors.setWaitForConversion(false);   
   
}



bool fadeUp = false;            // 29/12
bool fadeDown = false;         // 29/12
byte ValorePorta = 0;
long  oldMillisFade=0;           // 29/12

 
byte oldSecond =0;       //QSECOFR

byte richiestaTemperatura=0;   //Qsecofr
long oldMillis; //qsecofr



void loop () {
    DateTime now = RTC.now();
   

   


//    delay(1000);        //QSECOFR

    if (oldSecond != now.second()) { //qsecofr sono cambiati i secondi...
     
          // 29/12    ...poi metterai anche i minuti e le ore...
          // fa scattare il fadeup quando i secondi dell'orologio sono a 0
          // fa scattare il fadedown quando i secondi dell'orologio sono a 30
          if ((now.second==0) && !fadeUp){
                fadeUp = true;
                oldMillisFade = millis();
                };
          if (now.second==30 && !fadeDown)
                {fadeDown = true;
                oldMillisFade = millis();
                };
          //end 29/12...poi vedi alla fine
         
     
           //stampa data ed ora
          sprintf(buffer,  "%02d/%02d/%d", now.day(), now.month(), now.year());
          lcd.setCursor(0, 1);
          lcd.print("Data  ");
          lcd.print( buffer );
     
          char buffer[10] = "";
     
          sprintf(buffer,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
          lcd.setCursor(0, 0);
          lcd.print("Time   ");
          lcd.print( buffer );

          oldSecond = now.second();                //qsecofr: aggiorna i vecchi secondi
         
     
          // lettura analogica
          temperatura=analogRead(A0);
          lcd.setCursor(0, 2);
          lcd.print("Temp esterna ");
          lcd.print((5.0*temperatura*100.0)/1024.0);
          lcd.write(0b011011111);
          lcd.print("C");

     
     
          // lettura 1-wire...lenta ed in attesa.
          if (richiestaTemperatura == 0) {
                 sensors.requestTemperatures(); // Invia il comando di lettura delle temperatura... non è più bloccante quindi il risultato si avrà fra 750 millisecondi.
                 richiestaTemperatura = 1;   // questa variabile indica che ho richiesto una lettura della temperatura
                 oldMillis = millis();
           }
           
   
      }  //endif sono cambiati i secondi
     
     
      long ciccio = millis();
      if ((richiestaTemperatura == 1)
       {
         if (ciccio-oldMillis > 750) {
           {
           richiestaTemperatura = 0;
           lcd.setCursor(0, 3);
           lcd.print("Temp H2o");
           lcd.setCursor(10, 3);
           lcd.print (sensors.getTempCByIndex(0));
           lcd.print (" C");
           lcd.write(0b11011111);
          }
        }
   
   
   
    // 29/12
 
    if (fadeUp) {
      long ms = millis()-oldMillisFade;
      ms = ms / 10;    ' fa uno step ogni 10 millisecondi....il fade totale dura 2.55sec             
      if (ms > 254 )     
        { //fade up completo
          ms =255;     //whatch dog.. non credo serva ma è per sicurezza
          fadeUp = false;
     
        };
        analogWrite(CHEPORTA?,ms);
       
      };
     
     if (fadeDown) {
      long ms = millis()-oldMillisFade;
      ms = ms / 10;    ' fa uno step ogni 10 millisecondi....il fade totale dura 2.55sec             
      ms = 255-ms;
      if (ms < 1 )     
        { //fade up completo
          ms =0;     //whatch dog.. non credo serva ma è per sicurezza
          fadeDown = false;
     
        };
        analogWrite(CHEPORTA?,ms);
       
      };

 
 
   

  };

#31
Dec 29, 2012, 03:33 pm Last Edit: Dec 29, 2012, 03:59 pm by danidiscus Reason: 1
ancora una volta mi stupisce la tua reattività nel creare e rispondere alle mie domande,
ho caricato il code, mi da un errore credo sia una parentesi, ti allego:
Code: [Select]
        if (now.second==0 && !fadeUp) {

sketch_dec29k.ino: In function 'void loop()':
sketch_dec29k:68: error: invalid use of member (did you forget the '&' ?)
sketch_dec29k:72: error: invalid use of member (did you forget the '&' ?)
sketch_dec29k:118: error: expected `)' before '{' token
sketch_dec29k:161: error: expected statement at end of input
sketch_dec29k:161: error: expected `}' at end of input

PaoloP

#32
Dec 29, 2012, 04:45 pm Last Edit: Dec 29, 2012, 04:51 pm by PaoloP Reason: 1

ancora una volta mi stupisce la tua reattività nel creare e rispondere alle mie domande,
ho caricato il code, mi da un errore credo sia una parentesi, ti allego:
Code: [Select]
        if (now.second==0 && !fadeUp) {

sketch_dec29k.ino: In function 'void loop()':
sketch_dec29k:68: error: invalid use of member (did you forget the '&' ?)
sketch_dec29k:72: error: invalid use of member (did you forget the '&' ?)
sketch_dec29k:118: error: expected `)' before '{' token
sketch_dec29k:161: error: expected statement at end of input
sketch_dec29k:161: error: expected `}' at end of input



Correggi
Code: [Select]
now.second
con
Code: [Select]
now.second()

Poi qui
Code: [Select]
long ciccio = millis();
     if ((richiestaTemperatura == 1)
      {
        if (ciccio-oldMillis > 750) {

c'è una parentesi aperta di troppo dopo l'if.  :smiley-mr-green:

Ma che libreria RTC stai usando?
EDIT: Trovata--> http://www.futurashop.it/download/RTClib.zip  :smiley-mr-green:

PaoloP

#33
Dec 29, 2012, 04:58 pm Last Edit: Dec 29, 2012, 05:00 pm by PaoloP Reason: 1
Compila ma non ho idea se e come funzioni.
Ho messo il pin PWM numero 3 (cambia il define se non è quello)

Code: [Select]
#include <DallasTemperature.h>
#include <OneWire.h>
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal.h>
#define ONE_WIRE_BUS 8

#define PWMPORT 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float temperatura;
char buffer[10];
RTC_DS1307 RTC;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
bool fadeUp = false;            // 29/12
bool fadeDown = false;         // 29/12
byte ValorePorta = 0;
long  oldMillisFade=0;           // 29/12
byte oldSecond =0;       //QSECOFR
byte richiestaTemperatura=0;   //Qsecofr
long oldMillis; //qsecofr

void setup () {
  sensors.begin();
  Wire.begin();
  RTC.begin();
  lcd.begin(20, 4);
  RTC.sqw(1);
  if (! RTC.isrunning()) {
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
  // qsecofr: questa istruzione disattiva l'attesa della conversione
  sensors.setWaitForConversion(false);   
}

void loop () {
  DateTime now = RTC.now();
  //    delay(1000);        //QSECOFR
  if (oldSecond != now.second()) { //qsecofr sono cambiati i secondi...
    // 29/12    ...poi metterai anche i minuti e le ore...
    // fa scattare il fadeup quando i secondi dell'orologio sono a 0
    // fa scattare il fadedown quando i secondi dell'orologio sono a 30
    if (now.second()==0 && !fadeUp){
      fadeUp = true;
      oldMillisFade = millis();
    }
    if (now.second()==30 && !fadeDown)
    {
      fadeDown = true;
      oldMillisFade = millis();
    };
    //end 29/12...poi vedi alla fine

    //stampa data ed ora
    sprintf(buffer,  "%02d/%02d/%d", now.day(), now.month(), now.year());
    lcd.setCursor(0, 1);
    lcd.print("Data  ");
    lcd.print( buffer );
    char buffer[10] = "";
    sprintf(buffer,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
    lcd.setCursor(0, 0);
    lcd.print("Time   ");
    lcd.print( buffer );

    oldSecond = now.second();                //qsecofr: aggiorna i vecchi secondi

    // lettura analogica
    temperatura=analogRead(A0);
    lcd.setCursor(0, 2);
    lcd.print("Temp esterna ");
    lcd.print((5.0*temperatura*100.0)/1024.0);
    lcd.write(0b011011111);
    lcd.print("C");
    // lettura 1-wire...lenta ed in attesa.
    if (richiestaTemperatura == 0) {
      sensors.requestTemperatures(); // Invia il comando di lettura delle temperatura... non è più bloccante quindi il risultato si avrà fra 750 millisecondi.
      richiestaTemperatura = 1;   // questa variabile indica che ho richiesto una lettura della temperatura
      oldMillis = millis();
    }
  }  //endif sono cambiati i secondi

  long ciccio = millis();
  if (richiestaTemperatura == 1)
  {
    if (ciccio-oldMillis > 750) {
      {
        richiestaTemperatura = 0;
        lcd.setCursor(0, 3);
        lcd.print("Temp H2o");
        lcd.setCursor(10, 3);
        lcd.print (sensors.getTempCByIndex(0));
        lcd.print (" C");
        lcd.write(0b11011111);
      }
    }

    // 29/12

    if (fadeUp) {
      long ms = millis()-oldMillisFade;
      ms = ms / 10;    // fa uno step ogni 10 millisecondi....il fade totale dura 2.55sec             
      if (ms > 254 )     
      { //fade up completo
        ms =255;     //whatch dog.. non credo serva ma è per sicurezza
        fadeUp = false;
      }
      analogWrite(PWMPORT,ms);
    }

    if (fadeDown) {
      long ms = millis()-oldMillisFade;
      ms = ms / 10;    // fa uno step ogni 10 millisecondi....il fade totale dura 2.55sec             
      ms = 255-ms;
      if (ms < 1 )     
      { //fade up completo
        ms =0;     //whatch dog.. non credo serva ma è per sicurezza
        fadeDown = false;
      }
      analogWrite(PWMPORT,ms);
    }
  }
}

grazie per l'intervento, ora funziona, cavolo, sembrava meno ripida la strada arduino.
sarà che in questo periodo ho il cervello in pappa, ma non ci capisco più niente. bah!
:smiley-red:


immagino che la fase di fade poi duri qualche ora?


dovrebbe durare circa 40 minuti da 0 a 100% in accensione e più o meno in spegnimento da 100% a 0

qsecofr



immagino che la fase di fade poi duri qualche ora?


dovrebbe durare circa 40 minuti da 0 a 100% in accensione e più o meno in spegnimento da 100% a 0


non ti preoccupare per la strada ripida. l'importante è piuttosto che tu comprenda perchè ho fatto il codice così.

ora abbiamo impostato un codice che legge ora e temperatura correttamente e che riesce a lanciare i fade correttamente (e la modifica per farli funzionare a 40 minuti o a certi orari è veramente semplice). Immagino tu abbia un relay da attivare per scaldare l'acqua...anche se a suo tempo qualche uccellino mi ha detto che il problema è più che altro tenerla fredda d'estate... servono celle di peltier? hai altri relay?

io sinceramente vedo al tuo progetto 2 ostacoli: il primo è di fare un bel menu con le possibili impostazioni (orari di on off, cibo, settaggi temperatura eccetera)... imho non è esattamente banale da gestire ma suvvia: "lo si fa".
L'altro problema è hardware: il fade su fluorescente... decisamente diverso da un led... però proviamo: non so magari ci sono già i controlli quasi fatti.


ancora non ho i relay, ma sto cercando di capire pian pianino cosa serve, la vasca la sto allestendo da zero, intanto ho costruito il mobile, la vasca e stata ordinata aspetto che arrivi, ma visto che siamo sotto feste penso che arrivi il prossimo anno.
ora studio bene le funzioni che vorrei inserire, per il raffreddamento non serve perchè è una vasca di acqua dolce. non so se conosci la razza DISCUS

qsecofr


ancora non ho i relay, ma sto cercando di capire pian pianino cosa serve, la vasca la sto allestendo da zero, intanto ho costruito il mobile, la vasca e stata ordinata aspetto che arrivi, ma visto che siamo sotto feste penso che arrivi il prossimo anno.
ora studio bene le funzioni che vorrei inserire, per il raffreddamento non serve perchè è una vasca di acqua dolce. non so se conosci la razza DISCUS


azzarola: hai fatto quel mobile con le pietre da solo? bravo!

No purtroppo te l'ho detto conosco solo i pesci commestibili e l'unico pesce da acquario (neanche tanto) spacciato per commestibile sarebbe il pescetto rosso che è una carpa (se la memoria non mi inganna)... però se c'è un pesce veramente orrendo e difficile da mangiare è la carpa.
Ho guardato questi pesci: veramente bellissimi... ma fammi capire: tu li hai già allevati per il passato o stai provando ora? e domanda ignorante: c'è un pesce "facile" per approcciare questo hobby?
Andiamo al tuo progetto: ho letto che bisogna essere abbastanza precisi con ph e conducibilità: è vero? è determinante?... le buone notizie sono sulla conducibilià: con arduino è abbastanza facile: tieniti una analogica libera e procurati un elettrodo che li friggiamo  :smiley-mr-green:
...la brutta notizia è sul ph: sarebbe affascinante imho misurarlo ma le sonde costano una botta di soldi (ho visto che costano dai 70 euro in su quelli della hanna). Quando avevo 18 anni circa ne avevo costruita una artigianalmente ma mi ricordo che non era stabile nel tempo per via dei materiali impiegati allora... non era manco una cosa semplicissima: mi pare che serviva una membrana semipermeabile... che chiaramente non avevo).



#39
Dec 30, 2012, 11:57 am Last Edit: Dec 30, 2012, 12:11 pm by danidiscus Reason: 1


ancora non ho i relay, ma sto cercando di capire pian pianino cosa serve, la vasca la sto allestendo da zero, intanto ho costruito il mobile, la vasca e stata ordinata aspetto che arrivi, ma visto che siamo sotto feste penso che arrivi il prossimo anno.
ora studio bene le funzioni che vorrei inserire, per il raffreddamento non serve perchè è una vasca di acqua dolce. non so se conosci la razza DISCUS


azzarola: hai fatto quel mobile con le pietre da solo? bravo!

No purtroppo te l'ho detto conosco solo i pesci commestibili e l'unico pesce da acquario (neanche tanto) spacciato per commestibile sarebbe il pescetto rosso che è una carpa (se la memoria non mi inganna)... però se c'è un pesce veramente orrendo e difficile da mangiare è la carpa.
Ho guardato questi pesci: veramente bellissimi... ma fammi capire: tu li hai già allevati per il passato o stai provando ora? e domanda ignorante: c'è un pesce "facile" per approcciare questo hobby?
Andiamo al tuo progetto: ho letto che bisogna essere abbastanza precisi con ph e conducibilità: è vero? è determinante?... le buone notizie sono sulla conducibilià: con arduino è abbastanza facile: tieniti una analogica libera e procurati un elettrodo che li friggiamo  :smiley-mr-green:
...la brutta notizia è sul ph: sarebbe affascinante imho misurarlo ma le sonde costano una botta di soldi (ho visto che costano dai 70 euro in su quelli della hanna). Quando avevo 18 anni circa ne avevo costruita una artigianalmente ma mi ricordo che non era stabile nel tempo per via dei materiali impiegati allora... non era manco una cosa semplicissima: mi pare che serviva una membrana semipermeabile... che chiaramente non avevo).




Ebbene si, nella realizzazione  manuale vado piuttosto bene, mi frega la teoria, come hai già potuto capire.
si il pesce rosso appartiene alla famiglia delle carpe, e si li allevavo in passato, prima di trasferirmi, per l'approccio di questo mondo non è difficile, bisogna rispettare alcune regole, mentre per i DISCUS la cosa cambia un po, anche se sono rimasto indietro , e leggendo ho scoperto di allevamenti che accrescono e allevano i DISCUS in acque normali, solitamente vogliono acque di OSMOSI con PH basso 6,5/7 conducibilità bassa 150 250 micro.
Quindi si può realizzare un misuratore di conducibilità facilmente? cosa serve ? per il PH credo che prenderò un misuratore a tascabile, oppure userò i reagenti, possiedo già uno della hanna dovrei cambiare la sonda, che come hai già detto costa un botto.
ti allego due foto della realizzazione del mobile, un lavoraccio durato quasi tre settimane, fuori al freddo a -2°  =(
cmq ancora grazie per il tuo aiuto, sei una persona gentilissima
ps se ti va dimmi il tuo nome così mi viene più facile salutari  XD

qsecofr

roberto è il nome.
si la conducibilità è abbastanza semplice: in pratica si tratta di misurare gli ohm tra due elettrodi (che assumiamo che troverai inossidabili...il codice ed il sistema si trova con google facilmente)... unica avvertenza è di misurare gli ohm per brevissimi intervalli altrimenti cominci a fare elettrolisi dell'acqua... anche i normali tester multifunzione che sono in giro non vanno molto bene per lo scopo proprio perchè dopo pochi istanti cominci a vedere importanti variazioni negli ohm.
Serve per capire quanti sali sono disciolti in acqua: per esempio il sale da cucina ha ph sostanzialmente 7 come l'acqua... è neutro diciamo... quindi con un semplice phametro non capisci quanto sale hai nell'acqua: lo puoi capire solo se misuri la resistenza dell'acqua in quanto il sale discolto si dissocia rendendo conduttiva l acqua... è molto importante se fai soluzioni fisiologiche... per i pesci speravo sinceramente che fossero un po' più do bocca buona ma vedo che la cosa interessa...

per aggiungere l'accensione e lo spegnimento ad un orario stabilito, devo lavorare in queste righe, giusto?
Code: [Select]
void loop () {
  DateTime now = RTC.now();
  //    delay(1000);        //QSECOFR
  if (oldSecond != now.second()) { //qsecofr sono cambiati i secondi...
    // 29/12    ...poi metterai anche i minuti e le ore...
    // fa scattare il fadeup quando i secondi dell'orologio sono a 0
    // fa scattare il fadedown quando i secondi dell'orologio sono a 30
    if (now.second()==0 && !fadeUp){
      fadeUp = true;
      oldMillisFade = millis();
    }
    if (now.second()==30 && !fadeDown)
    {
      fadeDown = true;
      oldMillisFade = millis();
    };
    //end 29/12...poi vedi alla fine

qsecofr


    if ((now.second()==secStart)  && (now.minute()==minStart)  && (now.hour()==oraStart) && !fadeUp)
                   




    if ((now.second()==secStart)  && (now.minute()==minStart)  && (now.hour()==oraStart) && !fadeUp)
                   



Code: [Select]
if ((now.second()==0)  && (now.minute()==23)  && (now.hour()==00) && !fadeUp){
      fadeUp = true;
      oldMillisFade = millis();
    }
    if ((now.second()==0)  && (now.minute()==26)  && (now.hour()==00) && !fadeDown)
    {
      fadeDown = true;
      oldMillisFade = millis();

ok?
ora dimmi se è corretto questo passaggio "per favore :-)"
Code: [Select]
if (fadeUp) {
      long ms = millis()-oldMillisFade;
      ms = ms / 10;    // fa uno step ogni 10 millisecondi....il fade totale dura 2.55sec             
      if (ms > 254 )     
      { //fade up completo
        ms =255;     //whatch dog.. non credo serva ma è per sicurezza
        fadeUp = false;
      }
      analogWrite(PWMPORT,ms);
    }

    if (fadeDown) {
      long ms = millis()-oldMillisFade;
      ms = ms / 10;    // fa uno step ogni 10 millisecondi....il fade totale dura 2.55sec             
      ms = 255-ms;
      if (ms < 1 )     
      { //fade up completo
        ms =0;     //whatch dog.. non credo serva ma è per sicurezza
        fadeDown = false;
      }
      analogWrite(PWMPORT,ms);

in questo caso il led passa da 0 a 100% in 2,55 secondi,
se volessi modificare la durata devo cambiare così?
Code: [Select]
if (fadeUp) {
      long ms = millis()-oldMillisFade;
      ms = ms / 7050;    // fa uno step ogni 10 millisecondi....il fade totale dura 2.55sec             
      if (ms > 254 )     
      { //fade up completo
        ms =255;     //whatch dog.. non credo serva ma è per sicurezza
        fadeUp = false;
      }
      analogWrite(PWMPORT,ms);
    }

    if (fadeDown) {
      long ms = millis()-oldMillisFade;
      ms = ms / 7050;    // fa uno step ogni 10 millisecondi....il fade totale dura 2.55sec             
      ms = 255-ms;
      if (ms < 1 )     
      { //fade up completo
        ms =0;     //whatch dog.. non credo serva ma è per sicurezza
        fadeDown = false;
      }
      analogWrite(PWMPORT,ms);

cosi i tempi si allungano in quasi 30 minuti,per essere precisi in 29,9625 sec.
ti prego dimmi che è giusto   :smiley-roll:

qsecofr

si: attenzione solo di non sovrapporre la fase di fadeup a quella di fadedown se no viene fuori un casino... quindi tieni sempre più di mezz'ora tra le due fasi.... non lo stai facendo.

Ho letto che c'è gente che usa al posto delle lampade fluorescenti delle righe di led: sicuramente sarebbe più semplice da controllare (e sicuramente più costoso) ma mi chiedo: i led hanno le giuste frequenze? che luce abbisognano questi pesci?

Go Up