Go Down

Topic: problema a far rimanere data e ora corretta su rtc (Read 10341 times) previous topic - next topic

marco3020

Si ho cancellato vecchia libreria e messa questa consigliata ma da errore come si vede non riconosce hour, month ecc

cyberhs

Per verificare che la libreria sia correttamente installata, prova uno degli sketch di esempio.

marco3020

fatto la libreria va ma se invece di rtc millis uso quello che hai detto tu non va nel senso va avnati nel tempo, anche se riflesho una sola volta appena stacco usb lui va avanti nel tempo

cyberhs

Nel setup inserisci questa righe:
Code: [Select]
  RTC.begin();                                     // initialize RTC

  if (! RTC.isrunning()) {
    RTC.adjust(DateTime(__DATE__, __TIME__));      // sets RTC to the compilation date/time
  }

marco3020


marco3020

buongiorno ho sistemato lo sketch cosi:
Code: [Select]
#include <PCF8574_HD44780_I2C.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <RTClib.h>

RTC_DS1307 RTC;

PCF8574_HD44780_I2C lcd(0x3F, 20, 4);



int oraAlba = 9;
int minAlba = 10;
long albas;
int durataAlbas = 720;
int oraTramonto = 17;
int minTramonto = 10;
long tramontos;
int durataTramontos = 720;
long nows;
int delayR = 0;
int delayG = 120;
int delayB = 240;
int delayUV = 300;
int delayW = 360;

int pinR = 2;
int pinG = 3;
int pinB = 4;
int pinW = 5;
int pinUV = 6;

//rele
float rele1 = 35;
float rele2 = 37;
int   rele3 = 39;
int rele4 = 41;
int rele5 = 43;

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

float riscaldatore = 22.0; // allerta temperatura acqua bassa
float alertacqua = 26.0; // ventola tangenziale
float alertplafo = 44.0;  // alerta plafoniera temperatura troppo alta
float tempSoglia = 38.0; //temperatura ventole plafo

#define ONE_WIRE_BUS 7
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress tmp_address;
float temp0=0;
float temp1=0;
int numberOfDevices;

#define VENTOLA 35
#define TANG 37
#define SKIM 39
#define PUMP 41
#define PUMP1 43
#define RISC 45

void setup()
{

 
  lcd.init();           // LCD Initialization
  lcd.backlight( );      // Backlight ON
  lcd.clear();          // Clear the display

  numberOfDevices = 1;
 
  Serial.begin(9600);
  Wire.begin();


  sensors.begin();

  pinMode(pinR, OUTPUT);
  pinMode(pinG, OUTPUT);
  pinMode(pinB, OUTPUT);
  pinMode(pinW, OUTPUT);
  pinMode(pinUV, OUTPUT);

  pinMode(rele1, OUTPUT);
  pinMode(rele2, OUTPUT);
  pinMode(rele3, OUTPUT);
  pinMode(rele4, OUTPUT);
  pinMode(rele5, OUTPUT);
 
  pinMode(VENTOLA, OUTPUT);
  pinMode(TANG, OUTPUT);
 
  pinMode(RISC, OUTPUT);
  pinMode(SKIM, OUTPUT);
  pinMode(PUMP, OUTPUT);
  pinMode(PUMP1, OUTPUT);
 
  digitalWrite( rele1, LOW );
  digitalWrite( rele2, LOW );
  digitalWrite( rele3, HIGH );
  digitalWrite( rele4, LOW );
  digitalWrite(rele5, LOW);
 
///////////////////////////// SETTAGGIO ORA ////////////////////////////////////
 /*
Come settare correttamente ora:
1) compilare lo sketch con quella riga , a) oppure b)
2) flashare l'Arduino con quello sketch, in modo che lo sketch regoli l'RTC
3) ricompilare lo sketch SENZA quella riga
4) riflashare l'Arduino con il nuovo sketch

Ora puoi fare tutti gli stacchi che vuoi e l'RTC andrà per conto suo correttamente.*/

RTC.begin();

if (! RTC.isrunning()){
   
  // RTC.adjust(DateTime(__DATE__, __TIME__)); // settaggio ora automatico b)
   //RTC.begin(DateTime(__DATE__, __TIME__));
}
/////////////////////////////////////////////////////////////////////////////////// 

delay(3000);
}



