EnergiAlternativa

Page Index Toggle Pages: 1 ... 9 10 [11] 12 13 ... 19 Send TopicPrint
Hot Topic (More than 100 Replies) Voltmetro, Amperometro, Wattmetro, Contatori Assor (Read 171830 times)
5a2v0
New Member
*
Offline


--------

Posts: 38
Location: Cefalu'
Gender: Male
Zodiac sign: Virgo
Re:Voltmetro, Amperometro, Wattmetro, Contatori Assorbimento
Reply #150 - 21.07.14 at 13:03:05
Print Post  
Guarda, per creare il programmino Android io mi sono servito della piattaforma online messa a disposizione dal sito:

appinventor.mit.edu

però ora è anche disponibile la versione 2 della piattaforma che dovrebbe dare qualche vantaggio in più..

ai2.appinventor.mit.edu

Con questa piattaforma, prima ti crei graficamente l'interfaccia dell'app, trascinando all'interno di un display virtuale gli oggetti come:
campi di testo, bottoni, immagini etc etc

Poi in una seconda schermata (blocchi) vai a "incastrare" (letteralmente) le tessere a mo' di puzzle per definire le azioni...

Il tutto testabile su dispositivi android anche in fase di costruzione tramite un app che si installa direttamente sul cell oppure tramite emulatore (java che si apre sul tuo pc) che crea un telefono virtuale e ti ci apre dentro l'app ! Wink
  
Back to top
 
IP Logged
 
ElettroshockNow
Forum Administrator
*****
Offline


yottawatt

Posts: 3920
Location: Roma
Gender: Male
Zodiac sign: Gemini
Re:Voltmetro, Amperometro, Wattmetro, Contatori Assorbimento
Reply #151 - 21.07.14 at 13:45:32
Print Post  
:angel1.gif: grazie .... è una genialata ...

semplice e intuitivo ....
  

Il Tempo non lo vede nessuno,il lavoro lo vedono tutti (Mamma)
Impara a rubare con gli occhi (Papà)
Back to top
YouTube  
IP Logged
 
Valisi
Ex Member
*


--------

Gender: Male
Re:Voltmetro, Amperometro, Wattmetro, Contatori Assorbimento
Reply #152 - 21.07.14 at 15:55:19
Print Post  
Ciao ElettroshockNow, sono un nuovo iscritto e saluto tutti. Vorrei fare anch'io un amperometro con Arduino, sempre per controllare la corrente prodotta da un grid tie rispetto a quella consumata... Stavo valutando le varie ipotesi di utilizzo di sensori come quelli effetto Hall da te usati, oppure dei trasformatori amperometrici...

Stavo guardavo la foto del "doppio sensore in scatola" del post n.1 e la domanda che vorrei porti è, visto che li hai impachettati bene con nastro autoagglomerante, non ci sono problemi di surriscaldamento?
Sicuramente no, visto che l'hai fatto, ma rimangono proprio freddi o c'è un certo riscaldamento?
Perchè sono perplesso dal fatto che possano circolare fino a 30A in un integrato così piccolo... Smiley

Grazie, ciao.
  
Back to top
 
IP Logged
 
ElettroshockNow
Forum Administrator
*****
Offline


yottawatt

Posts: 3920
Location: Roma
Gender: Male
Zodiac sign: Gemini
Re:Voltmetro, Amperometro, Wattmetro, Contatori Assorbimento
Reply #153 - 21.07.14 at 16:18:40
Print Post  
Ciao Valisi .... hai parzialmente ragione Wink

Se la corrente resta nei limiti funzionano perfettamente restando praticamente freddi ,ma ... ma .... come si sbaglia loro passano a miglior vita.
I kA raggiunti in un possibile corto ( :crutch.gif: ) vaporizzano il piccolo chip ....

Sfogliando la discussione a pagina 6  -----> LINK

Attualmente uso gli SCT-013-030  ,ma il nuovo power meter userà nuovamente sensori Hall tipo HASS 100S o equivalenti (in pratica quelli con il buco Smiley )

Ciao
Elettro
  

Il Tempo non lo vede nessuno,il lavoro lo vedono tutti (Mamma)
Impara a rubare con gli occhi (Papà)
Back to top
YouTube  
IP Logged
 
Valisi
Ex Member
*


--------

Gender: Male
Re:Voltmetro, Amperometro, Wattmetro, Contatori Assorbimento
Reply #154 - 21.07.14 at 16:48:31
Print Post  
Interessante ragguaglio. Grazie. Wink
  
Back to top
 
IP Logged
 
supermomo717
Ex Member
*


--------

