Детектор Электромагнитных полей / Arduino EMF Detector
- Войдите на сайт для отправки комментариев
Пт, 22/12/2017 - 00:18
Здравствуйте. Собрал схемку на ардуино про мини и некоторых других компанентах, но есть проблема с кодом. За основу был взят код из этого проекта. Добавил дисплей, переменный резистор для регулировки чуствительности и ещё по мелочи. В общем значения в переменной 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, то выложу сюда весь проект с печатной платой и фотками.
Про average посмотрю, но строки 184 и 265 исправьте - у Вас там переполнение миллис корячится. См. почему нельзя как у Вас и как нужно.
Так не бывает, Проведите более корректный эксперимент. Она у Вас не может быть больше, чем 1023, а значит всё время расти она не может.
Другое дело, что Вы её неправильно считаете и поначалу, она действительно будет только расти, а потом стабилизируется. Вот смотрите. Когда Вы в самый первый раз попадаете на строку 306, total у Вас равен 0. Вы помещаете туда первое значение, а делите в строке 314 сразу на 15, как будто бы Вы туда уже все 15 значений запихали. Потом, когда программа второй раз туда попадает, Вы добавляете к total второе значение и опять делите на 15. Зтем также третье. Понятное дело, что до тех пор, пока у Вас не накопятся все 15 измерений, average будет всё время расти. Но потом должна стабилизироваться.
Добрый день!
Что нибудь получилось?