void loop() {

  if (millis() > 500000) {
    digitalWrite(SKIM, LOW);
}
 
 
  // prendo ora attuale
  DateTime now = RTC.now();
  sprintf(buffer1,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
  lcd.setCursor(0,0);
  lcd.print( buffer1 );
 
  sprintf(buffer2,  "%02d/%02d/%d", now.day(), now.month(), now.year());
  lcd.setCursor(0,1);
  lcd.print( buffer2 );
  Serial.println(buffer1);
  Serial.println(buffer2);

  // Richiesta temperatura
sensors.requestTemperatures(); // Comando per misurare la temp.
  temp0 = sensors.getTempCByIndex(0);
  lcd.setCursor(0,2); // Colonna 0, Riga 0
  lcd.print("acqua:");
  lcd.setCursor (6, 2);
  lcd.print(temp0);
 
  temp1 = sensors.getTempCByIndex(1);
  lcd.setCursor (0,3); //Colonna 0, Riga 1
  lcd.print("plafo:");
  lcd.setCursor (6,3);
  lcd.print(temp1);
 
 
 
//PLAFONIERA =TEMP1 vetole
 
  if (temp1 > tempSoglia - 0.2 and - 0.6 ) {
    digitalWrite(VENTOLA, LOW);
  }
  if (temp1  < tempSoglia + 0.2 and + 0.6) {
    digitalWrite(VENTOLA, HIGH);
    }

// ventola tangenziale
 
   if (temp0 > alertacqua - 0.1 and - 0.6) {
    digitalWrite(TANG, LOW);
   }
   if (temp0 < alertacqua + 0.1 and + 0.6) {
  digitalWrite(TANG, HIGH);
   }
// riscaldatore

if (temp0> riscaldatore + 1.0 and  +4.0 ) {
  digitalWrite (RISC, LOW);
}

if (temp0< riscaldatore - 1.0 and  - 4.0 ){
 digitalWrite (RISC, HIGH);

}

 
  // Calcolo inizio alba in secondi
  albas = oraAlba * 3600 + minAlba * 60;

  // Calcolo inizio tramonto in secondi
  tramontos = oraTramonto * 3600 + minTramonto * 60;


  // Calcolo attuale in secondi
  nows = now.hour() * 3600 + now.minute() * 60 + now.second();


  // Notte
  if (nows < albas || nows > tramontos + durataTramontos) {
   
    digitalWrite(pinR, LOW);
    digitalWrite(pinG, LOW);
    digitalWrite(pinB, LOW);
    digitalWrite(pinUV, LOW);
    digitalWrite(pinW, LOW);
   
   
    digitalWrite(PUMP, LOW);
    digitalWrite(PUMP1, HIGH);

}

  // Alba
  if (nows > albas && nows + delayR < albas + durataAlbas) {
    analogWrite(pinR, 65 * (float)(((albas + durataAlbas) - nows) / (durataAlbas - delayR)));
  }
  if (nows > albas && nows + delayG < albas + durataAlbas) {
    analogWrite(pinG, 65 * (float)(((albas + durataAlbas) - nows) / (durataAlbas - delayG)));
  }
  if (nows > albas && nows + delayB < albas + durataAlbas) {
    analogWrite(pinB, 65 * (float)(((albas + durataAlbas) - nows) / (durataAlbas - delayB)));
  }
  if (nows > albas && nows + delayUV < albas + durataAlbas) {
    analogWrite(pinUV, 65 * (float)(((albas + durataAlbas) - nows) / (durataAlbas - delayUV)));
  }
  if (nows > albas && nows + delayW < albas + durataAlbas) {
    analogWrite(pinW, 65 * (float)(((albas + durataAlbas) - nows) / (durataAlbas - delayW)));
  }

  // Giorno
  if (nows > albas + durataAlbas && nows < tramontos) {
    digitalWrite(pinR, HIGH);
    digitalWrite(pinG, HIGH);
    digitalWrite(pinB, HIGH);
    digitalWrite(pinUV, HIGH);
    digitalWrite(pinW, HIGH);
    digitalWrite(PUMP,HIGH);
    digitalWrite (PUMP1,LOW);

}

 
   if ( temp1 > alertplafo + 0.2 and + 0.6 ) {
   digitalWrite(pinR, LOW);
   digitalWrite(pinG, LOW);
   digitalWrite(pinB, LOW);
   digitalWrite(pinUV, LOW);
   digitalWrite(pinW, LOW);
   

   
 
}
 
  // Tramonto
  if (nows > tramontos && nows + delayR < tramontos + durataTramontos) {
    int v = 65 - (65 * (float)(((tramontos + durataTramontos) - nows) / (durataTramontos - delayR)));
    analogWrite(pinR, v);
  }
  if (nows > tramontos && nows + delayG < tramontos + durataTramontos) {
    int v = 65 - (65 * (float)(((tramontos + durataTramontos) - nows) / (durataTramontos - delayG)));
    analogWrite(pinG, v);
  }
  if (nows > tramontos && nows + delayB < tramontos + durataTramontos) {
    int v = 65 - (65 * (float)(((tramontos + durataTramontos) - nows) / (durataTramontos - delayB)));
    analogWrite(pinB, v);
  }
  if (nows > tramontos && nows + delayUV < tramontos + durataTramontos) {
    int v = 65 - (65 * (float)(((tramontos + durataTramontos) - nows) / (durataTramontos - delayUV)));
    analogWrite(pinUV, v);
  }
  if (nows > tramontos && nows + delayW < tramontos + durataTramontos) {
    int v = 65 - (65 * (float)(((tramontos + durataTramontos) - nows) / (durataTramontos - delayW)));
    analogWrite(pinW, v);
  }

  }








il commando lo prendi  tutto ma quando stacco usb va avanti nel tempo

cyberhs

Perché hai commentato l'istruzione RTC.adjust(DateTime(__DATE__, __TIME__)); ?

Quote
uando stacco usb va avanti nel tempo
Cosa significa questa frase? L'orologio "va avanti"? Se sì, di quanto?

marco3020

#22
Aug 25, 2015, 09:32 pm Last Edit: Aug 25, 2015, 09:35 pm by marco3020
Anche senza commento non va cmq, se stacco USB l'orologio dice 6.20 del 2106

cyberhs

Hai provato a fare la stessa cosa con uno degli sketch esempio?

Se il risultato è lo stesso, potrebbe esse un falso contatto della batteria sul suo porta batteria: mi è capitato ed ho risolto dopo alcuni reinserimenti della batteria nel suo alloggiamento!

marco3020

Si e con lo sketch esempii va tranquillo e con il moo che da problemi.  Il gnd e il VCC del rtc devono essere collegati direttamente su Arduino?, io ho preso i due fili gnd e vcc e li ho messi su una basetta e da li ho collegato gnd e vcc rtc, lcd, e sensori e rele. Come testo con il tester se c'è corrente su RTC ?

cyberhs

Se lo sketch di esempio funziona, il tuo RTC è a posto.

Il problema deve essere nel tuo sketch.

Forse il problema è nell'uso di sprintf().

Prova ad usare dei semplici print senza formattazione solo per vedere se ti da lo stesso tipo di errore. 

marco3020

Del tipo? Ma come controllo se arriva alimentazione su RTC?

cyberhs

Lo RTC funziona anche senza alimentazione, controlla lo sketch dove visualizzi l'anno.

marco3020

Si ma come faccio a capire se li arriva alimentazione?

marco3020

Buongiorno a tutti ieri ho provato  a pulire i contatti dell rtc, poi ho caricato la libreria  DS1307 e time.h e nei due esempi mi dice rtc ok non so più che fare cambio rtc?

Go Up