Gender: Male
Re:Voltmetro, Amperometro, Wattmetro, Contatori Assorbimento
Reply #155 - 28.07.14 at 23:41:19
Print Post  
Alla fine l'ho rifatto il PowerMeter Remoto.
Questa versione include il display e la tastiera esattamente come fa il PowerMeter originale.
Ho inserito solo le seguenti funzioni aggiuntive:
- Impostazione del tempo di stacco del carico (in modo che l'avvio del carico collegato non crei un abbassamento istantaneo della potenza tale da far staccare l'alimentazione immediatamente dopo l'avvio creando un loop).
- Segnalazione diretta sul display di IMMISSIONE/PRELIEVO da rete e in quale misura.
- Segnalazione diretta sul display di ricezione corretta del segnale radio da parte del PowerMeter.
- Spegnimento del display dopo 60 secondi (impostabile) dalla pressione dell'ultimo tasto a meno che la produzione non sia maggiore del consumo (così il display non consuma nel momento il cui prelevo da rete mentre resta acceso durante il giorno così senza toccarlo lo si può leggere comodamente come se fosse un normalissimo indicatore).
La comodità di questa versione è il fatto di essere portatile, quindi trasferibile nel posto più congeniale. Non volete usare le uscite? diventa ottimo come semplice visualizzatore remoto dei propri dati domestici.
  
Back to top
 
IP Logged
 
supermomo717
Ex Member
*


--------

Gender: Male
Re:Voltmetro, Amperometro, Wattmetro, Contatori Assorbimento
Reply #156 - 28.07.14 at 23:44:23
Print Post  
Lato alimentazione e presa per il carico. La seconda l'aggiungo appena un connettore mi passa per le mani. Il cavo Usb della foto è naturalmente staccabile in qualsiasi momento. Il tasto e il led sono Collegati, devo solo decidere cosa far fare loro....
  
Back to top
 
IP Logged
 
supermomo717
Ex Member
*


--------

Gender: Male
Re:Voltmetro, Amperometro, Wattmetro, Contatori Assorbimento
Reply #157 - 30.09.14 at 09:31:12
Print Post  
Buongiorno, ho modificato ancora il Powermeter adattandolo alle mie esigenze e adesso mi fa anche questo che vedete in figura... Un RTC sostituirà a breve il numero progressivo con l'orario effettivo. Vedrò di postare la mia esperienza in questo progetto, non si sa mai che possa tornare utile a qualcuno.
  
Back to top
 
IP Logged
 
ElettroshockNow
Forum Administrator
*****
Offline


yottawatt

Posts: 3920
Location: Roma
Gender: Male
Zodiac sign: Gemini
Re:Voltmetro, Amperometro, Wattmetro, Contatori Assorbimento
Reply #158 - 30.09.14 at 10:08:50
Print Post  
Che bello
  

Il Tempo non lo vede nessuno,il lavoro lo vedono tutti (Mamma)
Impara a rubare con gli occhi (Papà)
Back to top
YouTube  
IP Logged
 
supermomo717
Ex Member
*


--------

Gender: Male
Re:Voltmetro, Amperometro, Wattmetro, Contatori Assorbimento
Reply #159 - 03.10.14 at 12:00:44
Print Post  
I tempi sono maturi, quindi ecco il nuovo PowerMeter 4.0
Innanzitutto allego lo schema del nuovo PowerMeterTx 4.0.
Non ci si fa molto se usato da solo, al massimo va bene come ispirazione.

ecco il codice:


*Progetto PowerMeterTx 4.0

  ***Trasmettitore***

Modifiche apportate rispetto alla precedente versione di ElettroshockNow:
- Aggiunto nuovo sensore per monitorare GSE , CONSUMO e EXTRA (*)
- Inserito invio Potenza Extra al ricevitore remoto
- Inserito salvatagio in eeprom Potenza Extra
- N°1 Uscita per controllo soglie (impostate da sketch) o gestione carico
- Utilizzo display senza tastiera inclusa nello shield (soglie non modificabili)
- Invio segnale radio max ogni 2 secondi
- Led2 per segnalazione esubero di produzione (**)

(*) Casomai ci sia un inverter tie grid aggiuntivo oltre al vostro impianto fotovoltaico
(**) L'esubero si verifica quando le utenze prelevano meno energia di quanta prodotta da EXTRA

Ottimo per lavorare in abbinamento con PowerMeterRx 4.0 ***Ricevitore** (opzionali: PowerDimmer 4.0 - PowerLogger 4.0 - PowerWeb 4.0)

Per tutte le connessioni fare riferimento allo Sketch.
Ciscuito Alimentazione come per Powermeter Rev3.5
  Saluti
  Supermomo717
--------------------------------------------------------------------------------
-----
  Progetto Powermeter Rev3.5
  Un sentito ringraziamento al  Forum
  "" Energia Alternativa & Energia Fai Da Te ""
  http://energialternativa.org/
 
  Saluti
  ElettroshockNow
----------------------------------------------------------------------------   
INFO:il Powermeter dispone di memoria eeprom interna nella quale salva a cadenza di
4 ore il valore contenuto nei contatori e le soglie impostate.
Se si desidera resettare i contatori e ricaricare le soglie di default :
-disalimentare il circuito
-premere e mantenere premuto il pulsante (il Pulsante  connesso al Pin2)
-alimentare il circuito
-attendere la scritta "ATTENZIONE RESET CONTATORI TRA 4H"
-rilasciare il pulsante
A questo punto il reset e' armato e sara'  attivato allo scadere delle 4H.
Quindi se erroneamente si resettano i contatori ,bastera'  disalimentare e rialimentare il
circuito per recuperare l'ultimo Backup.
-----------------------------------------------------------------
*/
//IMPOSTAZIONI UTENTE (Scegliere le preferenze)

const boolean ConfigB = false;    //Configurazione B ? true or false
                                  //Scegli lo schema di installazione piu' adatto
                                  //false = doppio contatore simultaneo
                                  //true = doppio contatore funzionamento selettivo

const byte PagDefault = 0;      // Scegli la schermata di default..Smiley
                                //0 = Wattmetro
                                //1 = Voltmetro + stato UPS
                                //2 = Amperometro
                                //3 = Contatori

const boolean Retroilluminazione = false;  // Retroilluminazione Display
                                           //true= con timer (solo con pulsante)
                                           //false= sempre ON

const int TempoLed = 200;       //Scegli il Tempo della retroilluminazione
                                //allo spengimento si imposterà la pagina di Default
                                //Ogni unita vale circa 2 secondi Smiley
                              
                               
//------------------------------------------------------------
//  LIBRERIE
#include <VirtualWire.h>
#include <EEPROM.h>
#include <LiquidCrystal.h>


//-----------------------------------------------------------
//   VARIABILI E COSTANTI
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);    //ASSEGNAZIONE PIN  LCD
const int BACKLIGH_PIN = 10;            //Assegnazione Retroilluminazione

