Se sei già registrato           oppure    

Orario: 15/09/2019 18:54:31  

 

Energia Alternativa ed Energia Fai Da Te > Sistemi operativi, hardware e programmazione.

Pagine: (4)   1   [2]   3   4    (Ultimo Msg)


aiuto per avviare un generatore di emergenza con Arduino
FinePagina

sabin

Avatar
MegaWatt


Gruppo:Utente
Messaggi:522

Stato:



Inviato il: 23/09/2014 08:01:06

CITAZIONE (calcola, 22/09/2014 22:31:41 ) Discussione.php?211951&1#MSG14

Prova il seguente listato, non è finito ed è alquanto rozzo. Devi completarlo con il ciclo di verifica dell'avvenuta accensione.
E' solo un esempio di come inserire le pause mediante millis.
Io preferisco usare nelle istruzioni HIGH e LOW, ma 1 e 0 rispettivamente svolgono la medesima funzione.

//Inizio listato

#define confAvv 3 //sensore avviamento
#define feed 4 //verifica accensione
#define evBenz 5 //valvola benzina
#define relCarb 6 //tira l'aria carburatore
#define motAvv 7 //motorino avviamento

byte confAvvState = 0;
byte evBenzState = 0;

unsigned long temp0;
unsigned long temp1;
unsigned long temp2;

void setup(){

//Apro la comunicazion seriale
Serial.begin(9600);
pinMode(confAvv, INPUT);
pinMode(evBenz, OUTPUT);
pinMode(relCarb, OUTPUT);
pinMode(motAvv, OUTPUT);
}

void loop(){

{confAvvState = digitalRead(confAvv);
temp0 = millis();
[
br] if ((millis() == temp0 + 5000) && (confAvvState == HIGH)) {digitalWrite(evBenz, HIGH); temp0 = 0;}
else digitalWrite(evBenz, LOW);}

{evBenzState = digitalRead(evBenz);
temp1 = millis();
if ((millis() == temp1 + 5000) && (evBenzState = HIGH)){digitalWrite(relCarb,HIGH);temp1 = 0; temp2= millis();}
else digitalWrite(relCarb,LOW);
if (millis() == temp2 + 1000){digitalWrite(motAvv, HIGH); temp2 = 0;}
else digitalWrite( motAvv, LOW);
}

}

//Fine listato


La traduzione, più comprensibile potrebbe essere questa.

variabili
v.setup {vari}
v.loop {
{leggi lo stato del pin(3) confAvv
se temp0 ha trascorso 5 secondi e il pin(3) confAvvState == HIGH
{ metti il pin(5) evBenz,HIGH; temp0 = 0}
altrimenti {metti il pin(5) evBenz,LOW}
}

{leggi lo stato del pin(5) evBenz
se sono trascorsi 5 secondi e il pin(5) == HIGH
{metti il pin(6) relCarb,HIGH; temp1 = 0; fissa temp2
}
altrimenti metti il pin(6) relCarb,LOW
se temp2 è maggiore di 1 secondo
{metti il pin(7) motAvv,HIGH; temp2 = 0}
altrimenti metti il pin(7) motAvv,LOW
}

}


