Детектор Электромагнитных полей / Arduino EMF Detector

nnm4evr
Offline
Зарегистрирован: 30.07.2017

Здравствуйте. Собрал схемку на ардуино про мини и некоторых других компанентах, но есть проблема с кодом. За основу был взят код из этого проекта. Добавил дисплей, переменный резистор для регулировки чуствительности и ещё по мелочи. В общем значения в переменной average только повышаются, а должны меняться в зависимости от напряженности электромагнитного поля (подношу устройство к проводу под напряжением, значение увеличивается, убираю от провода, уменьшается).

Вот мой код:

// EMF Detector for LED Bargraph v1.0
// 5.12.2009
// original code/project by Aaron ALAI - aaronalai1@gmail.com
// modified for use w/ LED bargraph by Collin Cunningham - collin@makezine.com
// modified for use w/ old style panel meters by eXPert - nnm4evr@gmail.com
// modified for use w/ OLED SSD1306 128x64 Display by eXPert - nnm4evr@gmail.com

#include "U8glib.h"

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);  // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)

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

boolean loading = true;

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

int LED1 = 12;  // connections
int LED2 = 10;  // to
int LED3 = 9;   // LED
int LED4 = 8;   // bargraph
int LED5 = 7;   // anodes
int LED6 = 6;   // with
int LED7 = 5;   // resistors
int LED8 = 4;   // in
int LED9 = 3;   // series
int LED10 = 2;  // 
byte IND1 = 11; // аналоговый индикатор на PWM-пин D11 

// 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

int Pos = 0;
int x;
int emf = 0;
char msg[64]={0};

long _startTime1;
long _startTime2;

#define INTERVAL1 500
#define INTERVAL2 500

