lo schema sarebbe questo:
l'idea sarebbe, quando una delle tre elettrovalvole si attiva per irrigare il giardino, si deve attivare l'uscita dell'attyni per 2minuti
quindi secondo me l'ingresso erano le 3 EV e l'uscita era quella che collegavo al galleggiante (se il galleggiante segnala che è a secco, bagno il giardino cmq, ma non accendo la pompa ausiliaria)
sbaglio?
che circuito potrei usare per fare un test del mio progamma magari con un led che simula l'attivazione o meno dell'uscita? e cosa potrei usare per simulare l'attivazione dell'elettrovalvola?
grazie!
Scusa io ho perso di vista l'obbiettivo dando per scontato che dovevi azionare l'elettrovalvole con arduino, e monitorare lo stato del galleggiante.
Dei pulsanti possono simulare l'accensione delle elettrovalvole mostrate nel circuito, quindi si 3 pin ingresso.
L'uscita di consenso accensione pompa la puoi simulare con un led.
Quindi quando almeno uno dei 3 ingressi risulta LOW, accendi l'uscita consenso pompa e inizi a controllare ripetutamente se sono o meno passati 2 minuti. Se sono passati, spegni l'uscita consenso pompa, azzeri il timer e....per ricominciando da capo se almeno un ... la pompa si riaccende e via così all'infinito fintantoché almeno una elettrovalvola risulta alimentata.
Ciao.
ciao! ma figurati! grazie dell'aiuto!
ok come testare il programma (come metodo di lavoro intendo) più o meno lo avevo in mente...
ottimo il suggerimento dei pulsanti.....
ehmm quello che mi manca ora sarebbe qualche dritta su come collegare il pulsante in modo da dare il segnale ad arduino.

ad esempio nel mio cassetto ho un deviatore...ma posso usarlo come pulsante per il test.....ehmm....ma come lo collego?
un capo del deviatore lo devo collegare a uno degli ingressi previsti per le EV, quindi ad esempio posso collegarlo ad uno tra p2 p3 p4, l'altro capo, a che cosa lo posso collegare?
immagino debba entrare "una tensione" nel mio attiny in modo che lui la possa riconoscere.....quindi immagino di collegarlo al po un alimentatore a 5V
ed il negativo del generatore dove lo dovrei collegare?
idem il led di test....un capo va al p5 uscita...e l'altro?
mentre i 5v ed il GND su attiny servono per dare l'alimentazione se decido di non usare la micro usb giusto?
cos'è invece il Vin ?
grazie...e scusate le atroci banalità!

GRAZIE!!!
http://www.pighixxx.com/test/portfolio-items/pushbutton-to-gnd/?portfolioID=610
http://www.pighixxx.com/test/portfolio-items/pushbutton-to-5v/?portfolioID=610
In teoria tua soluzione è corretta, se non fosse che nella realtà un pin di ingresso lasciato non connesso si comporta quasi come una antenna, per ovviare basta fare in modo che un pin in ingresso abbia sempre un valore ben definito.
Si usano resistenze di pull-up o pull-dow per spingere-su o giù lo stato di un pin.
Ciao.