un paio di dubbi
qui "==" (evBenzState = HIGH)
qui metterei ">" if (millis() == temp2



---------------
Inverter UPS Power Star W7 (onda pura) ingresso 24 v... 220V 2 Kw con spunto da 6 Kw? (direi 3Kw)
Pannelli 11,1 mq. Wp 1320 (x120 Wp mq)... n° 5 monoc. 72 celle 750 Wp (SO) su MPPT SolarMate 40A
n° 3 polic. 60 celle 570 Wp (Sud) su PWM 30A... batterie: 2 coppie SMA (trazione) 24V 120 Ah C/10 (+ 2 avviamento 70Ah)
Switch enel/batterie con Arduino Pro Mini

 

sabin

Avatar
MegaWatt


Gruppo:Utente
Messaggi:522

Stato:



Inviato il: 23/09/2014 08:40:59

Ulteriore traduzione
Se dopo 5 secondi il pin3 conferma l'OK
{avvia la procedura di avviamento motore.}

Se il pin3 annulla l'OK
{procedura spegnimento}

procedura di avvio()
{
apri benzina pin5
chiudi aria pin6
motorino avviamento pin7
se dopo 3 secondi il pin4 conferma accezione
{ dopo 4 secondi apri aria}
altrimenti {ripeti motorino avviamento pin7 per un massimo di 4 volte}
se l'avviamento è fallito per 4 volte
{ferma tutto e segnala allarme}
}

procedura spegnimento()
{
chiudi benzina pin5
spegni (elettricamente) il motore (questo pin manca)
}



---------------
Inverter UPS Power Star W7 (onda pura) ingresso 24 v... 220V 2 Kw con spunto da 6 Kw? (direi 3Kw)
Pannelli 11,1 mq. Wp 1320 (x120 Wp mq)... n° 5 monoc. 72 celle 750 Wp (SO) su MPPT SolarMate 40A
n° 3 polic. 60 celle 570 Wp (Sud) su PWM 30A... batterie: 2 coppie SMA (trazione) 24V 120 Ah C/10 (+ 2 avviamento 70Ah)
Switch enel/batterie con Arduino Pro Mini

 

calcola
GigaWatt


Gruppo:Utente
Messaggi:4344

Stato:



Inviato il: 24/09/2014 08:27:49

Per essere precisi l'istruzione if (millis() == temp2 + 1000){digitalWrite(motAvv, HIGH); temp2 = 0;} non funziona infatti se temp2 e == oppure anche > di 1 secondo il motorino va in HIGH e temp2 è subito posto =0, quindi si spegne perchè la condizione if ora risulta falsa. Temp2=0 deve essere posto dopo le istruzioni di verifica dell'avvenuto avvio.

Walter64 ha chiesto un esempio sull'uso dei millis, io l'ho aiutato, starà a Lui adattarlo alle sue necessità. Tra l'altro senza conoscere i dettagli dello schema elettrico e degli attuatori usati,... è difficile aiutarlo a costruire un software adatto, come si fa a provarlo? Se ha ancora difficoltà... risponderà, probabilmente ha già risolto.



Modificato da calcola - 24/09/2014, 08:40:18


---------------
Impara l'arte e mettila da parte
14 pannelli da 100w, inverter kemapower 3kw, regolatore morningstar tristar ts60, banco batterie n.1 di 12 elementi 2v 480Ah C5 corazzate per trazione pesante, banco batterie n.2 di 400Ah in C5 formato da 24 elementi 2V 200Ah corazzate al gel per fotovoltaico in due serie da 12 elementi, centralina di gestione impianto autoprodotta.

 

Walter64

Avatar
Watt


Gruppo:Utente
Messaggi:29

Stato:



Inviato il: 03/10/2014 22:37:28

Buonasera a tutti ... sono stato assente per motivi di lavoro, in pratica ho "riacceso" ora ...

CITAZIONE

Se ha ancora difficoltà... risponderà, probabilmente ha già risolto.

mmmmmmh ... ho serie difficoltà, e non ho risolto ! ho giusto ripreso in mano adesso la bredboard con inserito arduino,
CITAZIONE
senza conoscere i dettagli dello schema elettrico e degli attuatori usati

lo schema è semplice, sono dei semplici relè che pilotano i carichi: elettrovalvola benzina, solenoide del motorino d'avviamento, un relè che chiude a massa il sistema d'accensione (non genera la scintilla) ed in fine lo starter (aria del carburatore) è un semplice motorino di chiusura elettrica delle portiere, che aziona quando in tensione (12V)la farfalla di "strozzaura" del carburatore, in assenza di tale tensione una molla ristabilisce la normalità ...
Scusatemi ma ho sul groppone 5 ore di rientro e a questa ora (22:36)faccio fatica a concentrarmi ... riprendo domattina grazie a tutti a domani.

 

calcola
GigaWatt


Gruppo:Utente
Messaggi:4344

Stato:



Inviato il: 03/10/2014 22:50:07

Ti ho postato un esempio di come introdurre delle pause nella sequenza delle operazioni da eseguire senza fermare l'esecuzione, applicalo anche alle altre istruzioni e completa il listato. Se qualcosa non va chiedi pure.



---------------
Impara l'arte e mettila da parte
14 pannelli da 100w, inverter kemapower 3kw, regolatore morningstar tristar ts60, banco batterie n.1 di 12 elementi 2v 480Ah C5 corazzate per trazione pesante, banco batterie n.2 di 400Ah in C5 formato da 24 elementi 2V 200Ah corazzate al gel per fotovoltaico in due serie da 12 elementi, centralina di gestione impianto autoprodotta.

 

Walter64

Avatar
Watt


Gruppo:Utente
Messaggi:29

Stato:



Inviato il: 04/10/2014 10:21:56

Calcola buongiorno ...
Ho caricato il tuo listato... ma questa:

if ((millis() == temp0 + 1000) && (confAvvState == HIGH)) {digitalWrite(evBenz, HIGH);} 
 else digitalWrite(evBenz, LOW);} 

