Ardu-Aquarium Controller v. 3.3.1

Considerando che si potrebbe più avanti implementare un datalogger su SD e visto che ci sono pin disponibili, perchè non spostare il sensore sul 7 o sull'8?

Oppure liberare completamente il pin, visto che a breve iniziamo a fare test con i sensori di temperatura i2c della Texas instruments :wink:
In ogni caso grazie per la segnalazione

Riccardo

ciao a tutti finalmente mi sono arrivati tutti i componenti e già montati funziona tutto.

volevo chiedere come fare per accendere un relè tipo il 7
vi ringrazio in anticipo per il lavoro che fate.

salvatore............

Ciao Salvatore, bel lavoro
Per rispondere alla tua domanda devi usare i comandi della libreria IOexp, che usiamo per pilotare i piedini del PCF che comanda la scheda relé, nel nostro caso la scheda relé è stata inizializzata così

IOexp schrele(0x3A);

Osservando lo schema elettrico, vedrai che il relé 7 è collegato al pin Y6 del convertitore di livello che a sua volta corrisponde al pin P6 del PCF che comanda la scheda relè, sempre da libreria quindi se vuoi comandare il relé 7 devi usare il comando:

schrele.write( P6, LOW);  // attiva il relé / chiude i contatti
schrele.write( P6, HIGH);  // disattiva il relé / apre i contatti

Sempre da libreria, troverai al suo interno che i piedini sono stati definiti così:

#define P0 0x1
#define P1 0x2
#define P2 0x4
#define P3 0x8
#define P4 0x10
#define P5 0x20
#define P6 0x40
#define P7 0x80

Quindi per maggior leggibilità/comodità/facilità nel ricordare cosa comandi con quel relé, puoi fare così:

// dichiari una variabile per il piedino P6 ad esempio
byte Lampadina = 0x40;
// e la usi a secondo di quello che ci devi fare
schrele.write(Lampadina, LOW);  // attiva il relé / accende la lampadina
schrele.write(Lampadina, HIGH);  // disattiva il relé / spenge  la lampadina

Ora divertiti a modificare il codice per i tuoi usi :wink:
Ciao.

grazie mille più tardi ci provo.

posso chiederti al volo che sistema hai usato per simulare l'abla/tramonto? cioè che curva segui?

lesto:
al volo

Mi sembra che il discorso abbia preso 10 pagine o giù di lì.
Non so se riuscirà a risponderti "al volo". :grin:

bhe velocemente: una funzione lineare che cresce/decresce in pochi minuti, e quindi lascia la lampada al 100% la maggior parte del tempo, oppure una vera parabola con apice a metà tempo di accensione e con le due inclinazioni della curva (derivate) più o meno selezionabili?

(ps. so che sembra arabo, ma il caro è vecchio ax^2+bx+c = y, con A B e C pre-calcolati in base alla curva desiderata, x = tempo, e y = PWM)

lesto:
... ax^2+bx+c = y ...

AAARGH ... una formula ... ERESIA !!!

:stuck_out_tongue: XD XD XD

Ciao a tutti,

@Lesto
Uso una semplicissima rampa lineare, noto il tempo di fading impostato, lo converto in millessimi e lo divido per il numero di rampe disponibili con arduino uno (255) ottenendo l'inervallo tra una variazione e l'altra, quindi usando l'adeguato confronto con millis() per evitare l'overflow eseguo il fading.
Semplice semplice.
Rampa crescente:

if((millis() - Plafo[linea].Tempoprec) >= Plafo[linea].DeltaFading)
	{	Plafo[linea].Tempoprec = Plafo[linea].Tempoprec + Plafo[linea].DeltaFading;
		if (Plafo[linea].Fading < Plafo[linea].MaxFading)
			{	Plafo[linea].Fading += 1; 
				analogWrite(Plafo[linea].NrPin,Plafo[linea].Fading);
			}
		else
			Plafo[linea].Alba = false; 
	}

Spero di essere stato chiaro.
Ciao.

Etemenanki:

lesto:
... ax^2+bx+c = y ...

AAARGH ... una formula ... ERESIA !!!

:stuck_out_tongue: XD XD XD

E' sempre uno spasso leggerti :slight_smile:

oddio avevo scritto una cosa bellissima ma il proxy se l'è mangiata
riassumo: cos' come fate ora è una BRUTTISSIMA V al contrario, con 90° tra una stanga e l'altra, vertice a metà giornata.

Questi invece sono i valori rilevati dalla centralina meteo (non ricordo la scala di misura, credo lumen)

