Alba, tramonto e rabbocaggio acqua: codice giusto?

Salve, sono nuovo del forum, e non avendo trovato un topic apposito per presentarsi, mi presento qui.
Premetto che non conosco molto bene Arduino, essendo che l’ho provato per la prima volta poco più di una settimana fa’ e quindi per quanto riguarda la programmazione sono abbastanza scarso e invece per la parte dei ciercuiti c’è mio padre che non è esperto ma se ne intende abbastanza.
Noi abbiamo in casa un acquario e pensavamo di cambiare le lampade fra un po’ e mettere quelle a led.
Quindi arduino dovrebbe simulare un alba di x tempo, poi lasciare accesi i led a manetta per un altro po’ di tempo, poio il tramonto e poi la notte.
Dopodichè ho aggiunto un interruttore a 3 fasi, che nella prima fase esegue il programma normalmente, nella seconda tiene fisse le luci al massimo(senza interrompere il ciclo), e nella terza spegne le luci(sempre senza interrompere il ciclo).
Poi adesso ho provato ad aggiungerci il sistema di rabbocaggio dell’acqua e anche quiesto deve funzionare senza bloccare il ciclo.
Comunque io ho scritto un codice che sembra fare tutto quello che speravo, ma il codice è bello lungo e premettendo che non voglio usare librerie aggiuntive tipo “metro”, “datatime”… volevo sapere cosa potre i fare per accorciare il codice(senza rivoluzionarlo completamente).
Ecco il codice:

int led_pin =  10;
int led_water =  13;
int button_off = 2;
int button_on = 3;
int button_water = 4;
int buttonState = 0;
int buttonState2 = 0;
int buttonState3 = 0;

void setup()   {                
      Serial.begin(9600);
      pinMode(led_pin, OUTPUT);
      pinMode(button_on, INPUT);
      pinMode(button_off, INPUT);
      pinMode(button_water, INPUT);
}

void loop(){
   
for (int led_value_increment=0; led_value_increment <= 255; led_value_increment++)  {
         Serial.print("ALBA - ");
         Serial.println(led_value_increment);
         buttonState3 = digitalRead(button_water);
        if (buttonState3 == HIGH){
         digitalWrite(led_water, HIGH);
         Serial.println("Rabbocco acqua");
}
        else{
         digitalWrite(led_water, LOW);
} 
        buttonState = digitalRead(button_on);
        buttonState2 = digitalRead(button_off);
       if (buttonState == HIGH) {
        analogWrite(led_pin, 254);
          delay(100);  
}      
       else if (buttonState2 == HIGH) {
        analogWrite(led_pin, 0);
          delay(100);  
   }    
       else{
         analogWrite(led_pin, led_value_increment);
          delay(100);
   }
}



for (int led_value_time_day=0; led_value_time_day <= 255; led_value_time_day++)  {
         Serial.print("GIORNO - ");
         Serial.println(255);
          buttonState3 = digitalRead(button_water);
        if (buttonState3 == HIGH){
         digitalWrite(led_water, HIGH);
         Serial.println("Rabbocco acqua");
}
        else{
         digitalWrite(led_water, LOW);
} 
        buttonState = digitalRead(button_on);
        buttonState2 = digitalRead(button_off);
       if (buttonState == HIGH) {
        analogWrite(led_pin, 254);
          delay(100);  
}      
       else if (buttonState2 == HIGH) {
        analogWrite(led_pin, 0);
          delay(100);  
   }    
       else{
         analogWrite(led_pin, 255);
          delay(100);
   }
}



for (int led_value_decrement=255; led_value_decrement >= 0; led_value_decrement--)  {
         Serial.print("TRAMONTO - ");
         Serial.println(led_value_decrement);
          buttonState3 = digitalRead(button_water);
        if (buttonState3 == HIGH){
         digitalWrite(led_water, HIGH);
         Serial.println("Rabbocco acqua");
}
        else{
         digitalWrite(led_water, LOW);
} 
        buttonState = digitalRead(button_on);
        buttonState2 = digitalRead(button_off);
       if (buttonState == HIGH) {
        analogWrite(led_pin, 254);
          delay(100);  
}      
       else if (buttonState2 == HIGH) {
        analogWrite(led_pin, 0);
          delay(100);  
   }    
       else{
         analogWrite(led_pin, led_value_decrement);
          delay(100);
   }
}



for (int led_value_time_night=0; led_value_time_night <= 255; led_value_time_night++)  {
         Serial.print("NOTTE - ");
         Serial.println(0);
          buttonState3 = digitalRead(button_water);
        if (buttonState3 == HIGH){
         digitalWrite(led_water, HIGH);
         Serial.println("Rabbocco acqua");
}
        else{
         digitalWrite(led_water, LOW);
} 
        buttonState = digitalRead(button_on);
        buttonState2 = digitalRead(button_off);
       if (buttonState == HIGH) {
        analogWrite(led_pin, 254);
          delay(100);  
}      
       else if (buttonState2 == HIGH) {
        analogWrite(led_pin, 0);
          delay(100);  
   }    
       else{
         analogWrite(led_pin, 0);
          delay(100);
   }
}
}