nonostante l'ingresso (controllato con tester passa da LOW a HIGH) l'uscita evBenz non cambia di stato, perché
P.S.
perché questa istruzione:

CITAZIONE
//Apro la comunicazion seriale
Serial.begin(9600);

non ho necessità a comunicare via seriale (o ho capito male io ? )

 

calcola
GigaWatt


Gruppo:Utente
Messaggi:4344

Stato:



Inviato il: 04/10/2014 10:34:33

Apro sempre durante lo sviluppo di un software la comunicazione seriale, mi serve per visualizzare sul monitor seriale l'esecuzione del programma e capire i difetti di funzionamento, nel tuo caso se evBenz non passa ad high sicuramente vi è qualcosa che non va nella definizione di temp0, quindi puoi aggiungere l'istruzione Serial.println(temp0); all'inizio del void loop e controllare sul monitor seriale se la variabile viene impostata correttamente. Probabilmente l'errore è nella condizione di uguaglianza tra millis e temp0+1000 che si verifica solo per un millesimo di secondo, meglio sostituirla con >. Il monitor seriale ti aiuta a capire dove sono gli errori.



---------------
Impara l'arte e mettila da parte
14 pannelli da 100w, inverter kemapower 3kw, regolatore morningstar tristar ts60, banco batterie n.1 di 12 elementi 2v 480Ah C5 corazzate per trazione pesante, banco batterie n.2 di 400Ah in C5 formato da 24 elementi 2V 200Ah corazzate al gel per fotovoltaico in due serie da 12 elementi, centralina di gestione impianto autoprodotta.

 

Walter64

Avatar
Watt


Gruppo:Utente
Messaggi:29

Stato:



Inviato il: 04/10/2014 10:54:37


CITAZIONE

Il monitor seriale ti aiuta a capire dove sono gli errori

Ok ... in altro a DX c'è l'icona ...
ma quando ci clicco, appare la finestra, comunicazione con la COM utilizzata ... ma niente di più ! è una funzione che non riesco ad applicare.

 

Walter64

Avatar
Watt


Gruppo:Utente
Messaggi:29

Stato:



Inviato il: 04/10/2014 11:12:40

OK ci sono arrivato, in sostanza lo stesso arduino invia al monitor la corretta esecuzione del programma ... peccato che attualmente modifiche fatte , vedo sola una fila di numeri che scorrono in crescendo ...

 

Walter64

Avatar
Watt


Gruppo:Utente
Messaggi:29

Stato:



Inviato il: 04/10/2014 11:29:00

Questi numeri indica solo una cosa chetemp0)genera un "tempo" in millisecondi ... perciò funziona ma nella successiva stringa anche sostituendo il "+" con ">" non gira !

 

Walter64

Avatar
Watt


Gruppo:Utente
Messaggi:29

Stato:



Inviato il: 04/10/2014 13:23:54


CITAZIONE

/Inizio listato

int confAvv = 3; // richiesta avviamento = +5V
int evBenz = 5; // valvola benzina

int confAvvState = 0;
int evBenzState = 0;
unsigned long temp0;

void setup(){

//Apro la comunicazion seriale
Serial.begin(9600);
pinMode(confAvv, INPUT);
pinMode(evBenz, OUTPUT);

}

void loop(){

Serial.println(temp0);
// {leggi lo stato del pin(3) confAvv
// se temp0 ha trascorso 5 secondi e il pin(3) confAvvState == HIGH
// { metti il pin(5) evBenz,HIGH; temp0 = 0}
// altrimenti {metti il pin(5) evBenz,LOW

{
confAvvState = digitalRead(confAvv);
temp0 = millis();
if ((millis() == temp0 + 5000) && (confAvvState == HIGH)){digitalWrite(evBenz, HIGH); temp0 = 0;}
else digitalWrite(evBenz, LOW);}

}

//Fine listato

Perché NON funziona ????

 

calcola
GigaWatt


Gruppo:Utente
Messaggi:4344

Stato:



Inviato il: 04/10/2014 14:20:30

Il listato che devi provare e poi modificare e completare è quello di seguito. Se togli istruzioni non funzionerà di sicuro. Se prima di ogni riga metti // le istruzioni non saranno eseguite.
Il programma non è completo, dato che hai scritto che avevi difficoltà ad introdurre delle pause senza fermare l'esecuzione del programma, ti ho dato delle indicazioni su come usare l'istruzione millis senza fermare l'esecuzione.

Ora ho capito che hai bisogno di un aiuto più concreto quindi ho modificato la versione del software, provala ora dovrebbe andare meglio