notate quanto sia ERRATO usare una rampa lineare. kiss

edit: quei "piccoli" su e già che vedete sono le ombre dei pali sul tetto. notate invece che la scala delle X è rotta... catzo, di nuovo..

Grazie lesto, ma lo so che la curva dei lumen nell'arco di una giornata è fatta così, ed allo stesso tempo anche tu saprai che non è uguale durante tutto l'anno, sia come durata complessiva del fotoperiodo che come velocità di salita e discesa delle rampe, il calcolo da eseguire non lo conosco, ma credo sia estremamente complesso e sinceramente anche ecessivo da affidare al povero arduino.
Va da se che sta poi buon senso dell'acquariofilo poi scegliere una durata di fading adeguata, ma in pochi lo fanno preferendo un'acquario che abbia si alba e tramonto, ma che sia illuminato al massimo per la maggior patrte del tempo.
Io personalmente di solito imposto la durrata del fotoperiodo a 8 ore, facendo in modo che la luce massima si abbia in acquario per non più di 4.

Ciao Riccardo.

ma infatti io proponevo di usare una parabola, che come hai visto sono 3 variabili da tenere memorizzare, il calcolo della y lo fai una volta al minuto e sei a posto...

poi comabiando le 3 variabili se vuoi imiti anche le stagioni, io posso fornirti le curve reali da quì a circa 2 o 3 mesi fà :slight_smile:

E sicuramente una bella features da implementare, ma stranamente oggi riesco ad avere tempo per postare, cosa che non mi riusciva da mesi, quindi per ora mi dedico a cercare di finire il progetto (tempo a disposizione permettendo) così come l'ho pensato, una volta finito pensero anche a tutti i possibili miglioramenti e sicuramente terrò conto di questo tuo suggerimento, l'idea mi piace davvero, ma ora non ce la faccio.

Ciao Riccardo.

ciao a tutti scusate per la mia ignoranza nella programmazione. io dovrei pilotare delle pompe di movimento nel acquario,
o scritto due righe di programma sembra che funzioni ma fa smette di funzionare tutte le altre funzioni quale errore sto commetto e sopratutto chi mi può dare delle indicazioni dove inserire questa funzione. ringrazio di nuovo a tutti.

byte POMPA1 = 0x40;
void setup() {          
    schrele.write( P6, LOW); // attiva il relé / chiude i contatti
  schrele.write( P6, HIGH);  // disattiva il relé / apre i contatti    
}
void loop() {
  schrele.write(P6, HIGH); // disattivare pompa 1 
  delay(1000);               
  schrele.write(P6, LOW); // attivare pompa 1 
  delay(10000); 
}

salvatore

Ciao Salvatore77,
per inserire codice nei post, usa il tasto con il cancelletto la prossima volta :wink:
in ogni caso il codice che hai scritto fa esattamente quello che deve fare, il delay infatti è bloccante, il processore non fa nulla se non trascorre prima il tempo da te inserito, per fare quello che tu dici, si fanno i confronti utilizzando millis(), inoltre le due istruzione inserite nel setup() non servono a nulla nel tuo caso, fanno solo scattare il relé, assegnare poi ad una variabile un valore e non usarla a poco senso (POMPA1), ti ho buttato giù due righe al volo al volo, dovrebbero funzionare, altrimenti gli ridò uno sguardo in serata, tu però studiatele un secondino. :smiley:
Ciao.

byte POMPA1 = 0x40;
unsigned long intervallo = 10000;
boolean statopompa;

void setup() {
  statopompa = true;
  scambioprec = millis();

}
void loop() {
if ((millis() – scambioprec) > intervallo)
	{	if statopompa == true
			{	schrele.write(POMPA1, HIGH);
				statopompa = false;
			}
		else
			{	schrele.write(POMPA1, LOW);
				statopompa = true;
			}
		scambioprec = scambioprec + Intervallo;
	}
}

ciao
riciweb ti posso disturbare?

Non siamo mica al telefono,
questo è un forum, se hai domande da fare chiedi, può risponderti chiunque...

scusa o visto che eri olla in io o provato a inserire il programma e mi da sempre il solito errore.

scusa sempre ma io di programmazione ne so poco.
l'errore che mi da e linea

if ((millis() – scambioprec) > intervallo)

(scambiopec' was not declared in this scope)

Ecco appunto ero troppo di corsa...
Inserisci nelle dichiarazioni delle variabili:

unsigned long  scambioprec;

Ciao e buona serata.