Progetto EMF Lettura fissa

Ciao a tutti sto provando a realizzare un emf detector preso da questa guidahttps://www.instructables.com/id/Arduino-Ghost-EMF-Detector/
Arduino nano, 7 led, sui pin digitali ed un'antenna sul pin analogico 5 con resistenza da 3.2M Ohm


Risultato quando carico il codice si accendono a palla tutti i led, guardo il monitor seriale e mi da fisso 1023:

Solo quando stringo l'antenna nella mano il valore scende e si spengono il blu e uno o due rossi!

Ovviamente vorrei che partisse tutto spento e come sente un campo elettromagnetico, segnalasse progressivamente dal verde al blu. Ps ma se ci metto un cellulare che chiama, a contatto con i fili scoperti dell'antenna non dovrebbe variare il livello della rilevazione?

Ho provato a giocare con queste due variabili ma non trovo una quadra sensata:
#define NUMREADINGS 15
int senseLimit = 15;

#define NUMREADINGS 15 // raise this number to increase data smoothing

int senseLimit = 15; // raise this number to decrease sensitivity (up to 1023 max)
int probePin = A5; // analog 5
int val = 0; // reading from probePin

int LED1 = 3;  // connections
int LED2 = 4;  // to
int LED3 = 5;   // LED
int LED4 = 6;   // bargraph
int LED5 = 7;   // anodes
int LED6 = 8;   // with
int LED7 = 9;   // resistors


// variables for smoothing

int readings[NUMREADINGS];                // the readings from the analog input
int index = 0;                            // the index of the current reading
int total = 0;                            // the running total
int average = 0;                          // final average of the probe reading


void setup() {

  pinMode(3, OUTPUT); 
  pinMode(4, OUTPUT); 
  pinMode(5, OUTPUT); 
  pinMode(6, OUTPUT); 
  pinMode(7, OUTPUT); 
  pinMode(8, OUTPUT); 
  pinMode(9, OUTPUT); 

  Serial.begin(9600);  // initiate serial connection for debugging/etc

  for (int i = 0; i < NUMREADINGS; i++)
    readings[i] = 0;                      // initialize all the readings to 0
}

void loop() {

  val = analogRead(probePin);  // take a reading from the probe

  if(val >= 1){                // if the reading isn't zero, proceed

    val = constrain(val, 1, senseLimit);  // turn any reading higher than the senseLimit value into the senseLimit value
    val = map(val, 1, senseLimit, 1, 1023);  // remap the constrained value within a 1 to 1023 range

    total -= readings[index];               // subtract the last reading
    readings[index] = val; // read from the sensor
    total += readings[index];               // add the reading to the total
    index = (index + 1);                    // advance to the next index

    if (index >= NUMREADINGS)               // if we're at the end of the array...
      index = 0;                            // ...wrap around to the beginning

    average = total / NUMREADINGS;          // calculate the average


    if (average > 50){                // if the average is over 50 ...
      digitalWrite(LED1, HIGH);   // light the first LED
    }
    else{                         // and if it's not ...
      digitalWrite(LED1, LOW);    // turn that LED off
    }


    if (average > 250){               // and so on ...
      digitalWrite(LED2, HIGH);
    }
    else{
      digitalWrite(LED2, LOW);
    }

    if (average > 500){
      digitalWrite(LED3, HIGH);
    }
    else{
      digitalWrite(LED3, LOW);
    }


    if (average > 600){
      digitalWrite(LED4, HIGH);
    }
    else{
      digitalWrite(LED4, LOW);
    }

    if (average > 700){
      digitalWrite(LED5, HIGH);
    }
    else{
      digitalWrite(LED5, LOW);
    }

    if (average > 800){
      digitalWrite(LED6, HIGH);
    }
    else{
      digitalWrite(LED6, LOW);
    }

    if (average > 900){
      digitalWrite(LED7, HIGH);
    }
    else{
      digitalWrite(LED7, LOW);
    }

    Serial.println(val); // use output to aid in calibrating
  }
}

Come hai collegato la resistenza da 3.3MΩ ?

Guglielmo

così:

Fai una prova, per un momento togli la parte "antenna" e lascia solo la resistenza tra GND ed A5 ...
... la lettura dovrebbe dare 0 ::slight_smile:

Guglielmo

fatto!

A parte l'orribile saldatura, ho controllato che niente si toccasse la resistenza va da gnd a A5 diretta, da sempre1023

C'è qualche cosa che non quadra ...
... ho provato io stesso qui da me e, con una resistenza da 3.7MΩ (misurati con il multimetro) tra GND ed A5, da sulla analogRead() ... ZERO !