//Inizio listato
//prodotto da calcola (antrec.geo@yahoo.com)//
//avvio motore ver.1_0_4
//
//ATTENZIONE:
//
//CC BY-NC-SA 4.0
//Uso non commerciale, modificabile, con obbligo di condivisione-
//http://creativecommons.org/licenses/by-nc-sa/4.0/deed.it
//
#define confAvv 3 //sensore avviamento
#define feed 4 //verifica accensione
#define evBenz 5 //valvola benzina
#define relCarb 6 //tira l'aria carburatore
#define motAvv 7 //motorino avviamento

byte confAvvState = 0;
byte evBenzState = 0;

unsigned long temp0;
unsigned long temp1;
unsigned long temp2;

void setup(){

//Apro la comunicazion seriale
Serial.begin(9600);
pinMode(confAvv, INPUT);
pinMode(evBenz, OUTPUT);
pinMode(relCarb, OUTPUT);
pinMode(motAvv, OUTPUT);
}

void loop(){


//se vi è il consenso all'avvio (pin3 high), apro la benzina e fisso la variabile temp0
if (digitalRead(confAvv)== HIGH) {digitalWrite(evBenz, HIGH);temp0 = millis();}
else digitalWrite(evBenz, LOW);

// se sono trascorsi 5 secondi dall'apertura della valvola, (tem0+5000) tiro l'aria
if ((millis() > temp0 + 5000) && (digitalRead(evBenz) = HIGH)){digitalWrite(relCarb,HIGH);}
else digitalWrite(relCarb,LOW);

//aspetto un altro secondo ed avvio il contatto del solenoide
if ((millis() > temp0 + 6000) && (digitalRead(evBenz) = HIGH){digitalWrite(motAvv, HIGH); ;}
else digitalWrite( motAvv, LOW);

}

//fine listato

Ora il motorino di avviamento dovrebbe girare, cosa vuoi fare? Continuerà a girare finchè si scarica la batteria o parte come pensi di fare per istruire il microcontrollore che è partito? Hai una uscita 12v che funziona solo ad avviamento avvenuto?



Modificato da calcola - 04/10/2014, 16:13:57


---------------
Impara l'arte e mettila da parte
14 pannelli da 100w, inverter kemapower 3kw, regolatore morningstar tristar ts60, banco batterie n.1 di 12 elementi 2v 480Ah C5 corazzate per trazione pesante, banco batterie n.2 di 400Ah in C5 formato da 24 elementi 2V 200Ah corazzate al gel per fotovoltaico in due serie da 12 elementi, centralina di gestione impianto autoprodotta.

 

Walter64

Avatar
Watt


Gruppo:Utente
Messaggi:29

Stato:



Inviato il: 04/10/2014 14:29:37

durante la verifica da errore di compilazione, appare questo:

CITAZIONE

if ((millis() > temp0 + 5000) && (digitalRead(evBenz) = HIGH)){digitalWrite(relCarb,HIGH);}

manca qualcosa ...
il concetto l'ho capito ... domanda e risposta sono chiari una volta avviato il processo, cambiando i vari millis si possosno avere diverse uscite... ma non và

 

Walter64

Avatar
Watt


Gruppo:Utente
Messaggi:29

Stato:



Inviato il: 04/10/2014 14:32:56


CITAZIONE

Ora il motorino di avviamento dovrebbe girare, cosa vuoi fare? Continuerà a girare finchè si scarica la batteria o parte come pensi di fare per istruire il microcontrollore che è partito? Hai una uscita 12v che funziona solo ad avviamento avvenuto?

no, il motorino (avviamento effettuato)deve arrestarsi mediante il ritorno feed-back del generatore ( +5V )...
Ma facciamo una cosa per volta (già fatico con tutte queste virgole!)

 

calcola
GigaWatt


Gruppo:Utente
Messaggi:4344

Stato:



Inviato il: 04/10/2014 14:39:42

Si, vi è un errore aggiusta == HIGH



---------------
Impara l'arte e mettila da parte
14 pannelli da 100w, inverter kemapower 3kw, regolatore morningstar tristar ts60, banco batterie n.1 di 12 elementi 2v 480Ah C5 corazzate per trazione pesante, banco batterie n.2 di 400Ah in C5 formato da 24 elementi 2V 200Ah corazzate al gel per fotovoltaico in due serie da 12 elementi, centralina di gestione impianto autoprodotta.

 
 InizioPagina
 

Pagine: (4)   1   [2]   3   4    (Ultimo Msg)

Versione Mobile!

Home page       TOP100-SOLAR      Home page forum