Se il codice è troppo macchinoso e ho proprio sbagliato il principio ditemelo che lo rifaccio da zero, magari consigliandomi qualche comando utile per quello che voglio fare, ma comunque credo che troverò sul forum. Grazie mille.

Andrea

PS: Prima che qualcuno me lo chieda, i valori dei tempi, delle luci e delle altre cose sono a casaccio perchè non conosco i voltaggi che richiederanno i led e gli altri parametri.
Pensavo di metterci una batteria tampone(già testata, funziona)così se va via la corrente il ciclo continua e quindi dopo il primo avvio che dovrò fare nel momento in cui dovrà iniziare l’alba il programma sarà completamente autonomo.

Onestamente mi sembra un po' incasinato per fare una cosa che tutto sommato e' semplice. Non conosco la meccanica e la logica del "rabbocco acqua" (dove cavolo sparisce l'acqua? :) ) ma per le luci se ho capito giusto hai fatto una fase che le farebbe accendere lentamente, una inversa e una che le tiene accese. Se tu introducessi un rtc potresti determinare a che ora fare iniziare le varie fasi, scrivere 3 funzioni e con un ciclo loop da poche righe (a seconda di che ora e' fai partire il determinato ciclo) te la caveresti, con una maggiore precisione.

Fede

dove cavolo sparisce l'acqua? :)

Evapora.

Un rtc è un orologio da attarci, giusto? Ma se io usassi la libreria datatime con una batteria tampone sarebbe la stessa cosa? Comunque il rabbocco dell'acqua funziona così: immergo due fili nella vasca(nella samp) a contatto con l'acqua, uno più in alto e uno più in basso, se i cavi sono immersi tutti e due e c'è contatto non succede nulla, ma se il livello diminuisce e uno rimane fuori non c'è più contatto e quindi viene azionata una pompa che porta l'acqua di una piccola vasca d'emergenza nella vasca. Non sono molto esperto di acquari, e non so i nomi precisi ma dovrebbe fare questo. Grazie mille ancora.

Andrea

Ciao a tutti anche io sono nuovo del forum e scusate se mi presento qui. Anche io sono interessato a costruire una centralina per automazione acquario visto che quelle in commercio costano un botto. E Arduino mi sembra una risposta alquanto geniale,un consiglio per Federico anzichè mettere due elettrodi direttamente nell H2o(che non si sa mai come va a finire)potresti usare un interruttore galleggiante verticale con contatti na nc.....riguardo l rtc si compra gia assemblato oppure bisogna autocostruirselo?Grazie a tutti

@ andrea te vorresti mettere 2 fili percorsi da corrente in acqua? poeri pesci!

l'importante è rivestire i fili in modo che le parti in rame non vadano in soluzione per elettrolisi, per il resto le tensioni/correnti in gioco sono abbastanza basse e quindi sicure. P.S. con tre fili avresti un controllo di minimo/massimo del livello dell'acqua, e di tanto in tanto potresti usare il "centrale" e quello del "minimo" per misure di conduttività/salinità dell'acqua ;)

Non pensavo di utilizzare i fili di rame, ma delle bacchette in acciaio inox (l’acquario è marino), buona l’idea dei tre fili, ma per quanto riguarda misurare la salinità dell’acqua non saprei proprio come fare mentre credo che per la conduttività credo di poterci riuscire.
Potreste darmi qualche spunto per la salinità, forse cambia la conduttività a secondo della quantità di sale?
Intanto controllate il codice e ditemi se è troppo macchinoso, non ho problemi a riiniziarlo anche da capo.
Grazie mille.

Andrea

Si un rtc e' un componente "orologio" preciso. Preciso come un rtc devi avere un rtc :) Costa poco e te lo puoi implementare (un chip una batteria e un quarzo) o puoi comprarlo gia' fatto per 4 volte il suo valore vero in breakoutboard sui varii siti.

Per quello che riguarda l'evaporazione, permettetemi anche se non sono esperto di acquarii, ma mi pare una operazione che deve avvenire cosi' raramente che non credo sia interessante implementarla.

Dico questo sulla base degli amici che ho che hanno un acquario, quantomeno di acqua dolce e col coperchio che ha le luci. Se una volta a settimana (o due o al mese ora non ricordo ogni quanto va fatto) pulisci l'acqua e la rinnovi, operazione che devi fare a mano, reintegri anche quello che puoi perdere di evaporazione di un ambiente chiuso che stara' al massimo a 30° ... pochi mm immagino...

I miei 2 cent

