Pages: [1]   Go Down
Author Topic: Datalogger di impulsi e capacità di calcolo Arduino Uno...  (Read 2074 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salve a tutti,
premetto che non ho ancora esperienza con Arduino (stò aspettando che mi arrivi a casa dopo averlo ordinato) e che ho cercato in vari post la soluzione al mio problema senza trovarla...
Avrei necessità di interfacciarmi con 6 Conta-KWh con uscita impulsiva (2000 impulsi = 1kWh) e vorrei ricavare ogni secondo una misura di potenza attiva per ognuno di essi e salvarla sulla memoria SD di una shield Datalogger con RTC.
Quello che non saprei in che modo realizzare è il conteggio del tempo trascorso tra due impulsi dei 6 conta-kWh indipendenti (così da ricavare la Potenza attiva media in quel lasso di tempo).

Code:
             3600
P (kW) = --------------
          2000 * Tempo

Come seconda cosa, mi chiedevo se una scheda Arduino Uno possa essere in grado di eseguire il suddetto compito di Logging dei 6 conta-kWh ed interfacciarsi con una shield Ethernet per esportare i dati su PC o renderli disponibili su web e con una scheda LCD per visualizzare ciclicamente i valori letti. Ce la farà?

Vi ringrazio in anticipo per le eventuali risposte.
« Last Edit: June 28, 2011, 04:00:59 pm by CH1980 » Logged

Riva del Garda, TN / Forlì
Offline Offline
Edison Member
*
Karma: 7
Posts: 2247
Il piu' modesto al mondo
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ricorda che la matematica e la programmazione vanno sempre a braccetto:

2000 impulsi : 1 KWh = tot impulsi : x KWh

tu hai tot quindi:
Code:
x KWh = 2000/tot

questa la mandi diretta in pasto ad arduino, per leggere i 6 impulsi devi essere sicuro non superi i 5V o arduino si brucia.

poi eth shield che tiene anche la sd e ti fai quello che vuoi.

comunque per capire la differenza di tempo puoi usare millis()
Logged

Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20193
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Facciamo 2 conti.

Presumo che i contatori sono per un attacco di 3,3kW

A pieno carico con un consumo di 3,3kW ho 3,3kWh in un ora percui 6600 impulsi in un ora. Dividendo per 3600 secondi/ora ho al massimo ca 1,8 impulsi al secondo o un impulso ca ogni 0,54 secondi 

Con un carico di 100W ho 200 impulsi all'ora che sono un impulso ogni 18 secondi.

Quanto lunghi sono gli impulsi?
Possibile soluzione:
Prendi un PCF8574 quello ha un uscita interrupt da collegare ad un interupt del Arduino.
I segnali dei contatori li metti su 6 pin programmati come entrate del PCF8574 ogni cambiamento di livello ( L-H o H-L) genera un interrupt. La fonte del interrupt e resettare il dispositivo puoi vedere leggendo il dato del registro di entrata.

Ciao Uwe

Ciao Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao,
per quanto riguarda il range di misura sarà di 100W - 7000W (1 impulso ogni 18000ms - 1 impulso ogni 256ms). Per quanto riguarda la lunghezza degli impulsi al momento non saprei rispondere perchè non ho ancora in mano il conta-kWh, ma sul sito dove ho acquistato leggo:
Quote
Terminali 20-21: interfaccia SO (accoppiatore ottico) producono un breve impulso ad ogni lampeggio e possono essere collegati ad un sistema di acquisizione dati, ovveroun pc o simileconforme alla DIN 43-864 per l'allaccio a sistemi di gestione energetica

EDIT: Cercando un po' su internet ho visto che la lunghezza dell'impulso dovrebbe essere attorno ai 50ms...

Allego un'immagine di un veloce schemino di collegamento... (Un pin dell'interfaccia SO va a Vcc e l'altro ad un input di Arduino)

Code:
S+ ------------------------ +5V
 S- -------+---< R1 >------- GND R1 = 10K
   |
   |
  input PIN arduino

Il mio cruccio è monitorare il periodo tra due cambi di stato ma per ognuno dei 6 pin in modo indipendente... Non so come fare. Se avessi avuto un solo input da monitorare sarebbe stato facile fare un polling di quel solo ingresso (avrei potuto usare questo software http://arduino.cc/playground/Main/EEM12L-32AKWhMonitoring ) ma con 6 come faccio?
Ciao,
Pierangelo


* Pot.jpg (19.93 KB, 821x630 - viewed 13 times.)
« Last Edit: June 29, 2011, 12:15:55 pm by CH1980 » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nessuno ha un'idea da suggerirmi per conteggiare il periodo di 6 diverse onde quadre con un i soli due interrupt (meglio ancora con uno solo) a disposizione di Arduino Uno?
Le onde quadre in oggetto dovrebbero avere periodo variabile e Ton=50ms circa, mi occorre quindi una velocità notevole.
Spero qualcuno mi sappia dare la dritta giusta.
Ciao
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20193
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Possibile soluzione:
Prendi un PCF8574 quello ha un uscita interrupt da collegare ad un interupt del Arduino.
I segnali dei contatori li metti su 6 pin programmati come entrate del PCF8574 ogni cambiamento di livello ( L-H o H-L) genera un interrupt. La fonte del interrupt e resettare il dispositivo puoi vedere leggendo il dato del registro di entrata.
Questa soluzione non Ti piace?
Un alternativa al PCF8574 é il MCP23008 che ha una gestione diversa del interrupt. http://docs-europe.electrocomponents.com/webdocs/0a78/0900766b80a784b7.pdf
Ciao Uwe
Logged

0
Offline Offline
Faraday Member
**
Karma: 23
Posts: 2793
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Nessuno ha un'idea da suggerirmi per conteggiare il periodo di 6 diverse onde quadre con un i soli due interrupt (meglio ancora con uno solo) a disposizione di Arduino Uno?

Il microcontrollore ATmega328 ha un interrupt di tipo PinChanged su tutte le porte, solo che per attivare questi interrupt devi scendere di livello, cioè devi ricorrere alle ISR nude e crude e devi attivare gli interrupt tramite la libc, insomma devi studiarti il manuale del 328 e le libc.

Alcune info in merito:
Ci sono tre ISR una per ogni porta del microcontrollore, tutti gli interrupt di ogni porta chiamano la stessa routine, quando l'esecuzione si sposta nell'ISR devi discriminare quale dei pin è stato a scatenare l'interrupt. La discriminazione la devi fare in testando i 6 pin di quella porta. Occhi che l'interruzione avviene ogni volta che un pin cambia stato quindi ad ogni impulso entre nella ISR due volte.

Ciao.

Logged

AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Questa soluzione non Ti piace?
Un alternativa ...

Ciao, ti ringrazio per l'ulteriore risposta. A dire il vero non ho ben capito come farlo funzionare (sono un po' arrugginito con l'elettronica  smiley-red ) e poi volevo vedere se qualcuno mi riusciva a trovare un metodo senza l'utilizzo di ulteriore hardware esterno all'Arduino o apposita shield preassemblata. Mi scervellerò un po' di più questo fine settimana ed approfondirò il tuo metodo per vedere se riesco a metterlo in pratica.

Il microcontrollore ATmega328 ha un interrupt di tipo PinChanged su tutte le porte, solo che per attivare questi interrupt devi scendere di livello, cioè devi ricorrere alle ISR nude e crude e devi attivare gli interrupt tramite la libc, insomma devi studiarti il manuale del 328 e le libc.

Ciao Mauro e grazie anche a te. Detta così sembra una cosa complicata... Forse fuori dalla mia portata al mio attuale livello di esperienza con la piattaforma Arduino (zero). Provo comunque a dare un'occhiata anche a questa soluzione, magari googlando un po' ora che so cosa cercare.
Mi è sorto un dubbio: mi pare di aver letto che l'Arduino Mega 2560 disponga di più interrupt esterni, è corretto? Se così fosse sarei a posto e potrei utilizzare i 6 pin che mi occorrono con 6 differenti routines di interrupt, è corretto?

Grazie ancora!
Ciao
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20193
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

No non Ti servono 6 routine diverse di interrupt ma tutte le 6 entrate generano lo stesso interrupt e nella routine controlli quale delle 6 entrate ha causato l' interrupt.
Ciao Uwe
Logged

Pages: [1]   Go Up
Jump to: