Go Down

Topic: ottimizzare la lettura di impulsi (Read 366 times) previous topic - next topic

khriss75

Utilizzo arduino (in realtà è un esp8266) per leggere degli impulsi provenienti da un sensore che mi indica il consumo di casa. Ogni impulso (chiudo a gnd) è 1Wh.

lo sketch è questo:
Code: [Select]

pinMode(getpulsepin, INPUT_PULLUP);

  pinval = digitalRead(getpulsepin);   // leggo il valore

  if ((state == 1) && (pinval == 0) && (arduino_riavviato == 0)) { // punto di transizione
    duration = millis() - startime;       // calcola la durata della pulsazione
    startime = millis();            // setta il nuovo tempo di partenza
    conteggio_impulsi = conteggio_impulsi + 1;
    power = 3600.0 / duration * 1000; // calcola consumo
    duration3 = duration / 1000.0;  //duration in seconds

    if ((power > 0) && (power <= 3000)) {
      SendToHS(1, power);
      SendToHS(2, duration3);
      KWh_giornalieri = conteggio_impulsi / 1000.0;
      SendToHS(3, KWh_giornalieri);
      SendToHS(4, conteggio_impulsi);
      allerta = false;
    } else {
      // se power è > 3000
      if (allerta) {
        //era > 3000 anche prima
        if ((millis() - tempoAllerta) > 3000) {
          // sono passati più di 3 secondi
          SendToHS(1, power);
          SendToHS(2, duration3);
          KWh_giornalieri = conteggio_impulsi / 1000.0;
          SendToHS(8, KWh_giornalieri);
          SendToHS(9, conteggio_impulsi);
          // a questo punto non so se devi resettare il conteggio
          // allerta = false; // ???
        }
      } else {
        // è la prima volta che è > 3000
        allerta = true;
        tempoAllerta = millis();
      }
    }

  }
  state = pinval;         // imposta lo stato uguale alla lettura del pin



Questo sketch funziona senza problemi inviando dati al mio sistema.

Ora il mio dubbio: vorrei aggiungere 5 sensori di temperatura DS18B20 i quali hanno un tempo di conversione di 750ms che bloccherebbero arduino durante questo tempo. Rischierei di perdere informazioni sugli impulsi che arrivano dal sensore di consumo.

Per ovviare, potrei utilizzare la funzione GestInt()? Questo però mi complicherebbe le cose sul lato trasmissione dati al server...

Oppure, c'è un modo per "lasciare lavorare" Arduino mentre avviene la conversione dei dati dei sensori di temperatura?

Un ESP8266 che lavora a 80MHz invece di 16MHz migliora le cose?

gpb01

#1
Sep 04, 2018, 11:34 am Last Edit: Sep 04, 2018, 11:35 am by gpb01
Ora il mio dubbio: vorrei aggiungere 5 sensori di temperatura DS18B20 i quali hanno un tempo di conversione di 750ms ....
Quello è vero solo se utilizzi la massima risoluzione di 12 bit (che a te proprio NON serve). Se imposti la risoluzione a 10 bit hai un ritardo di soli 187.5 msec. ... se poi ti accontenti di 9 bit (che sono più che sufficienti per applicazioni amatoriali), tale tempo scende a soli 93.75 msec. (vd. datasheet "tabella 2").

Invece di leggerli tutti e 5 in fila, li leggi uno per volta, lasciando un certo intervallo tra una lettura e l'altra (tanto la temperatura mica varia in millisecondi).

Aumentare la velocità di clock non ti serve a nulla ... mica velocizzi i sensori ...

Guglielmo
Search is Your friend ... or I am Your enemy !

khriss75

Verissimo Guglielmo!
Avevo riletto un altro topic dove mi indicavi proprio che i 12bit sono eccessivi ed infatti avevo porato il tutto a risoluzione 10bit (più che sufficienti).

Ora, se volessi introdurre anche un anemometro dove gli impulsi sono davvero molto ma molto ravvicinati, potrebbero esserci problemi secondo te?
Tieni presente che non avrei bisogno di avere una precisione elevata. Mi basterebbe sapere solo quando il vento supera ad esempio i 15Km/h per alzare la tenda da sole. Se la rilevazione viene fatta anche con 5 secondi di ritardo non avrei alcun problema. E' coerente il mio ragionamento?

 

gpb01

#3
Sep 04, 2018, 11:46 am Last Edit: Sep 04, 2018, 11:46 am by gpb01
Ora, se volessi introdurre anche un anemometro dove gli impulsi sono davvero molto ma molto ravvicinati, potrebbero esserci problemi secondo te?
Per oggetti di questo tipo è sempre bene usare un "interrupt" ed un semplice contatore nella ISR  ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

CrazyHorse80

Se ti occorre un esempio di conteggio impulsi con utilizzo di interrupt puoi dare un'occhiata al software che trovi allegato qui che fa proprio quello che chiedi:
https://forum.arduino.cc/index.php?topic=565873.msg3858162#msg3858162
Ovviamente poi farai le modifiche che servono per adattarlo al tuo progetto...
PVControl - Monitoraggio impianto FV e consumi domestici
-> https://forum.arduino.cc/index.php?topic=569210.0

Go Up