vediamo se ho capito....
ho fatto questo schema....ed ho collegato il tutto....
ma il led non si accende ![]()
ho provato a misurare la tensione con il tester, e mi trovo all'ingresso 5v quando attivo il mio deviatore e 2.5v quando non lo attivo...?!?!?!?!
mentre se misuro la tensione sull'uscita del led, mi trovo sempre 1.7v in qualsiasi posizione del deviatore...
posso aver commesso qualche errore nel software?!?
sinceramente non riesco a raccapezzarmici ![]()
Prova a usare P0, P1, P2 invece di P2, P3, P4.
ma intendi cambiandoli nel programma, oppure lasciando il programma così com'è e usando fisicamente p0 p1 p2?
il software è così ora:
const byte OUT = 5; //pin5=collegamento uscita al galleggiante
const byte IN_ev1 = 2; //pin2=collegamento ingresso relè
const byte IN_ev2 = 3; //pin3=collegamento ingresso relè
const byte IN_ev3 = 4; //pin4=collegamento ingresso relè
Cambiando sia il software che le connessioni, ovviamente...
non cambia nulla ![]()
quando muovo il deviatore mi si spegne il led di alimentazione sulla schedina....quello sul pcb e basta....
non mi spiego nemmeno i valori delle tensioni che trovo con il tester
ho provato a caricare questo codice di esempio
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
pinMode(1, OUTPUT); //on board LED
}
// the loop routine runs over and over again forever:
void loop() {
digitalWrite(1, HIGH); // turn the LED on (HIGH is the voltage level)
delay(100); // wait for a second
digitalWrite(1, LOW); // turn the LED off by making the voltage LOW
delay(100); // wait for a second
}
che dice che dovrebbe accendere ad intermittenza di un secondo il led sul pcb relativo al pin 1
ed infatti funziona....
Mi chiedo perché collegare 3 pin di ingresso assieme.
Prova un solo pin per volta e se funziona usa 3 diodi e 3 resistenze. Ogni resistenza collegata ad un pin verso gnd.
Gli anodi collegati insieme ricevono la 5v dallo switch e i catodi ognuno ad un pin.
Ciao.
ciao, i tre ingressi insieme li avevo messi poichè ho solo un led di test, ed il programma prevedeva tre ingressi....quindi ho pensato di collegare gli ingressi insieme, in modo da simulare che tutti siano attivi
ad ogni modo, ho provato ad usare arduino e non attiny caricandoci lo stesso programma.....
non capisco perchè, ma se attivo il mio deviatore, si accede subito il led, ma rimane acceso sempre, non si disattiva dopo i due minuti.....
provando anche singolarmente i tre ingressi, sempre la stessa cosa...
Immagino perché, una volta passati i 2 minuti, il programma torna nello stato ATTESA, ma poi lì trova l'ingresso attivo e torna istantaneamente in TIME_ON.
Se il problema è questo devi introdurre un nuovo stato in cui vai da TIME_ON, aspetti che tutti gli ingressi siano spenti e quindi torni in ATTESA.
è vero!
hai ragione!
però che controllo potrei mettere?
io sono legato agli ingressi delleelettrovalvole del gioardino
ad esempio EV1 bagna per 5min
EV2 bagna per 10min
EV3 bagna per 10min
ma i tempi non sono fissi, dipendo dalla stagione e li programmo dalla centralina di irrigazione....
con arduino dovrei dopo due minuti spegnere la pompa che è l'uscita del pin 5
posso creare un caso CONTROLLO e forzare a LOW gli ingressi di tutte le tre EV ?
se facessi così, la mia uscita si spegne, ma smette anche di bagnarmi il giardino?
oppure guardando lo schema di collegamento postato, non è possibile grazie al 4N35 ?
Le EV le stai usando come input, non puoi certo pilotarle per come sono collegate ora. Tantomeno con l'optocoupler di mezzo.
Perché non va bene quanto ti ho proposto sopra?
ho introdotto un nuovo caso controllo, ma non funziona....senza debug faccio fatica a capire dove mi si inceppa:(
switch (caso)
{
case ATTESA:
if(stato_ev1 == LOW)// && stato_ev2 == LOW && stato_ev3 == LOW)
{
stato_OUT = LOW;
}
else
{
caso = TIME_ON; // PASSA ALLA FASE start
T0 = Tcorr; // Azzera il contatore
}
break;
case TIME_ON:
if(stato_ev1 == LOW)// && stato_ev2 == LOW && stato_ev3 == LOW)
{
stato_OUT = LOW;
caso = CONTROLLO;
}
else
{
if (Tcorr - T0 >= I2)
{
T0 = Tcorr; // Azzera contatore
caso = ATTESA;
}
else
{
stato_OUT = HIGH;
}
}
break;
case CONTROLLO:
stato_ev1 = digitalRead(IN_ev1);
while (stato_ev1 == HIGH){
stato_OUT = LOW;
}
caso = ATTESA;
break;
default:
break;
} // End switch
digitalWrite(OUT, stato_OUT);
} // End loop
Una volta che entri nel while non ne esci più, dato che non rileggi mai l'input. Ma non usare while, fallo tramite if come gli altri casi.
niente, ho aggiunto anche un
digitalWrite(OUT, LOW); //spengo l'uscita della pompa
per spegnere la pompa quando azzero il contatore, ma non riesco a capire come aspettare che gli ingressi tornino a LOW per ritornare al caso ATTESA
switch (caso)
{
case ATTESA:
if(stato_ev1 == LOW)// && stato_ev2 == LOW && stato_ev3 == LOW)
{
stato_OUT = LOW;
}
else
{
caso = TIME_ON; // PASSA ALLA FASE start
T0 = Tcorr; // Azzera il contatore
}
break;
case TIME_ON:
if(stato_ev1 == LOW)// && stato_ev2 == LOW && stato_ev3 == LOW)
{
stato_OUT = LOW;
caso = CONTROLLO;
}
else
{
if (Tcorr - T0 >= I2)
{
T0 = Tcorr; // Azzera contatore
digitalWrite(OUT, LOW); //spengo l'uscita della pompa
caso = CONTROLLO;
}
else
{
stato_OUT = HIGH;
}
}
break;
case CONTROLLO:
if (stato_ev1 == HIGH){
caso = CONTROLLO;
stato_ev1 = digitalRead(IN_ev1);
}
else
caso = ATTESA;
break;
default:
break;
} // End switch
digitalWrite(OUT, stato_OUT);
} // End loop
dimenticavo, per non aspettare 2minuti ho impostato nella dichiarazione delle variabili
unsigned long I2 = 1 * 20 * 1000UL;
che dovrebbero esere 18 secondi, giusto?
solo che trascorsi i 18 secondi il led (uscita pin5) non si spegne mai...rimane sempre acceso dopo la prima volta che mando l'ingresso (pin2) HIGH
Perché 18? Saranno 20...
Prova:
void loop() {
Tcorr = millis();
stato_ev1 = digitalRead(IN_ev1); // Legge ingresso A
stato_ev2 = digitalRead(IN_ev2); // Legge ingresso A
stato_ev3 = digitalRead(IN_ev3); // Legge ingresso A
// definizione stati
switch (caso) {
case ATTESA:
if (stato_ev1 != LOW || stato_ev2 != LOW || stato_ev3 != LOW) {
caso = TIME_ON; // PASSA ALLA FASE start
T0 = Tcorr; // Azzera il contatore
digitalWrite (OUT, HIGH); // Accende... qualcosa
}
break;
case TIME_ON:
if (Tcorr - T0 >= I2) {
digitalWrite (OUT, LOW); // Spegne
caso = CONTROLLO;
}
break;
case CONTROLLO:
if (stato_ev1 == LOW && stato_ev2 == LOW && stato_ev3 == LOW) {
caso = ATTESA;
}
break;
Se ho capito bene è questo che vuoi fare.
si 20....ho sbagliato a scrivere io, scusami ![]()
riguardo al codice....l'idea di base è: se una EV si attiva per bagnare il giardino (una qualsiasi, visto che partono in sequenza: prima EV1 poi parte EV2 ed infineEV3 poichè bagnano luoghi diversi) si attiva per 2minuti (ora ho abbassato a 20secondi x test) l'uscita sul pin5.
finiti i 2minuti, il pin5 (uscita) va a livello LOW, mentre l'elettrovalvola prosegue a bagnare.
Appena si attiva la seconda o la terza elettrovalvola, si deve attivare corrispondentemente ancora l'uscita pin5 ancora per 2minuti. Trascorsi i due minuti, il pin5(uscita) torna LOW e l'ingresso(una delle 3 EV che si era ppunto aperta) continua a rimanere apera per il tempo necessario a finire di irrigare.
il tuo codice lo ho provato, ma non funziona...ora il led(che simula l'uscita del pin5) non si accende mai....
e non capisco dove "si blocchi"
ti poso il codice per intero....ho messo come commenti gli ingressi sul pin3 e pin4 usando solo il pin2 perchè ho solo un led e rende un po' più semplice la mia comprensione del codice....
se trovo il modo di farlo funzionare poi mi basta levare i commenti
dove sbaglio?!!!?
ma non esiste un tool che processi riga per riga il codice(intendo in modo semiautomatico, passo passo....in cui premendo io un tasto lo faccio avanzare) evidenziando dove si trova l'esecuzione in questo modo penso che capirei meglio il funzionamento....
nel vecchio visual basic 6 c'era il debug manuale con F8....penso mi aiuerebbe una cosa del genere....
grazie ancora per il tempo che mi dedichi!!!!
// definizione stati
#define ATTESA 0
#define TIME_ON 2 // definizione STATO ON (LAVORO)
#define CONTROLLO 3 // controllo dello stato
const byte OUT = 5; //pin4=collegamento uscita al galleggiante
const byte IN_ev1 = 2; //pin2=collegamento ingresso relè
//const byte IN_ev2 = 3; //pin3=collegamento ingresso relè
//const byte IN_ev3 = 4; //pin4=collegamento ingresso relè
byte stato_ev1;
//byte stato_ev2;
//byte stato_ev3;
byte stato_OUT;
unsigned long Tcorr;
unsigned long T0;
unsigned long I2 = 1 * 5 * 1000UL; //definisco 2minuti come tempo ON
int caso;
void setup()
{
pinMode(OUT, OUTPUT);
pinMode(IN_ev1, INPUT);
// pinMode(IN_ev2, INPUT);
// pinMode(IN_ev3, INPUT);
// condizioni iniziali
caso = ATTESA;
stato_ev1 = LOW;
// stato_ev2 = LOW;
// stato_ev3 = LOW;
T0 = millis();
}
void loop()
{
Tcorr = millis();
stato_ev1 = digitalRead(IN_ev1); // Legge ingresso A
// stato_ev2 = digitalRead(IN_ev2); // Legge ingresso B
// stato_ev3 = digitalRead(IN_ev3); // Legge ingresso C
switch (caso) {
case ATTESA:
if (stato_ev1 != LOW){// || stato_ev2 != LOW || stato_ev3 != LOW) {
caso = TIME_ON; // PASSA ALLA FASE start
T0 = Tcorr; // Azzera il contatore
digitalWrite (OUT, HIGH); // Accende la pompa
}
break;
case TIME_ON:
if (Tcorr - T0 >= I2) {
digitalWrite (OUT, LOW); // Spegne
caso = CONTROLLO;
}
break;
case CONTROLLO:
if (stato_ev1 == LOW){//&& stato_ev2 == LOW && stato_ev3 == LOW) {
caso = ATTESA;
}
break;
default:
break;
} // End switch
digitalWrite(OUT, stato_OUT);
} // End loop