Per l'rct mi sembra interessante l'idea di poterselo costruire, sapresti darmi dei link che approfondiscono di più? Per l'evaporazione il nostro acquario(300 litri) fa evaporare circa 25-30 litri alla settimana, e mi sembrava buona l'idea di implementarlo perchè a farlo manualmente l'acqua andrebbe aggiunta piano piano per evitare sbalzi di salinita e altre cose...(non sono molto esperto di acquari), invece implementandolo appena l'acqua diminuisce di mezzo litro circa in automatico la pompa la rimetto in circolo, in questo modo si dovrà accendere e spegnere molte volte. Intanto ricordatevi di controllare il codice e poi ditemi se è troppo macchinoso, non ho problemi a riiniziarlo anche da capo. Grazie ancora.

Andrea

Pensavo fosse molto meno l'evaporazione...

Per quello che riguarda l'rtc puoi basarti su un chip che si chiama DS1307, ti serve una batteria tampone da circa 3v e un quarzo da 12pf non ricordo bene la misura ma c'e' scritta nel datasheet del DS1307. C'e' sul playground una libreria per utilizzarlo semplicemente.

Anche il collegamento del chip e' banale, lo trovi sempre da datasheet, devi collegare sda e scl del chip a analog 4 e 5 di arduino tramite resistenze di pullup da 3.3k, poi GND e su due pin che se non ricordo male sono marchiati come X1 e X2 il tuo quarzo.

Buon divertimento!

PS: se cerchi nel forum e' un argomento abbastanza comune. F

Grazie per il come fare l'rtc, ma io di elettronica non ci capisco molto, è mio padre l'addetto alla parte elettrica, e quindi lo deve fare lui sto lavoro, per me potrebbe riuscirci(lui dice che almeno a provarci ci riesce), ma secondo te il codice, come è adesso lo potrei accorciare? Grazie.

Andrea

Per prima cosa non sono sicuro di aver capito bene la questione dei pulsanti, ma io per chiarificare il codice e renderlo piu' gestibile farei 3 funzioni (alba / tramonto / accendi tutto) e in generale volendo si potrebbe fare per alba e tramonto una funzione sola con 1 parametro in + . Poi al posto di determinare se un bottone e' high o low, e risettarne gli stati, guarderei la varianza dello stato, tipo: http://arduino.cc/en/Tutorial/ButtonStateChange Io mi trovo abbastanza bene con questo sistema. F

Ragazzi ho trovato questo in rete può andare bene? http://mnicolato.altervista.org/arduino/rtc.png

Si e' perfetto, forse un po' alto il valore delle resistenze. Il massimo dovrebbe essere 4.7K, io di solito con 3.3K mi trovo bene. F

Per prima cosa non sono sicuro di aver capito bene la questione dei pulsanti, ma io per chiarificare il codice e renderlo piu' gestibile farei 3 funzioni (alba / tramonto / accendi tutto)

Non utilizzo dei pulsanti ma un interruttore a tre stati(ciclo normale/tutto spento/tutto acceso) che già attaccandolo funziona. Mio padre dice di poterci riuscire a costruire l'rct, per quanto riguarda il DS1307 l'abbiamo trovato su rs component ma per il quarzo non sappiamo se questo è quello giusto: http://it.rs-online.com/web/search/searchBrowseAction.html?method=getProduct&R=2261443 Grazie in generale, anche per l'immagine.

Andrea

Per coincidenza i quarzi che uso io coi miei rtc li ho presi da RS, sono andato quindi a verificare nelle vecchie fatture e quello che uso io e' questo

http://it.rs-online.com/web/search/searchBrowseAction.html?method=getProduct&R=547-6985

che e' del tutto simile a quello che mi indichi tu. Non sono identici xke' quello che uso io e' a 12.5pF e l'altro e' a 12 e noto alcuni valori diversi che pero' non so valutare. Se ricordo bene dovresti avere bisogno di un quarzo da 12.5pF col minor ppm possibile, che sempre se ricordo bene ha la maggiore precisione (il mio probabilmente perde qualche minuto all'anno)

Fede

Si, il quarzo è quello giusto. Comunque sia se devi fare un ordine solo per il quarzo vedi prima se a casa hai un orologio al quarzo da sacrificare, anche uno di quegli orologi da parete da due soldi che regalano di solito negli ipermercati a natale (ne avevo in soffitta diversi sommersi da cumuli di polvere e a qualcosa mi sono serviti…).
Ciao.

Ops, non sapevo questa storia dei pF sui quarzi, io come detto sopra non sapendolo non ci ho mai fatto caso... Grazie Federico, non si finisce mai di imparare.

Probabilmente e’ ok anche quello, quando ho scelto quelli che uso avevo googlato parecchio e in paranoia, perche’ c’e’ gente che usa anche quelli da 6pF … In generale avevo visto che i piu’ usati per questo chip erano i 12.5 e quindi ero andato per quelli. F

un quarzo è pur sempre un condensatore con un dielettrico particolare : http://212.189.172.195/corso/elettronica/materiale_didattico/lezioniweb/elettronica_2006-07/lezioni_di_elettronica/cap23_gli_oscillatori_sinusoidali/gli_oscillatori_al_quarzo.htm#circuito%20equivalente%20del%20quarzo la capacità intrinseca ti serve in fase di progettazione per dimensionare correttamente il circuito intorno... :)