String keyString = "";
int localKey = 0; //Select-1;Left-2;Up-3;Down-4;Right-5;
const int ProdottaPin =  A2;  //Sensore GSE
const int AssorbitaPin = A3;  //Sensore Assorbimento
const int TensionePin =  A4;  //Alimentatore Powermeter
const int ProdottaPin2 =  A5; //Sensore EXTRA
const int transmit_pin = 8;   //Pin Trasmettitore
const int receive_pin =  14;
const int transmit_en_pin = 15;
const int Uscita1 = 11;
const int Uscita2 = 12;
const int ADR=100;//Indirizzo PowerMeter
const int ResetPin = 9;    //se posto a 1 resetta i contatori
const int PagPin = 9;      //se premuto scorre le pagine
byte pagina = PagDefault; //PAGINA DA VISUALIZZARE SULL'LCD
byte monitor = 1; //Potenza da monitorare
int Timeout = TempoLed;//Timeout
unsigned long lcd_Time;
byte Tensione = 0;
byte Frequenza = 50;
unsigned long ProdottaMedia = 0;//Somma delle campionature
unsigned long ProdottaMedia2 = 0;//Somma delle campionature
unsigned long AssorbitaMedia = 0;//Somma delle campionature
float ProdottaMediaP = 0;//Amper Prodotti
float ProdottaMediaP2 = 0;//Amper Prodotti
float AssorbitaMediaP = 0;//Amper Assorbiti
int PotenzaPro;//Potenza Prodotta (Amper Prodotti*Tensione)
int PotenzaPro2;//Potenza Prodotta (Amper Prodotti*Tensione)
int PotenzaAss;//Potenza Assorbita (Amper Assorbiti*Tensione)
int PotenzaMon;//Potenza da Monitorare
unsigned long time = 0;//Tempo dall'ultimo invio via radio
unsigned long Tmemoria = 0;//Tempo dall'ultimo BackUp
unsigned long TCampionature = 0;//Tempo dall'ultima Campionatura
float TotProdotta = 0;//Contatore Totale Prodotta
float TotProdotta2 = 0;//Contatore Totale Prodotta
float TotAssorbita = 0;//Contatore Totale Assorbita
int Uscita_1_ON ;
int Uscita_1_Time ;
unsigned long TUscita1 = 0;
int Uscita_1_OFF ;




void setup() {
  ADCSRA&=0X90+0b100;
  Serial.begin(9600);

  vw_set_tx_pin(transmit_pin);
  vw_set_rx_pin(receive_pin);
  vw_set_ptt_pin(transmit_en_pin);
  vw_set_ptt_inverted(true);
  vw_setup(2000);
  pinMode(Uscita1, OUTPUT);
  digitalWrite(Uscita1,LOW);
  pinMode(Uscita2, OUTPUT);
  digitalWrite(Uscita2,LOW);
  pinMode(ResetPin, INPUT);
  lcd.begin(16, 2);
  pinMode(BACKLIGH_PIN, OUTPUT);
  digitalWrite(BACKLIGH_PIN, HIGH);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("PowerMeter V4.0");
  lcd.setCursor(0,1);
  lcd.print("By Supermomo717");
  delay(2000);
 
   //recupero dati contatori dal BackUp
  monitor=EEPROM.read(0x0F);
  unsigned char k,mem;
  for (k=0;k<4;k++){
  mem = EEPROM.read(0x00+k);
  ((unsigned char*) &TotProdotta)[k]=mem;
  }
  for (k=0;k<4;k++){
  mem = EEPROM.read(0x05+k);
  ((unsigned char*) &TotAssorbita)[k]=mem;
  }
  for (k=0;k<2;k++){
  mem = EEPROM.read(0x10+k);
  ((unsigned char*) &Uscita_1_ON)[k]=mem;
  }
  for (k=0;k<2;k++){
  mem = EEPROM.read(0x12+k);
  ((unsigned char*) &Uscita_1_Time)[k]=mem;
  }
  for (k=0;k<2;k++){
  mem = EEPROM.read(0x14+k);
  ((unsigned char*) &Uscita_1_OFF)[k]=mem;
  }
   for (k=0;k<2;k++){
  mem = EEPROM.read(0x20+k);
  ((unsigned char*) &TotProdotta2)[k]=mem;
  }
 
  if (digitalRead(ResetPin) == HIGH) {//se premuto Resetta i contatori
    monitor = 1;
    TotProdotta = 0;
    TotAssorbita = 0;
    Uscita_1_ON = 1800;
    Uscita_1_Time = 10;
    Uscita_1_OFF = 500;
    TotProdotta2 = 0;
      
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("ATTENZIONE RESET");
  lcd.setCursor(0,1);
  lcd.print("CONTATORI TRA 4H");
  delay(5000);
   }
}


