Ardu-Aquarium Controller v. 3.3.1

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.

in questo modo

byte POMPA1 = 0x40;

unsigned long intervallo, scambioprec; = 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;
	}
}

Salvatore,
dalle domande che fai e da come mi rispondi, mi pare di capire che sei un pochino più alle prime armi di me, ti rispondo volentieri, ma ti chiedo anche di impegnarti un po' di più nel cercare di venire a capo a problemi che ti assicuro sono veramente semplici da risolvere, frequenta le pagine del learning, quelle di reference oppure acquista un buon libro, io ho iniziato con quello di Banzi ad esempio ed ho eseguito pedissequamente tutto lo starter kit ufficiale e l'ho fatto perché non se ne sa mai abbastanza ti assicuro.
In ogni caso eccoti il codice corretto.

byte POMPA1 = 0x40;
unsigned long intervallo = 10000;
unsigned long scambioprec;
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 :slight_smile:

ciao e scusa di nuovo e vero che sono alle prime esperienze di programmazione ma le avevo provate tutte pure quella che hai postato che e stata la prima prova che o fatto ma mi riporta sempre al solito errore.

error: stray '\' in program
in function 'void loop()':
error: expected ')' before 'u2013'
error: expected ')' at end of input
error: expected statement at end of input
error: expected '}' at end of input

riguardando il libro e questo :

  1. Arduino. La guida ufficiale
  2. Getting Started With Arduino

:cold_sweat: ciao da salvatore.

mancano le parentesi tonde all'if.

ma queste sono le basi del linguaggio, in olre il compilatore e ti dice la riga di errore, e l'ide dovrebbe persino evidenziartela (guarda sempre anche la riga prima e la riga dopo, per esempio controllando se ti sei dimenticato i ; quando ci vanno, o viceversa)

Ti convene prima di tutto prendere mano col linguaggio e poi litigare con il codice scritto da altri :slight_smile:

@riciweb: ho sistemato ola visualizzazione dei grafici e ho notato che la luminosità è simile ad una retta, posto i grafici a breve

manca il ; su:
if statopompa == true

ma da sempre il solito errore,
if((millis() – scambioprec) > intervallo)

manca il ; su:
if statopompa == true

no, al contrario... segui il link che ho in firma, e studiati il C. Almeno leggerti le basi, in un paio di ore e osservando gli esempi di base di arduino sarei in grado di leggere quello che hai scritto finora e pensare: "che cazzone che sono :grin:"

in generale l'unico modo per imparare una disciplina scientifica è sempre quello: RTFM RTFM - Wikipedia