#define u8g_logo_width 128
#define u8g_logo_height 64
//static unsigned char u8g_logo_bits[] = {
static unsigned char u8g_logo_bits[] U8G_PROGMEM = {
//static char result_bits[] = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x06, 0xE3, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xE3, 0x3F, 0x00, 0xF0, 
  0x0F, 0x87, 0xFB, 0x07, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, 
  0x63, 0x30, 0x00, 0xF0, 0x0F, 0xCF, 0xFB, 0x07, 0x80, 0x19, 0x00, 0x00, 
  0x00, 0x00, 0x1F, 0xDC, 0x61, 0x30, 0x00, 0x30, 0x00, 0xFF, 0x1B, 0x00, 
  0x20, 0x29, 0x00, 0x00, 0x00, 0x80, 0x3F, 0xD8, 0x60, 0x30, 0x00, 0x30, 
  0x00, 0x7B, 0x1B, 0x00, 0xB0, 0xAE, 0x01, 0x40, 0x00, 0xC0, 0x71, 0xF8, 
  0x60, 0x30, 0x00, 0x30, 0x00, 0x33, 0xFB, 0x03, 0xA8, 0xD9, 0x00, 0x40, 
  0x00, 0xC0, 0x60, 0x70, 0xE0, 0x3F, 0x00, 0xF0, 0x01, 0x33, 0xFB, 0x03, 
  0x30, 0x89, 0x01, 0x40, 0x00, 0xC0, 0x7F, 0xF8, 0xE0, 0x1F, 0x00, 0xF0, 
  0x01, 0x03, 0x1B, 0x00, 0x30, 0xC9, 0x00, 0xC0, 0x00, 0xC0, 0x7F, 0xD8, 
  0x60, 0x00, 0x00, 0x30, 0x00, 0x03, 0x1B, 0x00, 0xA0, 0x12, 0x01, 0x20, 
  0x01, 0xC0, 0x00, 0xDC, 0x61, 0x00, 0x00, 0x30, 0x00, 0x03, 0x1B, 0x00, 
  0x40, 0x25, 0x02, 0x10, 0x01, 0xC0, 0x01, 0x8E, 0x63, 0x00, 0x00, 0x30, 
  0x00, 0x03, 0x1B, 0x00, 0x60, 0x51, 0x00, 0x10, 0x02, 0x80, 0x7F, 0x06, 
  0x63, 0x00, 0x00, 0x30, 0x00, 0x03, 0x1B, 0x00, 0x88, 0x89, 0x05, 0x58, 
  0x02, 0x00, 0x7F, 0x06, 0x63, 0x00, 0x00, 0xF0, 0x0F, 0x03, 0x1B, 0x00, 
  0xBC, 0x5B, 0x13, 0xAC, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 
  0x0F, 0x03, 0x1B, 0x00, 0x08, 0x89, 0x21, 0x1B, 0x33, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x8E, 0xC1, 0xA0, 
  0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x98, 0x14, 0xE1, 0xDB, 0xDB, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0xC1, 0xBA, 0xE6, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x89, 0x42, 0x11, 
  0x63, 0x01, 0x80, 0xC3, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x15, 0xD4, 0x59, 0xD6, 0x00, 0x80, 0xE7, 0x01, 0x00, 0x03, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0xA0, 0x10, 0xA8, 0x11, 0xF3, 0x00, 0x80, 0xFF, 
  0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x90, 0xA8, 
  0x42, 0x00, 0x80, 0xBD, 0xE1, 0x83, 0x3F, 0xF0, 0xE1, 0x0F, 0x00, 0x00, 
  0x40, 0x26, 0x20, 0x48, 0x02, 0x00, 0x80, 0x99, 0xF1, 0x87, 0x3F, 0xF8, 
  0xE3, 0x1F, 0x00, 0x00, 0x80, 0x10, 0x40, 0xCC, 0x0C, 0x00, 0x80, 0x99, 
  0x39, 0x0E, 0x03, 0x1C, 0xE7, 0x18, 0x00, 0x00, 0x40, 0x25, 0x80, 0x13, 
  0x35, 0x00, 0x80, 0x81, 0x19, 0x0C, 0x03, 0x0C, 0x66, 0x18, 0x00, 0x00, 
  0x80, 0x16, 0xA0, 0x18, 0xC2, 0x00, 0x80, 0x81, 0xF9, 0x0F, 0x03, 0xFC, 
  0x67, 0x00, 0x00, 0x00, 0x40, 0x29, 0x30, 0x15, 0x8B, 0x01, 0x80, 0x81, 
  0xF9, 0x0F, 0x03, 0xFC, 0x67, 0x00, 0x00, 0x00, 0x40, 0x2A, 0xF0, 0xBD, 
  0xEF, 0x03, 0x80, 0x81, 0x19, 0x00, 0x03, 0x0C, 0x60, 0x00, 0x00, 0x00, 
  0x20, 0x26, 0xA0, 0x30, 0xC5, 0x00, 0x80, 0x81, 0x39, 0x00, 0x63, 0x1C, 
  0x60, 0x00, 0x00, 0x00, 0x40, 0xD1, 0xE0, 0xC8, 0xA2, 0x01, 0x80, 0x81, 
  0xF1, 0x0F, 0x7F, 0xF8, 0x67, 0x00, 0x00, 0x00, 0x60, 0x6D, 0x6A, 0x49, 
  0xD5, 0x02, 0x80, 0x81, 0xE1, 0x0F, 0x3E, 0xF0, 0x67, 0x00, 0x00, 0x00, 
  0x90, 0x48, 0xE0, 0x88, 0xC2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x90, 0x90, 0x40, 0xA0, 0x02, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x90, 0x00, 0x18, 
  0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x10, 0x20, 0x01, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x24, 0x40, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0xF8, 0x0F, 0x1C, 0x80, 0x03, 0x08, 
  0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0xF8, 0x0F, 
  0x2A, 0xC0, 0x02, 0x48, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x03, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0xB8, 0x07, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0xC8, 
  0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x18, 0x0C, 
  0x00, 0x00, 0x00, 0x54, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x03, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x04, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x14, 
  0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x18, 0x0C, 
  0x00, 0x00, 0x00, 0xE4, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x1B, 0x1C, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x12, 0x05, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1B, 0x1C, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x06, 
  0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x1C, 0x18, 0x0C, 
  0x00, 0x00, 0x00, 0x0A, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 
  0x1F, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x00, 0x52, 0x11, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x00, 0xE1, 
  0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x15, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x1D, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 
  0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x80, 0x10, 0x21, 0x00, 0x06, 0x00, 0x00, 0x8C, 0x01, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x42, 0x00, 0x06, 0x00, 
  0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x04, 
  0x44, 0x00, 0x06, 0x1E, 0x8F, 0xCF, 0xF1, 0xF1, 0x01, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x40, 0x04, 0x48, 0x00, 0x06, 0x33, 0xD8, 0x8E, 0x71, 0xDB, 
  0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x88, 0x00, 0x06, 0x33, 
  0xDF, 0x8C, 0x31, 0x9B, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 
  0x90, 0x00, 0x06, 0xB3, 0xD9, 0x8E, 0x31, 0xDB, 0x31, 0x18, 0x0C, 0x00, 
  0x00, 0x00, 0xA0, 0x00, 0x10, 0x01, 0x7E, 0x1E, 0x9F, 0xCF, 0x33, 0xF3, 
  0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x20, 0x01, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 
  0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0xF8, 0x01, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, };

