salve,
vorrei utilizzare al 100% l'energia prodotta dal mio impianto fotovoltaico evitando di inviare in rete la parte non utilizzata, per cui ho pensato di riscaldare l'acqua di un boiler con l'energia non utilizzata nei momenti di poca richiesta da parte delle utenze di casa. Al momento ho inserito un wattmetro che misura quanta potenza non utilizzo e che immetto in rete ( WATTMETRO DIREZIONALE), lo strumento ha un uscita 0-5 volt da poter inviare ad ingresso analogico di arduino, ma non ho ancora conoscenze di programmazioni tali per realizzare uno sketch per arduino che generi un treno di impulsi variabili ( in fase con lo zero crossing ) per eccitare un triac che regoli la potenza da scaricare sulla resistenza del boiler in proporzione a quella inviata in rete. in modo da pareggiare il conto.
Spero in un vostro aiuto,
grazie Mario
Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento
- qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- qui le pinout delle varie schede by xxxPighi: Pinout
- qui una serie di link generali utili: Link Utili
nid69, alla fine metà dei tuoi post saranno identici a questo, lo sai vero? XD
leo72:
nid69, alla fine metà dei tuoi post saranno identici a questo, lo sai vero? XD
Almeno sono coerenti
Io ho sempre pensato che nid ricevesse 1 euro per ogni "Ti invitiamo a presentarti" ... perché è impossibile che non ne scappa uno .... è un cacciatore di taglie!!!
@mariopuccetti
Dipende tutto da come funziona l' inverter che usi a rodurre la 230V AC. La regoalzione ch proponi non é una regolazione lineare con una potenza costante ma accendi in parti del tempo in pieno l'utenza.
Ciao Uwe
Per cominciare ti consiglio di leggere l'articolo e relativo sketch:
pablos:
Io ho sempre pensato che nid ricevesse 1 euro per ogni "Ti invitiamo a presentarti" ..
La realtà è che viene multato di 1 Euro per ognuno che gli scappa.
Grazie Cyberhs,
ho visitato la pagina che mi hai postato e penso che questo circuito dovrebbe risolvere la parte della potenza, lunedì acquisterò i componenti , adesso mi manca come acquisire il segnale proveniente dal wattmetro 0-5 volt pari a 0-3 kw e proporzionalmente comandare il triac, quindi realizzare una regolazione proporzionale: 0% ingresso= triac non comandato, 50% ingresso=triac comandato per mezza semionda.
Hai qualche idea?
Grazie, Mario
Devi semplicemente acquisire il segnale 0-5V su un ingresso analogico di Arduino e convertirlo, ad esempio, in potenza percentuale da utilizzare per determinare il tempo di apertura del gate del TRIAC:
int PotPerc = 0; // potenza percentuale da 0% a 100%
PotPerc = map(analogRead(A0), 0, 1023, 0, 100); // converte lettura analogica in PotPerc
Ciao Cyberhs,
ho avuto un po' di problemi che mi hanno deviato dal progetto per cui ho ripreso solo da pochi giorni in mano il tutto realizzando il circuito di rilevamento e innesco del triac, ma sono fermo con il programma per arduino, come dicevo al momento non ho le conoscenze e mi trovo in difficoltà a capire il programma che segue il progetto del AC Phase Control nella pagina che mi hai postato, hai la possibilità di darmi un ulteriore aiuto scrivendomi il programma?
Grazie in ogni caso, saluti
Mario
Ciao Cyberhs,
ho avuto un po' di problemi che mi hanno deviato dal progetto per cui ho ripreso solo da pochi giorni in mano il tutto realizzando il circuito di rilevamento e innesco del triac, ma sono fermo con il programma per arduino, come dicevo al momento non ho le conoscenze e mi trovo in difficoltà a capire il programma che segue il progetto del AC Phase Control nella pagina che mi hai postato, hai la possibilità di darmi un ulteriore aiuto scrivendomi il programma?
Grazie in ogni caso, saluti
Mario
hai la possibilità di darmi un ulteriore aiuto scrivendomi il programma?
Posso aiutarti a comprendere il listato, ma non puoi pretendere che lo scriva io per te, anche perché solo sforzandosi si impara, non ti pare?
Dimmi cosa non capisci e vedrò di aiutarti.
ok, al momento mi chiedevo su quale ingresso devo inserire il segnale che proviene dal IC1, quale uscita devo collegare a IC2, a quale ingresso variabile devo collegare il segnale 0-5 volt proveniente dal wattmetro e dove inserire la riga del programma che mi hai mandato.
grazie
Il primo fotoaccoppiatore IC1 serve a determinare lo zero crossing e la sua uscita deve andare sul pin 2 di Arduino (ingresso digitale), poiché viene gestito con uno dei due pin di external interrupt di cui UNO dispone.
Il secondo fotoaccoppiatore, invece, serve a pilotare il gate del TRIAC e la sua entrata (LED) deve essere collegata ad una uscita digitale di Arduino (nello sketch è stato usato il 9).
Il segnale dal wattmetro deve essere collegato ad un ingresso analogico (ad esempio A0) e nel loop (cancella quelle istruzioni di esempio) devi inserire:
i = map(analogRead(A0), 0, 1023, 65, 483);
Grazie, quindi questo dovrebbe essere lo schetch
#include <avr/io.h>
#include <avr/interrupt.h>
#define DETECT 2 //zero cross detect
#define GATE 9 //triac gate
#define PULSE 4 //trigger pulse width (counts)
int i=483;
void setup(){
// set up pins
pinMode(DETECT, INPUT); //zero cross detect
digitalWrite(DETECT, HIGH); //enable pull-up resistor
pinMode(GATE, OUTPUT); //triac gate control
// set up Timer1
//(see ATMEGA 328 data sheet pg 134 for more details)
OCR1A = 100; //initialize the comparator
TIMSK1 = 0x03; //enable comparator A and overflow interrupts
TCCR1A = 0x00; //timer control registers set for
TCCR1B = 0x00; //normal operation, timer disabled
// set up zero crossing interrupt
attachInterrupt(0,zeroCrossingInterrupt, RISING);
//IRQ0 is pin 2. Call zeroCrossingInterrupt
//on rising signal
}
//Interrupt Service Routines
void zeroCrossingInterrupt(){ //zero cross detect
TCCR1B=0x04; //start timer with divide by 256 input
TCNT1 = 0; //reset timer - count from zero
}
ISR(TIMER1_COMPA_vect){ //comparator match
digitalWrite(GATE,HIGH); //set triac gate to high
TCNT1 = 65536-PULSE; //trigger pulse width
}
ISR(TIMER1_OVF_vect){ //timer1 overflow
digitalWrite(GATE,LOW); //turn off triac gate
TCCR1B = 0x00; //disable timer stopd unintended triggers
}
void loop(){
i = map(analogRead(A0), 0, 1023, 65, 483);.
}
a riguardo della differente frequenza di rete 60Hz americana 50Hz nostra, i tempi di zero crossing cambiano è quindi necessario cambiare qualche parametro?
Grazie, saluti.
EDIT BY MOD: includere il codice usando gli appossiti tag
Lo sketch funziona così: all'arrivo del segnale dello zero crossing fatto con un interrupt, viene fatto partire un timer che, all'overflow, stacca il triac.
Controlla se i tempi tra l'attivazione del timer e l'overflow sono giusti
a riguardo della differente frequenza di rete 60Hz americana 50Hz nostra, i tempi di zero crossing cambiano è quindi necessario cambiare qualche parametro?
Sì, hai ragione.
The hardware clock runs at 16MHz.
Using a divide by 256 for counter of Timer1, each count is 16 μs.
1/2 wave of a 50Hz AC signal (10 ms) is 625 counts
1/2 wave of a 60Hz AC signal (16.66 ms) is about 520 counts.
Il valore 483 ed il valore 65 dovrebbero essere aumentati di conseguenza.
Tra l'altro in quei conti c'è un errore anche se poi il risultato è giusto... 16,66ms non sono una semionda a 60Hz sono un onda intera...
quindi il potrebbe essere questo?
#include <avr/io.h>
#include <avr/interrupt.h>
#define DETECT 2 //zero cross detect
#define GATE 9 //triac gate
#define PULSE 4 //trigger pulse width (counts)
int i=483;
void setup(){
// set up pins
pinMode(DETECT, INPUT); //zero cross detect
digitalWrite(DETECT, HIGH); //enable pull-up resistor
pinMode(GATE, OUTPUT); //triac gate control
// set up Timer1
//(see ATMEGA 328 data sheet pg 134 for more details)
OCR1A = 100; //initialize the comparator
TIMSK1 = 0x03; //enable comparator A and overflow interrupts
TCCR1A = 0x00; //timer control registers set for
TCCR1B = 0x00; //normal operation, timer disabled
// set up zero crossing interrupt
attachInterrupt(0,zeroCrossingInterrupt, RISING);
//IRQ0 is pin 2. Call zeroCrossingInterrupt
//on rising signal
}
//Interrupt Service Routines
void zeroCrossingInterrupt(){ //zero cross detect
TCCR1B=0x04; //start timer with divide by 256 input
TCNT1 = 0; //reset timer - count from zero
}
ISR(TIMER1_COMPA_vect){ //comparator match
digitalWrite(GATE,HIGH); //set triac gate to high
TCNT1 = 65536-PULSE; //trigger pulse width
}
ISR(TIMER1_OVF_vect){ //timer1 overflow
digitalWrite(GATE,LOW); //turn off triac gate
TCCR1B = 0x00; //disable timer stopd unintended triggers
}
void loop(){ //
i = map(analogRead(A0), 0, 1023, 65, 483);
}
EDIT BY MOD: INSERITO CODICE NEGLI APPOSITI TAG
saluti.
Mario