Sistemi operativi, hardware e programmazione.
aiuto per avviare un generatore di emergenza con Arduino

Pag: (4)   1   2   [3]   4    (Ultimo)


FinePagina

calcola
GigaWatt


Utente
Msg:4435

Stato:



Inviato il: 04/10/2014 15:01:19

Quindi la scheda deve controllare che al pin 4 giunga una tensione di +5V. Il pin 4 non va bene meglio un pin analogico, A0 va bene, nel listato devi sostituire #define feed (A0)

//Inizio listato
//prodotto da calcola (antrec.geo@yahoo.com)//
//avvio motore ver.1_2
//
//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 A0 //verifica accensione
#define evBenz 5 //valvola benzina
#define relCarb 6 //tira l'aria carburatore
#define motAvv 7 //motorino avviamento

byte statoBenz = 0;
byte mem0 = 0;
byte mem1 = 0;

unsigned long temp0 = 0;
unsigned long temp1 = 0;



void setup(){

//Apro la comunicazion seriale
Serial.begin(9600);
pinMode(confAvv, INPUT);
pinMode(feed, 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 0
{if ((digitalRead(confAvv) == HIGH) && (mem0 !=1)) {digitalWrite(evBenz, HIGH); statoBenz = 1; temp0 = millis(); mem0 = 1;}
if ((digitalRead(confAvv) == HIGH) && (mem0 ==1)) {digitalWrite(evBenz, HIGH);}
else (digitalWrite(evBenz, LOW));}

//attendo 20 secondi ed chiudo l'aria
{if ((millis() > (temp0 + 20000)) && (statoBenz == 1)){digitalWrite(relCarb, HIGH);}
else digitalWrite(relCarb, LOW);}

//aspetto due secondi ed avvio il contatto del solenoide
{if ((millis() > temp0 + 22000) && (statoBenz == 1)){digitalWrite(motAvv, HIGH);}
else digitalWrite( motAvv, LOW);}

//se sul pin analogico A0 arriva +5V (>500) spengo l'avviamento, attendo 30 secondi e apro l'aria
{int tensione=(analogRead(feed));
if ((tensione > 800) && (mem1 != 1)) {digitalWrite(motAvv, LOW); temp1 = millis(); mem1 = 1;}
if ((tensione > 800) && (mem1 == 1)) {digitalWrite(motAvv, LOW);}
if ((tensione>800) && (millis() > (temp1 + 30000)) && (mem1 == 1)) {digitalWrite(relCarb, LOW);}

}
if (digitalRead(confAvv) == LOW){temp0 = 0; temp1 = 0; statoBenz = 0; mem0 = 0; mem1 = 0;}
}

// fine listato

ora il motore dovrebbe essere acceso bisogna scrivere cosa fare per spegnerlo



Modificato da calcola - 05/10/2014, 12:28:41


---------------
Impara l'arte e mettila da parte

14 pannelli da 100w, inverter kemapower 3kw, regolato...

 

calcola
GigaWatt


Utente
Msg:4435

Stato:



Inviato il: 04/10/2014 15:10:03

Se hai un pulsante di massa per lo spegnimento potremmo spegnerlo usando una uscita digitale, altrimenti lo si può spegnere chiudendo la benzina.
Inoltre occorre aggiungere un circuito per evitare che una sovratensione sul pin A0 bruci l'arduino, in certe situazioni il motore potrebbe generare più di 5V, la cosa più semplice è quella di inserire tra il pin A0 e la massa un diodo zenner 5V1.



Modificato da calcola - 04/10/2014, 15:13:40


---------------
Impara l'arte e mettila da parte

14 pannelli da 100w, inverter kemapower 3kw, regolato...

 

Walter64

Avatar
Watt


Utente
Msg:29

Stato:



Inviato il: 04/10/2014 15:50:27

Niente ingresso per spegnerlo ...
Si deve utilizzare l'ingresso pin 3, questo generatore è, e viene avviato da una uscita (on-off) presente su inverter fotovoltaico, lo stesso generatore una volta caricate le batterie FV, apre l'uscita, questo ferma il generatore.
Al pin 4 arriva una tensione corretta, pulita e sicura (in sostanza un relè di interfacciamento) comandato dal generatore, questo garantisce la sicurezza contro sovratensioni.
E' tornata mia moglie con la benzina ... oggi sono di turno (taglio siepe)...
a stasera ... grazie per la pazienza

 

calcola
GigaWatt


Utente
Msg:4435

Stato:



Inviato il: 04/10/2014 16:03:39

Allora il programma dovrebbe essere finito, perchè quando (confAvv) == LOW, il relè del rubinetto benzina va in low e dopo pochi minuti il motore si spegne per esaurimento del carburante.


CITAZIONE

a stasera ... grazie per la pazienza


di nulla, fai poi sapere se funziona bene, altrimenti...si fa sempre in tempo a modificarlo.
Ciao



Modificato da calcola - 04/10/2014, 16:24:20


---------------
Impara l'arte e mettila da parte

14 pannelli da 100w, inverter kemapower 3kw, regolato...

 

Walter64

Avatar
Watt


Utente
Msg:29

Stato:



Inviato il: 04/10/2014 22:19:57

Purtroppo nulla da fare... la verifica da questo come errore:

CITAZIONE

temp0 = 0;
temp1 = 0;

Domani ci riprovo ...
Buonanotte

 

calcola
GigaWatt


Utente
Msg:4435

Stato:



Inviato il: 04/10/2014 22:37:51

Ho corretto l'errore, ricopia il software, oppure togli quelle due righe.



---------------
Impara l'arte e mettila da parte

14 pannelli da 100w, inverter kemapower 3kw, regolato...

 

Walter64

Avatar
Watt


Utente
Msg:29

Stato:



Inviato il: 05/10/2014 09:20:29

Niente da fare ... il software si carica ma non gira !
Attuale situazione:
- scheda arduino uno rev. 3
- alimentazione tramite porta usb
- ingressi polarizzati a massa mediante resistenza da 10K
- simulazione contatti con interruttori a levetta al + 5v della scheda
- uscite pilotano dei BC 547 e relativi relè a 12 v
Risultato :
quando il pin 3 viene collegato al + 5v, la "sola" uscita pin 5 si porta immediatamente "alta" (senza nessun tipo di temporizzazione ) le rimanenti ovviamente sono spente ...
C'è qualcosa che sfugge .

 

calcola
GigaWatt


Utente
Msg:4435

Stato:



Inviato il: 05/10/2014 11:10:48

Il programma l'avevo scritto senza far delle prove, fatte le prove ho trovato un errore, ora funziona, la nuova versione l'ho provata con scheda e relay. Per brevità ho caricato la nuova versione modificando il post più sopra.

PS: Il programma lo attivo con un circuito interruttore sul pin3, non so se puoi semplicemente inviare la 5v sul pin. Il circuito che ho usato è di questo tipo:
http://www.nicolaamatucci.com/blog/wp-content/uploads/2009/04/a3_interruttore_schema.jpg
i poli dell'interruttore portali ai contatti del relè che hai a disposizione.

Ho fatto però delle prove collegando il pin3 direttamente con +5V e funziona lo stesso, però, ripeto non so se si può danneggiare la scheda. Vedi tu.

Se qualcosa ancora non va fammi sapere.



Modificato da calcola - 05/10/2014, 11:34:55


---------------
Impara l'arte e mettila da parte

14 pannelli da 100w, inverter kemapower 3kw, regolato...

 

Walter64

Avatar
Watt


Utente
Msg:29

Stato:



Inviato il: 05/10/2014 12:52:02

Ok adesso in parte gira ...(non funziona la parte sul pin 4, ma devo verificare) faccio gli opportuni "aggiustaggi" dei tempi.
Lo schema dei contatti è identico a quello che hai disegnato, i problemi sulla scheda di arduino possono nascere se si imposta il pinmode in OUT e poi mi entri con una tensione diretta, in questo caso per ovviare al problema si mette in serie al pin una resistenza da 10K (in caso di errore limiti la corrente, per non "bruciare" il contatto) arduino comunque accetta la tensione di 5v (mi sembra di ricordare che si danneggia sopra i 6,5 V ... ma non ci proverei)
Bene proseguiamo ...

 

calcola
GigaWatt


Utente
Msg:4435

Stato:



Inviato il: 05/10/2014 15:29:26


CITAZIONE

(non funziona la parte sul pin 4,


Il pin 4 non è stato usato, ho impiegato il 3, 5,6,7, A0.

CITAZIONE
i problemi sulla scheda di arduino possono nascere se si imposta il pinmode in OUT e poi mi entri con una tensione diretta


sarebbe stupido settare un pin in output e poi mettere una resistenza per usarlo in input, sarebbe sufficiente settarlo direttamente in input. No, la resistenza da 10K si mette per garantire il funzionamento al livello logico di high, con le ultime versioni delle schede non so più, ma con le versioni più datate se non si metteva la resistenza di pull-up si rischiava un cattivo funzionamento.

PS: atmega328 in ingresso massimo 5,5v stai attento all'ingresso feed, se non sei sicuro metti un diodo zener



Modificato da calcola - 05/10/2014, 15:34:44


---------------
Impara l'arte e mettila da parte

14 pannelli da 100w, inverter kemapower 3kw, regolato...

 

calcola
GigaWatt


Utente
Msg:4435

Stato:



Inviato il: 05/10/2014 15:38:31

Non appena arriva la richiesta il pin 5 va subito in high ed apre la benzina, non ho previsto temporizzazione, non serve.

l'ingresso feed l'ho spostato su A0



---------------
Impara l'arte e mettila da parte

14 pannelli da 100w, inverter kemapower 3kw, regolato...

 

Walter64

Avatar
Watt


Utente
Msg:29

Stato:



Inviato il: 05/10/2014 16:45:08


CITAZIONE

Non appena arriva la richiesta il pin 5 va subito in high ed apre la benzina, non ho previsto temporizzazione, non serve.

Sbagliato ... la temporizzazione dopo aver aperto la benzina, serve per dar tempo per riempire la vaschetta del carburatore, tra l'altro con il "vecchio" listato quando termina la necessità del servizio generatore, l'elettrovalvola si chiude e il generatore gira fino a quando svuota la vaschetta ... onde per cui la temporizzazione serve.
In ogni caso per sicurezza alla bobina dell'elettrovalvola metto un relè in parallelo, questo mi assicura lo spegnimento della candela ( un po' come si fa sui motorini di vecchio stampo che si metteva a massa la bobina AT (in questo caso arduino lo lasciamo a riposo.
Al tuo listato ho aggiunto un temporizzatore tra il consenso all'avviamento e l'effettiva richiesta, questo per evitare falsi contatti o se preferisci avviamenti indesiderati (solo dopo 5 secondi di effettiva richiesta il processo prosegue)
CITAZIONE
// se vi è il consenso all'avvio (pin 3 HIGH) attendo 5 secondi
// questo tempo serve per evitare falsi contatti, si conferma certezza per l'avvio
// dopo questo tempo apro la benzina ( in parallelo alla bobina dell'elettrovalvola
// alimento il relè che "apre" la chiusura a massa della candela
// così facendo portando il pin 3 LOW , il relè a riposo spegne la candela .... e fisso la variabile 0

{if ((digitalRead(confAvv) == HIGH) && (mem0 !=1)) {digitalWrite(evBenz, HIGH); statoBenz = 1; temp0 = millis(); mem0 = 1;}
if ((millis() > (temp0 + 5000)) && (digitalRead(confAvv) == HIGH) && (mem0 ==1)) {digitalWrite(evBenz, HIGH);}
else (digitalWrite(evBenz, LOW));}

//attendo altri 5 secondi ed chiudo l'aria
{if ((millis() > (temp0 + 10000)) && (statoBenz == 1)){digitalWrite(relCarb, HIGH);}
else digitalWrite(relCarb, LOW);}

Ho sbagliato a dire pin 4 ... era A0
CITAZIONE
comunque ha dei problemi, ci stò lavorando
sarebbe stupido settare un pin in output e poi mettere una resistenza per usarlo in input,

Hai ragione ... ma per sbadataggine si fa
CITAZIONE
attento all'ingresso feed, se non sei sicuro metti un diodo zener

Come detto installerò un piccolo relè di interfacciamento a garanzia di non aver nessun ritorno in tensione "strana" ... e comunque lo zener è sicuramente obbligatorio.

 

Walter64

Avatar
Watt


Utente
Msg:29

Stato:



Inviato il: 05/10/2014 17:08:22

Questa parte non mi gira (ho rincontrollato il pin A0)

CITAZIONE

//se sul pin analogico A0 arriva +5V (>500) spengo l'avviamento, attendo 30 secondi e apro l'aria
{int tensione=(analogRead(feed));
if ((tensione > 800) && (mem1 != 1)) {digitalWrite(motAvv, LOW); temp1 = millis(); mem1 = 1;}
if ((tensione > 800) && (mem1 == 1)) {digitalWrite(motAvv, LOW);}
if ((tensione>800) && (millis() > (temp1 + 30000)) && (mem1 == 1)) {digitalWrite(relCarb, LOW);}

Nel frattempo ho abbozzato questo (utilizzo però il pin digitale 4)
funzionicchia (mi parzializza l'uscita evBenz):
CITAZIONE
// se il pin 4 digitale diventa HIGH spegne il motorino d'avviamento
if (digitalRead(feed) == HIGH){temp1 = 0; mem0 = 0; mem1 = 0;}

Sono solo all'inizio mancano un paio di applicazioni ... sempre un passo per volta (serve una tempistica dall'inizio > chiudo l'aria < poi spiego meglio)

 

Walter64

Avatar
Watt


Utente
Msg:29

Stato:



Inviato il: 05/10/2014 17:29:09

Ho migliorato:

CITAZIONE

// attendo altri 5 secondi ed chiudo l'aria
// solo se il pin 4 digitale è LOW diversamente apre l'aria
{if ((millis() > (temp0 + 10000)) && (digitalRead(feed) == LOW) && (statoBenz == 1)) {digitalWrite(relCarb, HIGH);}
else digitalWrite(relCarb, LOW);}

// aspetto altro 1 secondo ed avvio il contatto del motorino d'avviamento
// solo se il pin 4 digitale è LOW diversamente spegne il motorino d'avviamento
{if ((millis() > temp0 + 11000) && (digitalRead(feed) == LOW)&& (statoBenz == 1)){digitalWrite(motAvv, HIGH);}
else digitalWrite( motAvv, LOW);}

In questo modo: quando il feed-back "attiva" il pin 4 (sono fissato ) spegne motorino d'avvio e a apre l'aria.
Ora devo aggiungere un ritardo all' apertura dell'aria (non vorrei che in fase di raggiungimento "regime" l'apertura dell'aria mi spenga il generatore (1-2 secondi)

 

calcola
GigaWatt


Utente
Msg:4435

Stato:



Inviato il: 05/10/2014 19:51:41

Allora al consenso apre la benzina, fissa la variabile ed inizia a contare, nel frattempo la vaschetta si riempie, dopo 20 secondi chiude l'aria, aspetta due secondi ed avvia il motore. Non appena sul analogRead(feed) sul pin A0 legge un valore>800, vuol dire che vi sono circa 4V in ingresso, quindi spegne il motorino di avviamento, fissa una nuova variabile tempo, da quel momento attende ancora 30 secondi e chiude l'aria. Quando poi il consenso va in OFF, va in off anche il relè benzina, finisce il carburante e si spegne.

Come vedi non manca nulla, ed il programma stamani l'ho ampiamente collaudato con dei relè collegati, se però ritieni di apportare modifiche fai pure. Come puoi notare, il programma però non è semplice, non è nulla di trascendentale, modificarlo può essere una buona palestra per imparare.



void loop(){

//se vi è il consenso all'avvio (pin3 high), apro la benzina e fisso la variabile 0

{if ((digitalRead(confAvv) == HIGH) && (mem0 !=1)) {digitalWrite(evBenz, HIGH); statoBenz = 1; temp0 = millis(); mem0 = 1;}
if ((digitalRead(confAvv) == HIGH) && (mem0 ==1)) {digitalWrite(evBenz, HIGH);}
else (digitalWrite(evBenz, LOW));}

//attendo 20 secondi ed chiudo l'aria
{if ((millis() > (temp0 + 20000)) && (statoBenz == 1)){digitalWrite(relCarb, HIGH);}
else digitalWrite(relCarb, LOW);}

//aspetto due secondi ed avvio il contatto del solenoide
{if ((millis() > temp0 + 22000) && (statoBenz == 1)){digitalWrite(motAvv, HIGH);}
else digitalWrite( motAvv, LOW);}

//se sul pin analogico A0 arriva +5V (>500) spengo l'avviamento, attendo 30 secondi e apro l'aria
{int tensione=(analogRead(feed));
if ((tensione > 800) && (mem1 != 1)) {digitalWrite(motAvv, LOW); temp1 = millis(); mem1 = 1;}
if ((tensione > 800) && (mem1 == 1)) {digitalWrite(motAvv, LOW);}
if ((tensione>800) && (millis() > (temp1 + 30000)) && (mem1 == 1)) {digitalWrite(relCarb, LOW);}

}
if (digitalRead(confAvv) == LOW){temp0 = 0; temp1 = 0; statoBenz = 0; mem0 = 0; mem1 = 0;}
}

// fine listato



Modificato da calcola - 05/10/2014, 19:56:30


---------------
Impara l'arte e mettila da parte

14 pannelli da 100w, inverter kemapower 3kw, regolato...

 
 InizioPagina
 

Pag: (4)   1   2   [3]   4    (Ultimo)

Versione Completa!

Home page     TOP100-SOLAR    Home page forum