void splash_screen(void) {
  // graphic commands to redraw the complete screen should be placed here  
  u8g.drawXBMP( 0, 0, u8g_logo_width, u8g_logo_height, u8g_logo_bits);
}

void draw(void) {
  // graphic commands to redraw the complete screen should be placed here  
  u8g.setFont(u8g_font_courR10);
  u8g.drawStr( 0, 22, "EMF Lvl:");
  u8g.setFont(u8g_font_profont17);
  u8g.drawStr(74, 22, msg);
  u8g.drawBox(4,42,Pos,10);
}

void setup(void) { 
  pinMode(A1, OUTPUT); //Blue pin
  pinMode(A2, OUTPUT); //Green pin
  pinMode(A3, OUTPUT); //Red pin  
  pinMode(A6, INPUT); //Potentimeter pin
  pinMode(2, OUTPUT);  // specify LED bargraph outputs
  pinMode(3, OUTPUT); 
  pinMode(4, OUTPUT); 
  pinMode(5, OUTPUT); 
  pinMode(6, OUTPUT); 
  pinMode(7, OUTPUT); 
  pinMode(8, OUTPUT); 
  pinMode(9, OUTPUT); 
  pinMode(10, OUTPUT); 
  pinMode(12, OUTPUT);
  pinMode(IND1, OUTPUT);
  _startTime1 = _startTime2 = millis();
  
    for (int i = 0; i < NUMREADINGS; i++)
    readings[i] = 0; 
}