void loop() {

 
//-----------------------------------------------------------------
//MISURA I SENSORI E CALCOLA  LE  CORRENTI E LE POTENZE E LA TENSIONE
  int Tensionepicco = 0;
  ProdottaMedia = 0 ;
  ProdottaMedia2 = 0 ;
  AssorbitaMedia = 0 ;
  for (int i=0;i<1000;i++){
    ProdottaMedia += abs(analogRead(ProdottaPin)-511);
    ProdottaMedia2 += abs(analogRead(ProdottaPin2)-511);
    AssorbitaMedia += abs(analogRead(AssorbitaPin)-510);
    int Tensioneinst = analogRead(TensionePin);
    if (Tensionepicco<Tensioneinst)Tensionepicco=Tensioneinst;
    }
    Tensione=Tensionepicco*.53;//Taratura sensore Tensione 0,45 ooriginale
   
  ProdottaMediaP= (ProdottaMedia*.000079)-0.032;//calcola gli Amper istantanei Prodotti
  ProdottaMediaP2= (ProdottaMedia2*.000079)-0.032;//calcola gli Amper istantanei Prodotti
  AssorbitaMediaP= (AssorbitaMedia*.000079)-0.032;//calcola gli Amper istantanei Assorbiti
  if (ConfigB & AssorbitaMediaP > 0.2)ProdottaMediaP=0;
  PotenzaPro=int(ProdottaMediaP*Tensione/10)*10;//Calcola Potenza istantanea Prodotta (Step da 10W)
  PotenzaPro2=int(ProdottaMediaP2*Tensione/10)*10;//Calcola Potenza istantanea Prodotta (Step da 10W)
  PotenzaAss=int(AssorbitaMediaP*Tensione/10)*10;//Calcola Potenza istantanea Assorbita (Step da 10W)
 
//Calcola e memorizza in EEPROM i Contatori Potenze 
if (micros()>TCampionature){// if è per prevenire il reset del contatore ogni 70ore!!
  TotProdotta+=ProdottaMediaP*Tensione*(micros()-TCampionature)/1000000/3600/1000;
//Calcola i Kwh Prodotti GSE
  TotProdotta2+=ProdottaMediaP2*Tensione*(micros()-TCampionature)/1000000/3600/100
0;//Calcola i Kwh Prodotti EXTRA
  TotAssorbita+=AssorbitaMediaP*Tensione*(micros()-TCampionature)/1000000/3600/100
0;//Calcola i Kwh Consumati
  }
  TCampionature=micros();
if (millis()>(Tmemoria + 14400000)){//BackUp ogni 4 ore= 14400000mS
     EEPROM.write(0x0F,monitor);
     unsigned char k,mem;
     for (k=0;k<4;k++){
       mem = ((unsigned char*) &TotProdotta)[k];
       EEPROM.write(0x00+k,mem);
       }
     for (k=0;k<4;k++){
       mem = ((unsigned char*) &TotAssorbita)[k];
       EEPROM.write(0x05+k,mem);
       } 
      for (k=0;k<2;k++){
       mem = ((unsigned char*) &Uscita_1_ON)[k];
       EEPROM.write(0x10+k,mem);
       }
     for (k=0;k<2;k++){
       mem = ((unsigned char*) &Uscita_1_Time)[k];
       EEPROM.write(0x12+k,mem);
       }
     for (k=0;k<2;k++){
       mem = ((unsigned char*) &Uscita_1_OFF)[k];
       EEPROM.write(0x14+k,mem);
       }
      for (k=0;k<2;k++){
       mem = ((unsigned char*) &TotProdotta2)[k];
       EEPROM.write(0x20+k,mem);
       }
    
     Tmemoria=millis();
     }
//---------------------------------------------------------------


//VISUALIZZA E SPENGE IL DISPLAY SE NON USATO
if (digitalRead(PagPin) == HIGH & Timeout<=0){
  digitalWrite(BACKLIGH_PIN, HIGH);//accendi LCD
  Timeout=TempoLed;
  delay(1000);
  }
if (Timeout>0) {
  digitalWrite(BACKLIGH_PIN, HIGH);//accendi LCD
if (Retroilluminazione)Timeout--;
  if (digitalRead(PagPin) == HIGH){
      pagina++;
      
      delay(300);
      
      if (pagina>8)pagina=0;
      }
 
  switch (monitor){ //Seleziona la Potenza da Monitorare
              case 1:
                PotenzaMon=PotenzaPro;
              break;
              case 2:
                PotenzaMon=PotenzaAss;
              break;
              case 3:
                PotenzaMon=PotenzaPro+PotenzaPro2-PotenzaAss;
              break;
              case 4:
                PotenzaMon=PotenzaAss-PotenzaPro-PotenzaPro2;
              break;
            }   
 
 
  if (PotenzaMon<Uscita_1_ON) TUscita1=millis();
  else if (millis()>(Uscita_1_Time*1000+TUscita1)) digitalWrite(Uscita1,HIGH);
  if (PotenzaMon<Uscita_1_OFF) digitalWrite(Uscita1,LOW);


  if((millis()>(lcd_Time+1000))
  

millis() > (time + 2000)){
time = millis();
byte Pro1 = PotenzaPro&0xFF;
byte Pro2=(PotenzaPro&0xFF00)>>8;

byte Pro12 = PotenzaPro2&0xFF;
byte Pro22=(PotenzaPro2&0xFF00)>>8;

byte Ass1=PotenzaAss&0xFF;
byte Ass2=(PotenzaAss&0xFF00)>>8;
byte CPro1= int(ProdottaMediaP*100)&0xFF;
byte CPro2= (int(ProdottaMediaP*100)&0xFF00)>>8;
byte CAss1= int(AssorbitaMediaP*100)&0xFF;
byte CAss2= (int(AssorbitaMediaP*100)&0xFF00)>>8;
byte TPro1= long(TotProdotta*10)&0xFF;
byte TPro2= (long(TotProdotta*10)&0xFF00)>>8;
byte TPro3= (long(TotProdotta*10)&0xFF0000)>>16;
byte TAss1= long(TotAssorbita*10)&0xFF;
byte TAss2= (long(TotAssorbita*10)&0xFF00)>>8;
byte TAss3= (long(TotAssorbita*10)&0xFF0000)>>16;

byte TProE1= long(TotProdotta2*10)&0xFF;
byte TProE2= (long(TotProdotta2*10)&0xFF00)>>8;
byte TProE3= (long(TotProdotta2*10)&0xFF0000)>>16;

byte CKS = (ADR+Tensione+Pro1+Pro2+Pro12+Pro22+Ass1+Ass2+CPro1+CPro2+CAss1+CAss2+TPro1+TPro2+TPro3+TAss1+TAss2+TAss3+TProE1+TProE2+TProE3)/21;
char msg[22] = {ADR (Attachment deleted)
Tensione (Attachment deleted)
Pro1 (Attachment deleted)
Pro2 (Attachment deleted)
Pro12 (Attachment deleted)
Pro22 (Attachment deleted)
Ass1 (Attachment deleted)
Ass2 (Attachment deleted)
CPro1 (Attachment deleted)
CPro2 (Attachment deleted)
CAss1 (Attachment deleted)
CAss2 (Attachment deleted)
TPro1 (Attachment deleted)
TPro2 (Attachment deleted)
TPro3 (Attachment deleted)
TAss1 (Attachment deleted)
TAss2 (Attachment deleted)
TAss3 (Attachment deleted)
TProE1 (Attachment deleted)
TProE2 (Attachment deleted)
TProE3 (Attachment deleted)
CKS};
digitalWrite(13 (Attachment deleted)
true); // Flash a light to show transmitting
vw_send((uint8_t *)msg (Attachment deleted)
22 );
vw_wait_tx(); // Wait until the whole message is gone
digitalWrite(13 (Attachment deleted)
false);
}

}
[IMG]http://www.energialternativa.org/Public_mod/NewForum/ForumEA_mod/B/Powermeter%20trasmettirore%203%20sensori_bb.jpg[/IMG] 3 sensori_bb.jpg (Attachment deleted)
Back to top
 
IP Logged
 
supermomo717
Ex Member
*


--------

Gender: Male
Re:Voltmetro, Amperometro, Wattmetro, Contatori Assorbimento
Reply #160 - 03.10.14 at 12:06:56
Print Post  
Al PowerMeterTx potete abbinare, prestissimo in condivisione, i seguenti  dispositivi via radio:
- PowerMeterRx 4.0 , ricevitore con 2 uscite a relè
- PowerLogger 4.0 nuovo datalogger su SD di tutte le letture del PowerMeterTx 4.0
- PowerWebber 4.0, per visualizzare i dati dell'impianto su WEB
- PowerDimmer 4.0, attaccateci una stufetta elettrica e gestirete la vostra produzione in esubero o quello che volete nella maniera che più vi piacerà.
Stay tuned....
  
Back to top
 
IP Logged
 
supermomo717
Ex Member
*


--------

Gender: Male
Re:Voltmetro, Amperometro, Wattmetro, Contatori Assorbimento
Reply #161 - 03.10.14 at 12:13:31
Print Post  
PowerMeterRx 4.0

Ecco il codice e lo schema!

/* Progetto PowerPowerMeterRx 4.0

***Ricevitore***

"" Energia Alternativa & Energia Fai Da Te ""
http://www.energialternativa.org/
Ricevitore rivisitato da Supermomo717 del PowerMeter_3_5 realizzato da ElettroshockNow.
Si tratta di un sistema remoto per Trasmettitore Powermeter 4.0 per gestione di 2 uscite.
Il Ricevitore Powermeter 4.0 rielabora i valori ricevuti dal Trasmettitore PowerMeter 4.0
e ne gestisce i carichi, collegati.
Caratteristiche:
- Introdotto Display Lcd con keypad per modifica diretta delle soglie intervento uscite.
- Introdotto avviso ricezione segnale da TX direttamente da LCD.
- Introdotto intervallo di tempo antecedente lo spegnimento a raggiungimento una determinata
soglia minima (per ovviare al problema che un carico in avvio possa far leggere al
Ricevitore un raggiungimento di sottosoglia e staccare
l'uscita al momento in cui il carico stesso dovrebbe avviarsi).
- Il display si spegne automaticamente dopo 2 minuti se la produzione dell'impianto è
minore dell'assorbimento. Per Accendere il display premere pulsante scorrimento pagine.
- Introdotto LED esterno per controllo ricezione corretta segnale da TX
- Introdotte nuove visualizzazioni pagine con diverse combinazioni di potenze monitorabili

Necessario funzionamento in abbinamento a PowerMeterTx 4.0 ***Trasmettitore***

Per tutte le connessioni fare riferimento solo allo Sketch.

Saluti
Supermomo717
*/


#include <LiquidCrystal.h>
#include <VirtualWire.h>

const byte PagDefault = 1;      // Scegli la schermata di default..Smiley
//0 = Wattmetro
//1 = Voltmetro + Stato sistema (immissione o prelievo).
//2 = Amperometro
//3 = Contatori

byte pagina = PagDefault; //PAGINA DA VISUALIZZARE SULL'LCD

const int PagPin = 2;//Pulsante normalmente chiuso, se premuto scorre le pagine
const int Uscita2 = 3; //assegnazione pin uscita 2
const int Uscita1 = 12; //assegnazione pin uscita 1
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);//ASSEGNAZIONE PIN  LCD SHIELD SAINSMART
const int BACKLIGH_PIN = 10;//Assegnazione pin Retroilluminazione
unsigned long StandBy;          // Tempo StandBy display LCD
//pin 11 assegnato a ricevitore
const int ledPin =  13;         //pin del led per controllo ricezione segnale da TX
unsigned long lcd_Time;
int ledState = LOW;             // ledState usato per settare lo stato del led
long previousMillis = 0;        //conteggio durata impulso led  verifica segnale
long interval = 100;            //durata impulso led