Come t'avevo detto però, stacca tutto e fai un piccolo programmino semplice, semplice che legge solamente il pin A5 e lo stampa sulla seriale ... DEVE darto zero. Se neanche così ti da zero, è guasta la porta.

Guglielmo

innanzitutto grazie mille per il supporto, sei gentilissimo, anche perchè ci tengo molto in quanto dovrei regalarlo a Natale!
Io ho provato a prendere un nano nuovo, gli ho caricato lo sketch (il medesimo qua postato), e.... mi da sempre 1023 :o non dovrebbe vero? provo semmai oggi posso munirmi di un arduino uno e provare se qualche cosa cambia!

... la prova, come ti ho più volte scritto, la devi fare senza NULLA attaccato, SOLO ed ESCLUSIVAMENTE una resistenza da 3.3MΩ tra GND e il pin A5 ed un piccolo programma che non fa altro che leggere il valore ti tale ingresso analogico e stamparlo ... vedi se ti da zero, poi passiamo alla tua applicazione con i LED.

Inutile voler fare cose se non si è sicuri al 100% che il pin funzioni come si deve !!!

Guglielmo

Ah ok scusa! In pausa pranzo dissaldo tutto e ci provo. Grazie mille

Ecco, come programmino di prova usa una cosa simile a questa, senza null'altro, e verifica che valore ti stampa sul monitor seriale ...

void setup() {
   delay(500);
   Serial.begin(9600);
}

void loop() {
   int lettura;
   lettura = analogRead(A5);
   Serial.print("Valore letto: ");
   Serial.println(lettura);
   delay(1000);
}

Guglielmo

sei stato gentilissimo con lo sketch, avrei fatto un po di fatica!
Comunque riassumendo, preso un nano nuovo, messo lo sketch, messa reistenza su a5 e GND = 0 :wink: o al massimo 6 7, credo del sano rumore elettrostatico.

Per curiosità ci ho rimesso il mio emf sketch e nel monitor appare 1023 a raffica. Credo a questi punti che sia sbagliato il mio sketch!

Fai una cosa, SENZA collegare i LED, carica il tuo programma e sposta la Serial.println() immediatamente sotto la lettura del pin analogico, prima delle varie elaborazioni ...

val = analogRead(probePin);  // take a reading from the probe
Serial.println(val); // use output to aid in calibrating

... vedi cosa ti da messa li :wink:

Guglielmo

Nel programma, se è ancora valido quello postato all'inizio, lo op prima fa una constrain e poi riscala
Facendo così anche valori bassi danno 1023...

si si sto ancora usando quello postato

blulaserstar:
si si sto ancora usando quello postato

... e allora vedrai che, subito dopo la analogRead() il valore è giusto, dopo le tue "elaborazioni" il valore viene alterato in modo errato. :wink:

Guglielmo

gpb01:
Fai una cosa, SENZA collegare i LED, carica il tuo programma e sposta la Serial.println() immediatamente sotto la lettura del pin analogico, prima delle varie elaborazioni ...

val = analogRead(probePin);  // take a reading from the probe

Serial.println(val); // use output to aid in calibrating



... vedi cosa ti da messa li ;)

Guglielmo

fatto fa una cosa strana, mi da un valore basso e poi 1023 un valore basso e poi 1023 all'infinito

gpb01:
... e allora vedrai che, subito dopo la analogRead() il valore è giusto, dopo le tue "elaborazioni" il valore viene alterato in modo errato. :wink:

Guglielmo

Esatto, scusa non aveva aggiornato la risposta! solo che non conosco tanto bene quella variabile :confused:

Ma se stupidamente cancello quella assegnazione e mi tengo i parametri che genera il pin analogico? forse saranno più ballerine le luci ma almeno mi tolgo da questo problema!

Se il tuo e' un'esperimento per misurare realmente i campi EMF e non un semplice esercizio didattico, tieni presente che usando solo un pezzo di filo come antenna, senza alcun circuito di sintonia, arduino leggera' indiscriminatamente qualsiasi frequenza o disturbo elettromagnetico, senza distinzioni ... :wink:

mah per ora volevo vedere un po cosa e come si intercettano i campi emf, vedere indiscriminatamente cosa c'è nell'aria, poi il circuito di sintonia... beh si mi piacerebbe, solo che mi sono già impiantato in questo pezzettino di codice :confused: anche perchè volevo fare un regalo per un amico non udente, per segnalargli le chiamate del cellulare, ho visto che già anche così rileva l'arrivo di una chiamata variando i valori, ma poi li ributta a 1023 >:(