void loop(void) {
long currentTime = millis();

if (currentTime < 5000) {
  
  
  if(currentTime >= _startTime1 + INTERVAL1)
  {
Serial.print("LightsON!!!");
  digitalWrite(12, HIGH);
  delay(50);
  digitalWrite(12, LOW);
  delay(50);
  digitalWrite(10, HIGH);
  delay(50);
  digitalWrite(10, LOW);
  delay(50);
  digitalWrite(9, HIGH);
  delay(50);
  digitalWrite(9, LOW);
  delay(50);
  digitalWrite(8, HIGH);
  delay(50);
  digitalWrite(8, LOW);
  delay(50);
  digitalWrite(7, HIGH);
  delay(50);
  digitalWrite(7, LOW);
  delay(50);
  digitalWrite(6, HIGH);
  delay(50);
  digitalWrite(6, LOW);
  delay(50);
  digitalWrite(5, HIGH);
  delay(50);
  digitalWrite(5, LOW);
  delay(50);
  digitalWrite(4, HIGH);
  delay(50);
  digitalWrite(4, LOW);
  delay(50);
  digitalWrite(3, HIGH);
  delay(50);
  digitalWrite(3, LOW);
  delay(50);
  digitalWrite(2, HIGH);
  delay(50);
  digitalWrite(2, LOW);
  delay(50);
  digitalWrite(3, HIGH);
  delay(50);
  digitalWrite(3, LOW);
  delay(50);
  digitalWrite(4, HIGH);
  delay(50);
  digitalWrite(4, LOW);
  delay(50);
  digitalWrite(5, HIGH);
  delay(50);
  digitalWrite(5, LOW);
  delay(50);
  digitalWrite(6, HIGH);
  delay(50);
  digitalWrite(6, LOW);
  delay(50);
  digitalWrite(7, HIGH);
  delay(50);
  digitalWrite(7, LOW);
  delay(50);
  digitalWrite(8, HIGH);
  delay(50);
  digitalWrite(8, LOW);
  delay(50);
  digitalWrite(9, HIGH);
  delay(50);
  digitalWrite(9, LOW);
  delay(50);
  digitalWrite(10, HIGH);
  delay(50);
  digitalWrite(10, LOW);
  delay(50);
  digitalWrite(12, HIGH);
  delay(50);
  digitalWrite(12, LOW);
  delay(50);
  _startTime1 = currentTime;  
 }
  if(currentTime >= _startTime2 + INTERVAL2)
  {
  u8g.firstPage();  
  do {
    splash_screen();
  } while( u8g.nextPage() );
  _startTime2 = currentTime;
 }
} else {
 
 if (currentTime < 5500) {

digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
digitalWrite(LED6, LOW);
digitalWrite(LED7, LOW);
digitalWrite(LED8, LOW);
digitalWrite(LED9, LOW);
digitalWrite(LED10, LOW);
} else {  
  // picture loop
  u8g.firstPage();  
  do {
    u8g.drawFrame(0,38,128,18);
    draw();
  } while( u8g.nextPage() );
  
  // rebuild the picture after some delay
  

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

  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 > 150){               // and so on ...
      digitalWrite(LED2, HIGH);
    }
    else{
      digitalWrite(LED2, LOW);
    }

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


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

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

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

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

    if (average > 750){
      digitalWrite(LED8, HIGH);
    }
    else{
      digitalWrite(LED8, LOW);
    }

    if (average > 850){
      digitalWrite(LED9, HIGH);
    }
    else{
      digitalWrite(LED9, LOW);
    }

    if (average > 950){
      digitalWrite(LED10, HIGH);
    }
    else{
      digitalWrite(LED10, LOW);
    }
  }
  sprintf(msg, "%d", val); 

if (x > 0 && x < 340) { //Blue
digitalWrite(A1, HIGH);
digitalWrite(A2, LOW);
digitalWrite(A3, LOW);
}
if (x > 341 && x < 680) { //Green
digitalWrite(A2, HIGH);
digitalWrite(A1, LOW);
digitalWrite(A3, LOW);
}
if (x > 681 && x < 1023) { //Red
digitalWrite(A3, HIGH);
digitalWrite(A2, LOW);
digitalWrite(A1, LOW);
}
delay(100);
}
}
}

Если удастся решить проблему с average, то выложу сюда весь проект с печатной платой и фотками.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Про average посмотрю, но строки 184 и 265 исправьте - у Вас там переполнение миллис корячится. См. почему нельзя как у Вас и как нужно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

nnm4evr пишет:
значения в переменной average только повышаются

Так не бывает, Проведите более корректный эксперимент. Она у Вас не может быть больше, чем 1023, а значит всё время расти она не может.

Другое дело, что Вы её неправильно считаете и поначалу, она действительно будет только расти, а потом стабилизируется. Вот смотрите. Когда Вы в самый первый раз попадаете на строку 306, total у Вас равен 0. Вы помещаете туда первое значение, а делите в строке 314 сразу на 15, как будто бы Вы туда уже все 15 значений запихали. Потом, когда программа второй раз туда попадает, Вы добавляете к total второе значение и опять делите на 15. Зтем также третье. Понятное дело, что до тех пор, пока у Вас не накопятся все 15 измерений, average будет всё время расти. Но потом должна стабилизироваться.

rr_rashit
Offline
Зарегистрирован: 27.10.2013

Добрый день!

Что нибудь получилось?