| Kroko
| Inviato il: 01/06/2016 18:15:49
|
//Number of pulses, used to measure energy.
volatile long pulseCount = 0;
long lastpulseCount = 0 ;
//Used to measure power.
volatile unsigned long pulseTime, lastTime ;
//power and energy
float power, elapsedkWh;
//Number of pulses per wh - found or set on the meter.
int ppwh = 1; //1000 pulses/kwh = 1 pulse per wh
void setup()
{
pinMode(13, OUTPUT);
pinMode ( 3, INPUT_PULLUP);
// KWH interrupt attached to IRQ 1 = pin3
attachInterrupt(digitalPinToInterrupt(3), Pulse, FALLING);
}
void loop()
{
if (pulseCount != lastpulseCount) {
lastpulseCount = pulseCount ;
digitalWrite(13, HIGH);
Serial.print(pulseCount);
Serial.print(" ");
printing();
}
else digitalWrite(13, LOW);
delay(200);
}
// The interrupt routine
void Pulse()
{
lastTime = pulseTime;
pulseTime = micros();
pulseCount++ ;
}
void printing()
{
//Calculate power
power = (3600000000.0 / (pulseTime - lastTime)) / ppwh;
//Find kwh elapsed
elapsedkWh = (1.0 * pulseCount / (ppwh * 1000)); //multiply by 1000 to pulses per wh to kwh convert wh to kwh
//Print the values.
lcd.print(power, 4);
lcd.print(" Kw.Tot = ");
lcd.println(elapsedkWh, 3);
}
Modificato da BellaEli - 02/06/2016, 00:28:23
| | | | Kroko
| Inviato il: 01/06/2016 18:16:26
|
ciao ragazzi ho iniziato a buttare giu questo codice ma non funziona ancora mi aiutate? | | | | Kroko
| Inviato il: 01/06/2016 18:34:45
|
mi da questo errore
In function 'void setup()':
error: 'NOT_AN_INTERRUPT' was not declared in this scope
evidenziandomi questa stringa
attachInterrupt(digitalPinToInterrupt(3), Pulse, FALLING); | | | | calcola
| Inviato il: 01/06/2016 19:24:43
|
Eccomi, ho scritto qualche riga di codice che dovresti ricopiare ed adattare le varie componenti alle sezioni già scritte, quindi ricopia le istruzioni delle dichiarazioni iniziali, setup, loop e void nelle rispettive sezioni, poi devi sistemare le dichiarazioni delle porte per adattarle al tuo codice.
Il codice non l'ho provato, quindi probabilmente vi saranno delle modifiche da fare, nel caso prova a farle direttamente tu, chiedi consiglio al forum, se potrò continuerò a darti una mano, ma non ci sperare troppo, non ho molto tempo.
#define LED 6 //led lettura abilitata
#define sensLamp 8 //sensore fotodiodo
unsigned long T1,T2,T3;
const int P1 = 7; //pulsante per misura
byte blocco_letture;
int n_letture;
float kw = 0; // consumo istantaneo
float Tkw = 0; //totale consumo
float MTkw = 0; // media consumo
void setup() {
pinMode(LED, OUTPUT);
pinMode(sensLamp, INPUT);
pinMode(P1, INPUT);
T1 = 0;
T2 = 0;
T3 = 0;
n_letture = 0;
blocco_letture = 0;
}
void loop() {
if (P1 == HIGH){n_letture = 0; T1=0; T2=0; T3=0; kw = 0; Tkw = 0; MTkw = 0; delay (300); misura(); }
}
void misura(){
digitalWrite(LED, HIGH);
while (P1 != HIGH){
switch (blocco_letture) {
case 0: { if (digitalRead(sensLamp) == HIGH){T1 = millis(); blocco_letture = 1;}}
case 1: { if (digitalRead(sensLamp) == HIGH){T2 = millis(); n_letture ++; T3 = T2 - T1;
kw = 3600 / T3; Tkw = Tkw + kw; MTkw = Tkw / n_letture; T1 = T2; T2 = 0; T3 = 0;}}
}
}
digitalWrite(LED, LOW); delay(300);
}
--------------- 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.
| | | | Kroko
| Inviato il: 01/06/2016 19:46:09
|
grazie calcola per l'aiuto
ho caricato lo skatch inserendolo nel mio progetto
ho messo in stampa il valore MTkw
però non incrementa
sia premendo e rilasciando il pulsante
sia tenendo premuto il pulsante
ho notato però associando al pulsante la stringa
int buttonState = digitalRead(P1);
e stampandone a lcd il valore resta sempre 0
anche se fisicamente il pulsante funziona e alla pressione invia un +3.96v
Modificato da Kroko - 01/06/2016, 20:50:14
| | | | calcola
| Inviato il: 01/06/2016 20:41:39
|
Non nel void, ma nel loop, aggiungi due righe per visualizzare i kw sull'LCD e fai girare solo il codice che ho postato.
--------------- 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.
| | | | calcola
| Inviato il: 01/06/2016 20:45:11
|
Se la tua schedina fotoled ha due pin in uscita, ricordati di collegare solo il pin digitale e non quello analogico.
Il pulsante non lo devi mai tenere premuto devi solo dare un'impulso.
--------------- 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.
| | | | Kroko
| Inviato il: 01/06/2016 20:51:36
|
grazie calcola per l'aiuto
ho caricato lo skatch inserendolo nel mio progetto
ho messo in stampa il valore MTkw
però non incrementa
sia premendo e rilasciando il pulsante
sia tenendo premuto il pulsante
ho notato però associando al pulsante la stringa
int buttonState = digitalRead(P1);
e stampandone a lcd il valore resta sempre 0
anche se fisicamente il pulsante funziona e alla pressione invia un +3.96v | | | | Kroko
| Inviato il: 01/06/2016 21:09:12
|
nulla da fare ho messo addirittura su lcd tutti e 3 i valori di MTkw, Tkw e kw
ma una volta dato l'impulso e il photoled comincia a ricevere impulsi dai led del CE(me ne accorgo dal led sul sensore)
lo stato delle letture e delle potenze non varia
Ho sbagliato qualcosa io? | | | | Kroko
| Inviato il: 01/06/2016 21:16:15
|
#include "DHT.h" // INCLUDO LIBRERIA PER SENSORI DHT
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//STRINGHE DISPLAY LCD CON MODULO I2C
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); //PER IL DISPLAY 2X16 è IDONEO IL VALORE 0X3F PER IL 4X20 è 0X27
const int BACKLIGH_PIN = 10;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//STRINGA PHOTOLED
#define LED 6 //led lettura abilitata
#define sensLamp 3 //sensore fotodiodo
unsigned long T1,T2,T3;
const int P1 = 9; //pulsante per misura
byte blocco_letture;
int n_letture;
float kw = 0; // consumo istantaneo
float Tkw = 0; //totale consumo
float MTkw = 0; // media consumo
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//STRINGHE WATTMETRO
int OffsetPin = A3;
int TensionePin = A1;
int CorrentePin_1 = A2;
//Nuovo_Fattore_Conversione=Valore_Reale/Valore_Arduino*Fattore_Conversione_Attuale
float Fattore_Conversione_Tensione = 0.61054; //da calcolare
float Fattore_Conversione_Corrente_1 = 0.302; //da calcolare
float TensioneRMS ;
float CorrenteRMS_1 ;
float CorrenteRMS_2 ;
float PotenzaAttiva_1;
float PotenzaAttiva_2;
float PotenzaApparente_1;
float PotenzaApparente_2;
float FattorediPotenza_1;
float FattorediPotenza_2;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//STRINGHE SENSORI TEMPERATURA DHT11
#define DHTPIN0 2 // PIN DOVE è CONNESSO IL SENSORE DHT11 N°1 (TEMP. ESTERNA)
#define DHTPIN1 4 // PIN DOVE è CONNESSO IL SENSORE DHT11 N°2 (TEMP. TR ALTERNATA)
#define DHTPIN2 1 // PIN DOVE è CONNESSO IL SENSORE DHT11 N°3 (TEMP. TR CONTINUA)
#define DHTTYPE DHT11 // DEFINISCO IL TIPO DI SENSORE
DHT dht0(DHTPIN0, DHTTYPE); // SELEZIONA PIN E TIPO DEL SENSORE DHT11 N°1
DHT dht1(DHTPIN1, DHTTYPE); // SELEZIONA PIN E TIPO DEL SENSORE DHT11 N°2
DHT dht2(DHTPIN2, DHTTYPE); // SELEZIONA PIN E TIPO DEL SENSORE DHT11 N°3
float h0 = dht0.readTemperature(); // imposto la variabile h0 per la lettura del valore di dht0
float h1 = dht1.readTemperature(); // imposto la variabile h1 per la lettura del valore di dht1
float h2 = dht2.readTemperature(); // imposto la variabile h2 per la lettura del valore di dht2
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
pinMode(13, OUTPUT); //PIN LED GIALLO SEGNALAZIONE TEMPERATURA TR ALTERNATA 0<T<29
pinMode(12, OUTPUT); //PIN LED ROSSO SEGNALAZIONE TEMPERATURA TR ALTERNATA T>=30
pinMode(11, OUTPUT); //PIN LED GIALLO SEGNALAZIONE TEMPERATURA TR CONTINUA T>=30
pinMode(10, OUTPUT); //PIN LED ROSSO SEGNALAZIONE TEMPERATURA TR CONTINUA T>=30
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//STRINGA PHOTOLED
pinMode(LED, OUTPUT);
pinMode(sensLamp, INPUT);
pinMode(P1, INPUT);
T1 = 0;
T2 = 0;
T3 = 0;
n_letture = 0;
blocco_letture = 0;
Serial.begin(9600);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
dht0.begin(); //FAI PARTIRE IL SENSORE DHT11 N°1
dht1.begin(); //FAI PARTIRE IL SENSORE DHT11 N°2
dht2.begin(); //FAI PARTIRE IL SENSORE DHT11 N°3
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//STRINGHE DISPLAY LCD CON MODULO I2C
pinMode(BACKLIGH_PIN, OUTPUT);
digitalWrite(BACKLIGH_PIN, HIGH);
lcd.init(); // INIZIALIZZA IL MODULO LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("ZeraSim Project"); //SCRIVI SULLA PRIMA RIGA
lcd.setCursor(0,1);
lcd.print("VERSIONE FV 1.3"); //SCRIVI SULLA SECONDA RIGA
delay(5000);
lcd.clear();
ADCSRA&=0X90+ 0b101; //Setta ADC prescaler a 32
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//STRINGA PHOTOLED
if (P1 == HIGH){n_letture = 0; T1=0; T2=0; T3=0; kw = 0; Tkw = 0; MTkw = 0; delay (300); misura(); }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//STRINGHE WATTMETRO
float SommaV=0;
float SommaI_1=0;
float SommaP_1=0;
int NumCampionamenti = 20; //CONSIDERO 20 CAMPIONAMENTI
int Offset = analogRead(OffsetPin);
unsigned long start = micros() ;
while (micros() < (start + 20000)){
float Tensioneinst = (analogRead(TensionePin)-Offset)*Fattore_Conversione_Tensione;
float Correnteinst_1 = (analogRead(CorrentePin_1)-Offset)*Fattore_Conversione_Corrente_1;
SommaV += pow(Tensioneinst,2);
SommaI_1 += pow(Correnteinst_1,2);
SommaP_1 += (Tensioneinst*Correnteinst_1);
NumCampionamenti++;
}
TensioneRMS = sqrt(SommaV / NumCampionamenti);
CorrenteRMS_1 = sqrt(SommaI_1 / NumCampionamenti);
if (CorrenteRMS_2 < 0.10) {//soglia minima
CorrenteRMS_2=0;
PotenzaAttiva_1 = SommaP_1/ NumCampionamenti;
PotenzaApparente_1 = TensioneRMS * CorrenteRMS_1;
FattorediPotenza_1 = PotenzaAttiva_1/PotenzaApparente_1;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//STRIGHE DISPLAY
{
lcd.setCursor(0, 0); //IMPOSTO IL PUNTO SUL DISPLAY
lcd.print(TensioneRMS,0); //IMPOSTO IL VALORE DA LEGGERE SENZA VIRGOLA
lcd.print("V "); //IL VALORE SARà SEGUITO DALLA LETTERA V
lcd.setCursor(5, 0); //IMPOSTO IL PUNTO SUL DISPLAY
lcd.print(CorrenteRMS_1,2); //IMPOSTO IL VALORE DA LEGGERE CON UNA CIFRA DOPO LA VIRGOLA
lcd.print("A "); //IL VALORE SARà SEGUITO DALLA LETTERA A
lcd.setCursor(11,0); //IMPOSTO IL PUNTO SUL DISPLAY
lcd.print(PotenzaAttiva_1,0); //IMPOSTO IL VALORE DA LEGGERE SENZA VIRGOLA
lcd.print("W "); //IL VALORE SARà SEGUITO DALLA LETTERA W
lcd.setCursor(16,0); //IMPOSTO IL PUNTO SUL DISPLAY
lcd.print(FattorediPotenza_1,1); //IMPOSTO IL VALORE DA LEGGERE CON UNA CIFRA DOPO LA VIRGOLA
lcd.print(""); //
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//ACCENSIONE O MENO DEI LED DI SEGNALAZIONE LUMINOSA DELLA TEMPERATURA
if (28<dht1.readTemperature()<29){ // se il sensore h1 rileva una determinata temperatura accende LED GIALLO
digitalWrite (13, HIGH);
}
if (dht1.readTemperature()>=30){ // se il sensore h1 rileva una determinata temperatura accende LED ROSSO
digitalWrite (12,HIGH);
}
else{ //ALTRIMENTI IL LED ROSSO RESTA SPENTO
digitalWrite (12,LOW);
}
if (28<dht2.readTemperature()<29){ // se il sensore H2 rileva una determinata temperatura accende LED GIALLO
digitalWrite (11, HIGH);
}
if (dht2.readTemperature()>=30){ // se il sensore H2 rileva una determinata temperatura accende LED ROSSO
digitalWrite (10,HIGH);
}
else{ //ALTRIMENTI IL LED ROSSO RESTA SPENTO
digitalWrite (10,LOW);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//LETTURA E STAMPA SU LCD DEI VALORI DI TEMPERATURA
float h0 = dht0.readTemperature();
float h1 = dht1.readTemperature();
float h2 = dht2.readTemperature();
lcd.setCursor(0, 1); //PRENDO COME RIFERIMENTO LཇMO PUNTO SULLA 1A STRINGA DELLO SCHERMO LCD
lcd.print(h0,0); //STAMPO SU LCD IL VALORE DEL SENSORE h0
lcd.print("E"); //IL VALORE SARà SEGUITO DALLA LETTERA E
lcd.setCursor(4, 1); //PRENDO COME RIFERIMENTO LཇMO PUNTO SULLA 1A STRINGA DELLO SCHERMO LCD
lcd.print(h1,0); //STAMPO SU LCD IL VALORE DEL SENSORE h1
lcd.print("w"); //IL VALORE SARà SEGUITO DAL SIMBOLO ^
lcd.setCursor(8, 1); //PRENDO COME RIFERIMENTO LཇMO PUNTO SULLA 1A STRINGA DELLO SCHERMO LCD
lcd.print(h2,0); //STAMPO SU LCD IL VALORE DEL SENSORE h2
lcd.print("-");
lcd.setCursor(0, 2); //PRENDO COME RIFERIMENTO LཇMO PUNTO SULLA 1A STRINGA DELLO SCHERMO LCD
lcd.print(MTkw,0); //STAMPO SU LCD IL VALORE DEL SENSORE h2
lcd.print("");
lcd.setCursor(5, 2); //PRENDO COME RIFERIMENTO LཇMO PUNTO SULLA 1A STRINGA DELLO SCHERMO LCD
lcd.print(kw,0); //STAMPO SU LCD IL VALORE DEL SENSORE h2
lcd.print("");
lcd.setCursor(10, 2); //PRENDO COME RIFERIMENTO LཇMO PUNTO SULLA 1A STRINGA DELLO SCHERMO LCD
lcd.print(Tkw,0); //STAMPO SU LCD IL VALORE DEL SENSORE h2
lcd.print("");
// Legge lo stato sul PIN 2
int buttonState = digitalRead(P1);
// Stampa sul Serial Monitor il valore letto sul pin 2 (pushButton)
Serial.print(buttonState);
delay(1000); // ritardo di un secondo
}
void misura(){
digitalWrite(LED, HIGH);
while (P1 != HIGH){
switch (blocco_letture) {
case 0: { if (digitalRead(sensLamp) == HIGH){T1 = millis(); blocco_letture = 1;}}
case 1: { if (digitalRead(sensLamp) == HIGH){T2 = millis(); n_letture ++; T3 = T2 - T1;
kw = 3600 / T3; Tkw = Tkw + kw; MTkw = Tkw / n_letture; T1 = T2; T2 = 0; T3 = 0;}}
}
}
digitalWrite(LED, LOW); delay(300);
}
| | | | Kroko
| Inviato il: 01/06/2016 21:19:25
|
il codice ora è diventato questo
il programma non mi da nessun errore salvo il fatto che
scusate se mi ripeto ma le potenze non incrementano restando sempre a 0 | | | | BellaEli
| Inviato il: 02/06/2016 00:24:51
|
Ciao Kroko, dunque...
prima di tutto hai verificato che arduino legge correttamente il foto led ? Hai provato a scrivere 2 righe di codice che, ad esempio, accendono un Led quando il foto Led è attivato ?
Nell'ultima riga c'è un delay di 300 mS, forse è eccessivo, potrebbe capitare che il lampeggio non venga beccato, tuttavia diminuirlo troppo potrebbe generare errori di lettura: hai la possibilità di misurare quanto dura il lampeggio ?
Perché hai abbandonato l'idea dell'interrupt ?
Da quello che ho capito bisogna tener premuto il pulsante per partire con le letture che si azzereranno non appena il pulsante viene rilasciato, giusto ?
Dovresti pubblicare anche lo schema elettrico, costruirlo a mente dalle variabili è davvero complicato...
Scusami se non riesco a seguirti come vorrei, il tempo è sempre poco...
Non sei così inesperto come volevi farci credere...!!!
Elix
--------------- C'è un limite al fai da te ??? Si, ma lo stabiliamo noi !!!
| | | | Kroko
| Inviato il: 02/06/2016 00:38:47
|
allora sto scimunendo sopra
quello che ho capito è che il mio photoled quando capta il segnale passa da 1 a 0
nel codice qualcosa mi blocca i tempi cioè le T1 e T2 ma non mi so ancora spiegare cosa
ora vado a dormire
buona notte a tutti
e se qualcuno può ritagliarmi un po' di tempo gli sarei molto grato
ogni consiglio è ben accetto | | | | Kroko
| Inviato il: 02/06/2016 00:43:18
|
CITAZIONE (BellaEli, 02/06/2016 00:24:51 )
Ciao Kroko, dunque...
prima di tutto hai verificato che arduino legge correttamente il foto led ? Hai provato a scrivere 2 righe di codice che, ad esempio, accendono un Led quando il foto Led è attivato ?
lo provo domani
CITAZIONE
Nell'ultima riga c'è un delay di 300 mS, forse è eccessivo, potrebbe capitare che il lampeggio non venga beccato, tuttavia diminuirlo troppo potrebbe generare errori di lettura: hai la possibilità di misurare quanto dura il lampeggio ?
l'ho ridotto a 50ms il tempo minimo di un lampeggio
CITAZIONE
Perché hai abbandonato l'idea dell'interrupt ?
non ho abbandonato nessuna strada purtroppo l'inesperienza nel settore mi costringe ad attendere voi esperti
per questo vi dico se avete un po di tempo non mi abbandonate
CITAZIONE
Da quello che ho capito bisogna tener premuto il pulsante per partire con le letture che si azzereranno non appena il pulsante viene rilasciato, giusto ?
tutto da provare da come mi ha spiegato calcola basta premerlo una volta e si passa in modalità misura
CITAZIONE
Dovresti pubblicare anche lo schema elettrico, costruirlo a mente dalle variabili è davvero complicato...
Scusami se non riesco a seguirti come vorrei, il tempo è sempre poco...
Elix
Modificato da BellaEli - 02/06/2016, 01:00:50
| | | | BellaEli
| Inviato il: 02/06/2016 01:07:50
|
CITAZIONE
tutto da provare da come mi ha spiegato calcola basta premerlo una volta e si passa in modalità misura
Sto col cell, non ho uno sguardo complessivo del codice, tuttavia c'è il ciclo while (P1 != High), quindi la misura dovrebbe essere effettuata solamente se il pulsante è pigiato... Tuttavia senza schema elettrico ogni cosa potrebbe essere interpretata nel modo errato...
CITAZIONE
quello che ho capito è che il mio photoled quando capta il segnale passa da 1 a 0
Allora dovresti sostituire le due istruzioni alla fine digitalRead (SensLamp) == HIGH con == LOW !
Elix
--------------- C'è un limite al fai da te ??? Si, ma lo stabiliamo noi !!!
| |
| | |
|
Versione Mobile!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|