byte monitor = 1;

// impostazioni uscite

int Uscita_1_ON ;
int Uscita_1_Time_On ;
int Uscita_1_Time_Off ;
unsigned long TUscita1in = 0;
unsigned long TUscita1out = 0;
int Uscita_1_OFF ;

int Uscita_2_ON ;
int Uscita_2_Time_On;
int Uscita_2_Time_Off ;
unsigned long TUscita2in = 0;
unsigned long TUscita2out = 0;
int Uscita_2_OFF;

int PotenzaMon;              //Potenza da Monitorare

int Tensione;
int PotenzaPro;
int PotenzaPro2;
int PotenzaAss;
float CorrentePro;
float CorrentePro2;
float CorrenteAss;
float TotalePro;
float TotalePro2;
float TotaleAss;

//impostazioni relative alla Tastiera della shield

int lcd_key     = 0;
int adc_key_in  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

// read the buttons
int read_LCD_buttons()
{
  adc_key_in = analogRead(0);      // read the value from the sensor
  // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
  // we add approx 50 to those values and check to see if we are close
  if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
  if (adc_key_in < 50)   return btnRIGHT; 
  if (adc_key_in < 150)  return btnUP;
  if (adc_key_in < 280)  return btnDOWN;
  if (adc_key_in < 450)  return btnLEFT;
  if (adc_key_in < 650)  return btnSELECT; 

  return btnNONE;  // when all others fail, return this...
}

