Mi rimetto nelle vostre mani perchè:
Sono in possesso di un Seeduino stalker v2 con rtc incluso RTC Chip (RX8025), mi reputo un noob poichè sono un perito informatico ma le ultime stringe di c/c++ risalgono a ormai 6 anni fa abbondanti.
COn soddisfazione ho montato e sono riuscito a farci funzionare una led strip e applicarti un fading dei led , ora per finire il mio progetto e riabbandonare la programmazione per altri 6/7 anni vorrei potere gestire il fading in maniera progressiva cioè
ore 22 inizia il fading
ore 23 led + accentuati
etc etc
ore 02 led massima potenza
ore 06 fine del fading
il tutto in maniera automatica poichè quando riuscirò a fare questo potrò aggiungere altre strip per il giorno
il MIO grosso problema è che nemmeno gli sketch più semplici di serial.print mi funzionano, se ne faccio di semplici tipo il print di un carattere ASCII tutto ok, ma gg mese e anno Niente.
Ho spulciato arduino en. ma il risultato è 6hr oggi , un gran mal di testa e un pacchetto di sigarette andato ma nulla
ma con il RTC ti sei interfacciato? che problemi ai riscontrato...così come l'hai messa giù, a parte come vuoi comandare le LED strip il resto non l'ho capito!
example code illustrating Time library set through serial port messages.
Messages consist of the letter T followed by ten digit time (as seconds since Jan 1 1970)
you can send the text on the next line using Serial Monitor to set the clock to noon Jan 1 2010
T1262347200
A Processing example sketch to automatically send the messages is inclided in the download
*/
#include <Time.h>
#define TIME_MSG_LEN 11 // time sync to PC is HEADER followed by unix time_t as ten ascii digits #define TIME_HEADER ‘T’ // Header tag for serial time sync message #define TIME_REQUEST 7 // ASCII bell character requests a time sync message
void setup() {
Serial.begin(9600);
setSyncProvider( requestSync); //set function to call when sync required
Serial.println(“Waiting for sync message”);
}
void loop(){
if(Serial.available() )
{
processSyncMessage();
}
if(timeStatus()!= timeNotSet)
{
digitalWrite(13,timeStatus() == timeSet); // on if synced, off if needs refresh
digitalClockDisplay();
}
delay(1000);
}
void digitalClockDisplay(){
// digital clock display of the time
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.print(" “);
Serial.print(day());
Serial.print(” “);
Serial.print(month());
Serial.print(” ");
Serial.print(year());
Serial.println();
}
void printDigits(int digits){
// utility function for digital clock display: prints preceding colon and leading 0
Serial.print(":");
if(digits < 10)
Serial.print(‘0’);
Serial.print(digits);
}
void processSyncMessage() {
// if time sync available from serial port, update time and return true
while(Serial.available() >= TIME_MSG_LEN ){ // time message consists of a header and ten ascii digits
char c = Serial.read() ;
Serial.print(c);
if( c == TIME_HEADER ) {
time_t pctime = 0;
for(int i=0; i < TIME_MSG_LEN -1; i++){
c = Serial.read();
if( c >= ‘0’ && c <= ‘9’){
pctime = (10 * pctime) + (c - ‘0’) ; // convert digits to a number
}
}
setTime(pctime); // Sync Arduino clock to the time received on the serial port
}
}
}
time_t requestSync()
{
Serial.print(TIME_REQUEST,BYTE);
return 0; // the time will be sent later in response to serial mesg
}
è già un passo avanti
con questo codice riesco a ricevere informazioni però come tolgo l’alimentazione torna tutto a zero…
ora vorrei capire come fare per mantenere la data visto che in teoria un modo c’è sennò che senso ha un chip rtc?!
Ah, ok, non conoscevo questo shield; in effetti molti usano un super-condensatore come sistema di backup, ma per che autonomia è garantito? Se togli l'alimentazione e la ridai all'istante si azzera lo stesso?
menniti:
Ah, ok, non conoscevo questo shield; in effetti molti usano un super-condensatore come sistema di backup, ma per che autonomia è garantito? Se togli l'alimentazione e la ridai all'istante si azzera lo stesso?
purtroppo si, ora è questa cosa che mi fa imbestialire, ma sopratutto non dovrebbe esser l'rtc a darmi i valori invece che io a dargli lo start?
No quello che dice Leo è normale se il tuo RTC perde l'ora, ovvio che in apparenza il condensatore non sta facendo il suo lavoro, controlla che non ci sia da attivare qualche jumper; in alternativa prova a collegare al volo una piccola vera batteria in parallelo al condensatore e vedi cosa succede. Se l'RTC riesce a mantenere l'ora ovvio che non hai più necessità di aggiornarlo.
no, l'ora la setti solo quando, causa scarica del condensatore/batteria, l'RTC si azzera.
Scusa, ma hai provato a verificare se il condensatorone funziona? misura col tester il voltaggio tra il catodo del condensatore(indicato dalla striscia bianca) e gnd, dovrebbe essere 3 o 5v
lesto:
no, l’ora la setti solo quando, causa scarica del condensatore/batteria, l’RTC si azzera.
Scusa, ma hai provato a verificare se il condensatorone funziona? misura col tester il voltaggio tra il catodo del condensatore(indicato dalla striscia bianca) e gnd, dovrebbe essere 3 o 5v
fino a domani rimarraà un mistero, ora ho un dubbietto che mi assilla prima di andare a letto, dubbietto che se risolto apparte la pila penso di aver finito il lavoro
dovrei tirar fuori 3 variabili dal sorgente superiore per unirle a un altro
che vuoi fare puntare le variabili? nono tira fuori il libro che è meglio (senza offesa, son ostici a molti i puntatori) :)
Se non ho capito male vuoi mettere le variabili dentro ad un array. Puoi farlo attraverso i puntatori, ore min sec li trasformi in puntatori, ognuno che punta alla sua celletta dell'array, però poi nel codice attuale devi cambiare ogni volta che usi le tre variabili in modo che abbiano il * davanti, perchè lavori con il valore e non con l'indirizzo.. cambiare per cambiare, tanto vale combiare tutto per usare direttamente l'array, così non chiami in causa (direttamente ;) ) i puntatori
lesto:
che vuoi fare puntare le variabili? nono tira fuori il libro che è meglio (senza offesa, son ostici a molti i puntatori)
Se non ho capito male vuoi mettere le variabili dentro ad un array. Puoi farlo attraverso i puntatori, ore min sec li trasformi in puntatori, ognuno che punta alla sua celletta dell’array, però poi nel codice attuale devi cambiare ogni volta che usi le tre variabili in modo che abbiano il * davanti, perchè lavori con il valore e non con l’indirizzo… cambiare per cambiare, tanto vale combiare tutto per usare direttamente l’array, così non chiami in causa (direttamente ) i puntatori
#include <Time.h>
#define TIME_MSG_LEN 11 // time sync to PC is HEADER followed by unix time_t as ten ascii digits
#define TIME_HEADER 'T' // Header tag for serial time sync message
#define TIME_REQUEST 7 // ASCII bell character requests a time sync message
int ledPin = 9; // Dichiara il PIN di arduino incaricato di gestire il fading
int fadeValue = 0;
void setup() {
Serial.begin(9600);
setSyncProvider( requestSync); //set function to call when sync required
Serial.println("Waiting for sync message");
}
void loop(){
if(Serial.available() )
{
processSyncMessage();
}
if(timeStatus()!= timeNotSet)
{
digitalWrite(13,timeStatus() == timeSet); // on if synced, off if needs refresh
digitalClockDisplay();
}
delay(1000);
/*
// Esegue un aumento progressivo della luminosità da 0 a 255 (massimo) con step di 5 punti
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
// Invia il valore al mosfet (0-255):
analogWrite(ledPin, fadeValue);
// Attende 30 millisecondi prima in modo da poter visualizzare l'effetto di dimmeraggio
delay(30);
}
// Esegue una diminuzione progressiva della luminosità da 255 a 0 (massimo) con step di -5 punti
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
// Invia il valore al mosfet (0-255):
analogWrite(ledPin, fadeValue);
// Attende 30 millisecondi prima in modo da poter visualizzare l'effetto di dimmeraggio
delay(30);
*/
if (hour()==22 && minute()==10 && second()==0) {//inizio creazione fase lunare
for(int fadeValue = 0 ; fadeValue <=5; fadeValue +=5)
analogWrite(ledPin, fadeValue);
}
if (hour()==23 && minute()==00 && second()==0) {
for(int fadeValue = 00 ; fadeValue <=5; fadeValue +=15)
analogWrite(ledPin, fadeValue);
}
if (hour()==23 && minute()==50 && second()==0) {
for(int fadeValue = 15 ; fadeValue <=20; fadeValue +=15)
analogWrite(ledPin, fadeValue);
}
if (hour()==00 && minute()==40 && second()==0) {
for(int fadeValue = 30 ; fadeValue <=40; fadeValue +=15)
analogWrite(ledPin, fadeValue);
}
if (hour()==01 && minute()==30 && second()==0) {
for(int fadeValue = 45 ; fadeValue <= 50; fadeValue +=15)
analogWrite(ledPin, fadeValue);
}
if (hour()==02 && minute()==20 && second()==0) {
for(int fadeValue = 60 ; fadeValue <= 70; fadeValue ==60)
analogWrite(ledPin, fadeValue);
}
if (hour()==03 && minute()==10 && second()==0) {
for(int fadeValue = 60 ; fadeValue <= 70; fadeValue -=15)
analogWrite(ledPin, fadeValue);
}
if (hour()==04 && minute()==00 && second()==0) {
for(int fadeValue = 45 ; fadeValue >= 40; fadeValue -=15)
analogWrite(ledPin, fadeValue);
}
if (hour()==04 && minute()==50 && second()==0) {
for(int fadeValue =30 ; fadeValue >= 25; fadeValue -=15)
analogWrite(ledPin, fadeValue);
}
if (hour()==05 && minute()==40 && second()==0) {
for(int fadeValue = 15 ; fadeValue >= 5; fadeValue -=15)
analogWrite(ledPin, fadeValue);
}
if (hour()==06 && minute()==00 && second()==0) {
for(int fadeValue = 20 ; fadeValue >= 15; fadeValue -=0)
analogWrite(ledPin, fadeValue);
}
}
void digitalClockDisplay(){
// digital clock display of the time
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.print(" ");
Serial.print(day());
Serial.print(" ");
Serial.print(month());
Serial.print(" ");
Serial.print(year());
Serial.println();
}
void printDigits(int digits){
// utility function for digital clock display: prints preceding colon and leading 0
Serial.print(":");
if(digits < 10)
Serial.print('0');
Serial.print(digits);
}
void processSyncMessage() {
// if time sync available from serial port, update time and return true
while(Serial.available() >= TIME_MSG_LEN ){ // time message consists of a header and ten ascii digits
char c = Serial.read() ;
Serial.print(c);
if( c == TIME_HEADER ) {
time_t pctime = 0;
for(int i=0; i < TIME_MSG_LEN -1; i++){
c = Serial.read();
if( c >= '0' && c <= '9'){
pctime = (10 * pctime) + (c - '0') ; // convert digits to a number
}
}
setTime(pctime); // Sync Arduino clock to the time received on the serial port
}
}
}
time_t requestSync()
{
Serial.print(TIME_REQUEST,BYTE);
return 0; // the time will be sent later in response to serial mesg
}
codice pressochè ultimato, settando il T tutte le volte funziona MA se levo corrente ( anche con una lipo attaccata al relativo spinotto) non mi mantiene data e ora
domani sarà la sfida perchè risolto questo ho risolto tutti
per le variabili ho risolto con quelle di sistema!
mettendo anche la lipo? mi sembra strano, ma finchè non metti un voltometro sull'entrata dell'RTC per controllare se alimentato (e magari controlla pure se ha un ingresso reset che inavvertitamente viene azionato)
comuqnue la soluzione con tutti quegli IF mi pare bruttissima.
tanto per cominciare, il tempo trascorso dell'RTC se non erro ti arriva in secondi dal 1-1-1900 a mezzanote esatta(timestamp), e il tuo processo si deve ripetere ogni 50 minuti (ovvero 3000secondi esatti)
quindi basterebbe fare:
timestamp%3000==0
in realtà se == 0 allora prenderebbe come punto di riferimento la mezzanotte precisa. Ma visto che tu vuoi partire dalla mezzanotte e 10 minuti, 10 minuto sono 600 secondi, quindi
if ( timestamp%3000==600 ){
//accendi il led
}
similarmente puoi escludere gli intervalli di tempo che non ti interessano, e usando il / invece che il %, otteresti un valore che puoi usare per capire a che intensità devi far accendere il led.
ma queste son complicazioni per quando avremo risolto, e se hai voglia di imparare a sbattere la testa sulle cose, in fondo è più matematica che programmazione, anche se molto basica.
menniti:
Ah, ok, non conoscevo questo shield; in effetti molti usano un super-condensatore come sistema di backup, ma per che autonomia è garantito? Se togli l'alimentazione e la ridai all'istante si azzera lo stesso?