void setup()
{

  lcd.begin(16, 2);
  pinMode(BACKLIGH_PIN, OUTPUT);
  digitalWrite(BACKLIGH_PIN, HIGH);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("RicePwMeter V4.0");
  lcd.setCursor(0,1);
  lcd.print("By Supermomo717");
  delay(3000);

  //Settaggio porte uscite

  pinMode(Uscita1, OUTPUT);
  digitalWrite(Uscita1, LOW);
  pinMode(Uscita2, OUTPUT);
  digitalWrite(Uscita2, LOW);


  pinMode(ledPin, OUTPUT);

  monitor = 3; // DEFAULT Potenza da monitorare
  //1 = Totale Prodotta (GSE+ EXTRA)
  //2 = Totale Assorbita
  //3 = Totale Prodotta - Assorbita
  //4 = Assorbita - Totale Prodotta
  //5 = Esubero = EXTRA - Assorbita
  //6 = GSE
  //7 = EXTRA

  Uscita_1_ON = 800; //Accendi a XXX Watt                               ** Variabile da tastiera **
  Uscita_1_Time_On = 10; //Accendi dopo TOT secondi raggiunti XXX Watt  ** Variabile da tastiera **
  Uscita_1_Time_Off = 10; //Spegni dopo TOT secondi raggiunti YYY Watt  NON Variabile da tastiera
  Uscita_1_OFF = 100; //Spegni a YYY Watt                               ** Variabile da tastiera **
  Uscita_2_ON = 1800; //Accendi a xxx Watt                              ** Variabile da tastiera **
  Uscita_2_Time_On = 10; //Accendi dopo tot secondi raggiunti xxx Watt  ** Variabile da tastiera **
  Uscita_2_Time_Off = 10; //Spegni dopo tot secondi raggiunti yyy Watt  NON Variabile da tastiera
  Uscita_2_OFF = 1700 ; //Spegni a yyy Watt



  Serial.begin(9600); // Debugging only

  Serial.println("Inizializzazione");

  // Initialise the IO and ISR
  vw_set_ptt_inverted(true); // Required for DR3100
  vw_setup(2000); // Bits per sec

  vw_rx_start(); // Start the receiver PLL running
}

void loop()
{

  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;

  if (vw_get_message(buf, &buflen)) // Non-blocking
  {

    // parte relativa al lampeggio del led di controllo quando RX ha segnale da TX
    unsigned long currentMillis = millis();

    if(currentMillis - previousMillis > interval) {
      // save the last time you blinked the LED
      previousMillis = currentMillis;   

      // if the LED is off turn it on and vice-versa:
      if (ledState == LOW)
        ledState = HIGH;
      else

          ledState = LOW;
      // set the LED with the ledState of the variable:
      digitalWrite(ledPin, ledState); // originale è ledPin per lampeggio led 13 su Arduino

    }
    /*
int i;
     digitalWrite(13, true); // Flash a light to show received good message
     // Message with a good checksum received, dump it.
     Serial.print("Got: ");
    
     for (i = 0; i < buflen; i++)
     {
     Serial.print(buf[i], DEC);
     Serial.print(" ");
     }
     */
    Tensione = buf[1];
    PotenzaPro = (int(buf[3]<<8)+buf[2]);
    PotenzaPro2 = (int(buf[5]<<8)+buf[4]);
    PotenzaAss = (int(buf[7]<<8)+buf[6]);
    CorrentePro = float(int(buf[9]<<8)+buf[8])/100;
    CorrenteAss = float(int(buf[11]<<8)+buf[10])/100;
    TotalePro = float(long(buf[14]<<16)+int(buf[13]<<8)+buf[12])/10;  //Prodotta GSE
    TotaleAss = float(long(buf[17]<<16)+int(buf[16]<<8)+buf[15])/10;  //Cosnumata
    TotalePro2= float(long(buf[20]<<16)+int(buf[19]<<8)+buf[18])/10;  //Prodotta Extra


    Serial.write ("Potenza GSE ");
    Serial.print(PotenzaPro);
    Serial.println (" Watt");
    Serial.write ("Potenza EXTRA ");
    Serial.print(PotenzaPro2);
    Serial.println (" Watt");
    Serial.write ("Potenza Prodotta TOTALE ");
    Serial.print(PotenzaPro+PotenzaPro2);
    Serial.println (" Watt");
    Serial.write ("Potenza Assorbita di ");
    Serial.print(PotenzaAss);
    Serial.println (" Watt");
    Serial.write ("Immetto in rete una Potenza di ");
    Serial.print(PotenzaMon);
    Serial.println (" Watt");
    Serial.write ("Accensione Uscita 1 Impostata a  ");
    Serial.print(Uscita_1_ON);
    Serial.println("Watt");
    Serial.write ("Spegnimento Uscita 1 Impostata= ");
    Serial.print(Uscita_1_OFF);
    Serial.println("Watt");
    Serial.write ("Accensione Uscita 2 Impostata a ");
    Serial.print(Uscita_2_ON);
    Serial.println("Watt");
    Serial.write ("Spegnimento Uscita 2 Impostata= ");
    Serial.print(Uscita_2_OFF);
    Serial.println("Watt");
    Serial.write ("Totale Prodotta GSE= ");
    Serial.print(TotalePro);
    Serial.println(" Kwh");
    Serial.write ("Totale Prodotta EXTRA= ");
    Serial.print(TotalePro2);
    Serial.println(" Kwh");
    Serial.write ("Totale Consumata= ");
    Serial.print(TotaleAss);
    Serial.println(" Kwh");
    Serial.println("");

  }


  switch (monitor){               //Selettore potenza da monitorare
  case 1:
    PotenzaMon=PotenzaPro+PotenzaPro2;             //potenza totale
    break;
  case 2:
    PotenzaMon=PotenzaAss;                         //potenza Assorbita
    break;
  case 3:
    PotenzaMon=PotenzaPro+PotenzaPro2-PotenzaAss;  //potenza Prodotta - potenza Assorbita
    break;
  case 4:
    PotenzaMon=PotenzaAss-PotenzaPro-PotenzaPro2;  //potenza Assorbita - potenza Prodotta
    break;
  case 5:
    PotenzaMon=PotenzaPro2-PotenzaAss;             //Potenza in Esubero
    break; 
  case 6:
    PotenzaMon=PotenzaPro;                         //potenza GSE
    break;
  case 7:
    PotenzaMon=PotenzaPro2;                         //potenza EXTRA
    break;

  }   
  if (PotenzaMon<Uscita_1_ON) TUscita1in=millis();
  else if (millis()>(Uscita_1_Time_On*1000+TUscita1in)) digitalWrite(Uscita1,LOW);
  if (PotenzaMon>Uscita_1_OFF) TUscita1out=millis();
  else if (millis()>(Uscita_1_Time_Off*1000+TUscita1out)) digitalWrite(Uscita1,HIGH);


  if (PotenzaMon<Uscita_2_ON) TUscita2in=millis();
  else if (millis()>(Uscita_2_Time_On*1000+TUscita2in)) digitalWrite(Uscita2,LOW);
  if (PotenzaMon>Uscita_2_OFF) TUscita2out=millis();
  else if (millis()>(Uscita_2_Time_Off*1000+TUscita2out)) digitalWrite(Uscita2,HIGH);


  if ((digitalRead(PagPin) == LOW) && digitalRead (BACKLIGH_PIN == LOW)) // Prima pressione pulsante accende display

  {
    digitalWrite(BACKLIGH_PIN, HIGH);
    StandBy=millis();
    delay(200);
  }

  if (digitalRead(PagPin) == LOW)                // Pressione pulsante per cambio pagina
  {
    pagina++;
    StandBy=millis();
    delay(200);
    if (pagina>11)pagina=0;
  }

  if ((millis() > StandBy+120000) && (PotenzaPro+PotenzaPro2)-PotenzaAss <0) digitalWrite(BACKLIGH_PIN, LOW); //Spegne display se non usato dopo 120 secondi

  lcd_key = read_LCD_buttons();  // read the buttons

    if (pagina<11&lcd_key==btnDOWN) {
    pagina++;
    delay(200);
  }
  if (pagina>0&lcd_key==btnUP) {
    pagina--;
    delay(200);
  }
  if (pagina==4&&lcd_key==btnRIGHT&&monitor<7) {
    monitor++;
    delay(200);
  }
  if (pagina==4&&lcd_key==btnLEFT&&monitor>1) {
    monitor--;
    delay(200);
  }
  if (pagina==5&lcd_key==btnRIGHT) Uscita_1_ON=Uscita_1_ON+1;
  if (pagina==5&lcd_key==btnLEFT) Uscita_1_ON=Uscita_1_ON-1;
  if (pagina==6&lcd_key==btnRIGHT) Uscita_1_Time_On=Uscita_1_Time_On+1;
  if (pagina==6&lcd_key==btnLEFT) Uscita_1_Time_On=Uscita_1_Time_On-1;
  if (pagina==7&lcd_key==btnRIGHT) Uscita_1_OFF=Uscita_1_OFF+1;
  if (pagina==7&lcd_key==btnLEFT) Uscita_1_OFF=Uscita_1_OFF-1;
  if (pagina==8&lcd_key==btnRIGHT) Uscita_2_ON=Uscita_2_ON+1;
  if (pagina==8&lcd_key==btnLEFT) Uscita_2_ON=Uscita_2_ON-1;
  if (pagina==9&lcd_key==btnRIGHT) Uscita_2_Time_On=Uscita_2_Time_On+1;
  if (pagina==9&lcd_key==btnLEFT) Uscita_2_Time_On=Uscita_2_Time_On-1;
  if (pagina==10&lcd_key==btnRIGHT) Uscita_2_OFF=Uscita_2_OFF+1;
  if (pagina==10&lcd_key==btnLEFT) Uscita_2_OFF=Uscita_2_OFF-1;

  if((millis()>(lcd_Time+500))
  
Back to top
 
IP Logged
 
supermomo717
Ex Member
*


--------

Gender: Male
Re:Voltmetro, Amperometro, Wattmetro, Contatori Assorbimento
Reply #162 - 03.10.14 at 13:29:50
Print Post  
PowerLogger 4.0

Essenzialmente serve per il monitoraggio dettagliato dei consumi, delle produzioni ecc attraverso l'analisi del datalog che viene creato. Utilizzando il grafico con excell e un minomo di dimestichezza con le tabelle e grafici di pivot si può scoprire un mondo di info.

Il codice:


/* Progetto PowerLogger 4.0
Funzionamento con EthernetShiel 5100 originale arduino e microSD formattata in fat 32 dove verrà salvato il datalog.txt
Orario mantenuto dalla shield RTC basata su DS1307 connesso tramite I2C
Dati impostazioni ed informazioni utili direttamente in sketch.
Uso esclusivo in abbinamento com PowerMeter Tx 4.0
Necessario funzionamento in abbinamento a PowerMeterTx 4.0 ***Trasmettitore***

Per tutte le connessioni fare riferimento solo allo Sketch.

Saluti
Supermomo717
*/

#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 rtc;

#include <VirtualWire.h>
#include <SD.h>
const int chipSelect = 4;
const int receive_pin = 9;    //pin connesso a ricevitore 315 Mhz
int Tensione;
int PotenzaPro;
int PotenzaPro2;
int PotenzaAss;
float CorrentePro;
float CorrenteAss;
float TotalePro;
float TotalePro2;
float TotaleAss;
byte ledpin=13;                // led di controllo ricezione segnale
boolean statoled=HIGH;            // stato led di controllo ricezione segnale

unsigned long previousMillis = 0;
long interval = 15000;       //Intervallo tra un log e l'altro in millisecondi

unsigned long Tempo;
void setup()
{
  //inizio Sezione RTC
#ifdef AVR
  Wire.begin();
#else
  Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
  rtc.begin();

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    //rtc.adjust(DateTime(2014, 10, 01, 18, 12, 30));
  }
  //Fine Sezione RTC

  //Inizio sezione SD

  Serial.print("Initializing SD card...");
  // make sure that the default chip select pin is set to
  // output, even if you don't use it:
  pinMode(10, OUTPUT);
  pinMode(ledpin, OUTPUT);

  Serial.begin(9600); // Debugging only
  Serial.println("setup");

  // Initialise the IO and ISR
  vw_set_ptt_inverted(true); // Required for DR3100
  vw_setup(2000); // Bits per sec
  vw_set_rx_pin(receive_pin);
  vw_rx_start(); // Start the receiver PLL running

  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");
 
  //Fine sezione SD
 
}

void loop()
{
  DateTime now = rtc.now();              //Recupero Orario

  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;

  if (vw_get_message(buf, &buflen))     // Non-blocking
  {
    if (statoled==LOW) statoled = HIGH;
    else statoled==LOW;

    digitalWrite(ledpin, statoled);

    /*
int i;
     digitalWrite(13, true); // Flash a light to show received good message
     // Message with a good checksum received, dump it.
     Serial.print("Got: ");
    
     for (i = 0; i < buflen; i++)
     {
     Serial.print(buf[i], DEC);
     Serial.print(" ");
     }
     */
    Tensione = buf[1];
    PotenzaPro = (int(buf[3]<<8)+buf[2]);
    PotenzaPro2 = (int(buf[5]<<8)+buf[4]);
    PotenzaAss = (int(buf[7]<<8)+buf[6]);
    CorrentePro = float(int(buf[9]<<8)+buf[8])/100;
    CorrenteAss = float(int(buf[11]<<8)+buf[10])/100;
    TotalePro = float(long(buf[14]<<16)+int(buf[13]<<8)+buf[12])/10;  //Prodotta GSE
    TotaleAss = float(long(buf[17]<<16)+int(buf[16]<<8)+buf[15])/10;  //Consumata
    TotalePro2 = float(long(buf[20]<<16)+int(buf[19]<<8)+buf[18])/10;  //Prodotta Extra


    Serial.write ("Tensione= ");
    Serial.print(Tensione);
    Serial.println(" Volt");
    Serial.write ("Potenza Assorbita= ");
    Serial.print(PotenzaAss);
    Serial.println(" Watt");
    Serial.print ("Potenza Prodotta= ");
    Serial.print(PotenzaPro);
    Serial.println(" Watt");
    Serial.write ("Corrente Assorbita= ");
    Serial.print(CorrenteAss);
    Serial.println(" Amper");
    Serial.write ("Corrente Prodotta= ");
    Serial.print(CorrentePro);
    Serial.println(" Amper");
    Serial.write ("Totale GSE= ");
    Serial.print(TotalePro);
    Serial.println(" Kwh");
    Serial.write ("Totale Extra= ");
    Serial.print(TotalePro2);
    Serial.println(" Kwh");
    Serial.write ("Totale Consumata= ");
    Serial.print(TotaleAss);
    Serial.println(" Kwh");


    //Creazione della stringa di LOG
   
    Tempo=millis();

    String dataString = "";

    dataString += String(Tempo/1000);
    dataString += ",";
    dataString += String(now.year(), DEC);
    dataString += ",";
    dataString += String(now.month(), DEC);
    dataString += ",";
    dataString += String(now.day(), DEC);
    dataString += ",";
    dataString += String(now.hour(), DEC);
    dataString += ",";
    dataString += String(now.minute(), DEC);
    dataString += ",";
    dataString += String(now.second(), DEC);
    dataString += ",";
    dataString += String(Tensione);
    dataString += ",";
    dataString += String(PotenzaPro);
    dataString += ",";
    dataString += String(PotenzaPro2);
    dataString += ",";
    dataString += String(PotenzaAss);
    /* Da testare

     dataString += ",";
    
     int GSE=TotalePro;
     int EXTRA=TotalePro2;
     int ASS=TotaleAss;
    
     dataString += String(GSE);
     dataString += ",";
     dataString += String(EXTRA);
     dataString += ",";
     dataString += String(ASS);
     */

    unsigned long currentMillis = millis();

    if(currentMillis - previousMillis > interval) {
      // save the last time you blinked the LED
      previousMillis = currentMillis;   

      // open the file. note that only one file can be open at a time,
      // so you have to close this one before opening another.
      File dataFile = SD.open("datalog.txt", FILE_WRITE);

      // if the file is available, write to it:
      if (dataFile) {
        dataFile.println(dataString);
        dataFile.close();
        // print to the serial port too:
        Serial.println(dataString);
      } 
      // if the file isn't open, pop up an error:
      else {
        Serial.println("error opening datalog.txt");
      }

    }
  }
}



--------------------
c'è pure lo schema....

ah, il codice fa schifo lo so, ma funziona.... Tongue
PowerLogger_bb.jpg
  
Back to top
 
IP Logged
 
supermomo717
Ex Member
*


--------

Gender: Male
Re:Voltmetro, Amperometro, Wattmetro, Contatori Assorbimento
Reply #163 - 03.10.14 at 13:35:32
Print Post  
Il grafico è vecchio e risale a quando nn avevo il RTC ma rende l'idea. Adesso in luogo del tempo progressivo è riportata l'ora effettiva delle letture.
I grafici ovviamente possono essere personalizzati, come del resto il codice e un po di fantasia si ottengono cose notevoli! buon divertimento!
  
Back to top
 
IP Logged
 
supermomo717
Ex Member
*


--------

Gender: Male
Re:Voltmetro, Amperometro, Wattmetro, Contatori Assorbimento
Reply #164 - 03.10.14 at 14:08:13
Print Post  
Anticipazione del PowerDimmer 4.0

Nel video si vede solo l'effetto. Collegandolo a delle lampadine si vede la variazione continua di intensità in base alla produzione.
In questo caso sto facendo in modo che il PowerDimmer 4.0 valuti la corrente prodotta e valuti la consumata, perciò quando la produzione supera il consumo il PowerDimmer aumenta l'intensità della luce nonchè il consumo cercando di mantenere sempre a zero l'immissione. Se cala la produzione il PowerDimmer fa in modo di abbassare l'assorbimento e cercare in modo continuato l'equilibrio voluto cioè zero immissione. Ci sono 26 livelli di assorbimento, quindi con un carico totale di 160watt che ho ora, ogni step è di 6.4 watt.
Stay tuned...
http://www.energialternativa.org/Public_mod/NewForum/ForumEA_mod/B/PowerDimmer.a...
  
Back to top
 
IP Logged
 
Page Index Toggle Pages: 1 ... 9 10 [11] 12 13 ... 19
Send TopicPrint
 

TOP100-SOLAR Galleria Immagini EnergiAlternativa