Paso 3: Código y los iconos
Ahora viene la parte que hace todo el trabajo!
El código. O en ArduinoSpeak (el boceto).
ACTUALIZACIÓN: he encontrado y corregido un pequeño bug que podría causar el detector congelar cuando detecta una señal desconocida. También he añadido la capacidad para el detector guardar la configuración cuando apagado almacenando los valores en la EEPROM. el código actualizado está en el zip con el código original. El código actualizado tiene el EEPROM anexado al nombre de archivo dentro del archivo zip.
También se incluyen los archivos de impresora 3d de sketchup para el caso.
El Sensor AS3935 básicamente sólo se sienta y escucha lightnig vía la antena pequeña inducción en el tablero de arranque. Cuando detecta algo que piensa es rayo o ruido que provoca la cuál es llamada un IRQ. Esto es una señal que es duro por cable en el arduino que puede hacer que se detenga y preste atención no importa lo que está haciendo en el momento.
Cuando Arduino ve la línea IRQ cambiar detiene cualquier código corre y salta a un poco especial de código que pueda leer los datos del sensor guardados sobre el evento particular se detecta y luego mostrar o actuar según lo que encuentre.
En nuestro caso el Arduino se sienta y felizmente (o Infelizmente, quién sabe cómo se siente acerca de ello.) un pequeño mapa de bits de nube en movimiento en la pantalla. Una y otra vez... parece también momentáneamente para ver si un botón tiene ben presiona indicando el usuario Todopoderoso quiere cambiar algunos ajustes.
Si el Sensor pasa el arduino en el lado con un IRQ. El arduino para animar la nubecita y pide el sensor lo que quiere. El arduino luego actualiza la pantalla para mostrar lo ha aprendido.
El bosquejo también incluye algunas opciones de configuración rudimentaria como si queremos saber la distancia del relámpago en millas o kilómetros o si estamos dentro o fuera.
He incluido un archivo zip que contiene todos los archivos que he creado en relación con este proyecto. también contiene las bibliotecas de la Junta de detector del relámpago. Tiene todo que lo necesario para construir esta igual que tengo.
Las bibliotecas de Nokia 5110 están disponibles en el administrador de bibliotecas de la IDE de Arduino. Simplemente busca por adafruit GFX y LCD.
Aquí está el código...
------------------------------------------------------------------
#include #define eeprom_dist 4 //Define ubicación de memoria eeprom para almacenar milla o km cálculo #define eeprom_level 5 //Define eeprom ubicación de memoria para almacenar cálculo de millas o km #include / * * AS3935 comunica con i2c en este bosquejo * y el Nokia 5110 utiliza SPI * / #include #include #include Adafruit_PCD8544 display = Adafruit_PCD8544 (8, 5, 4); #include "I2C.h" / / incluye bibliotecas jugando con fusión AXS3935 #include "PWFusion_AS3935_I2C.h" / / interrupción desencadenar var global volátil int8_t AS3935_ISR_Trig = 0; definir algunos valores utilizados por el panel y los botones int adc_key_in = 0; int z = 0; mi int = 0; #define #define btnLEFT 3 btnDOWN 2 #define btnUP 1 #define btnRIGHT 0 #define btnSELECT 4 #define btnNONE 5 / / define para hardware config #define SI_PIN 9 #define IRQ_PIN 2 / digitales pins 2 y 3 están disponibles para la capacidad de interrupción #define AS3935_ADD 0 x 03 / / x03-configuración estándar de PWF SEN-39001-R01 #define AS3935_CAPACITANCE 104 / / <--establecer este valor a la número listado en su Junta / / define configuración de chip general #define AS3935_INDOORS 0 #define AS3935_OUTDOORS 1 #define AS3935_DIST_ DIS 1 #define AS3935_DIST_EN 0 int l = 0; int n = 0; int lsDist = 0; int mapDist = 0; int m = 0; dist int = 0; tt de int = 0; prototipos de void AS3935_ISR(); ---datos que construye el lightning0 de los iconos en pantalla PWF_AS3935_I2C (IRQ_PIN (uint8_t), SI_PIN (uint8_t), AS3935_ADD (uint8_t)); const unsigned char PROGMEM lightning_bmp [32] = {0 x 01, 0xE0, 0 x 02, 0 x 20, 0x0C, 0x18, 0x12, 0x24, 0x21, 0 x 06, 0 x 10, 0 x 02, 0x1F, 0xFC, 0 x 01, 0xF0, 0 x 01, 0xC0, 0 x 03, 0 x 80, 0x07, 0xF8, 0 x 00, 0xF0, 0 x 00, 0xC0, 0 x 01, 0 x 80, 0 x 01, 0 x 00, 0 x 01, 0 x 00}; const unsigned char PROGMEM nube [32] = {0 x 01, 0xE0, 0 x 02, 0 x 20, 0x0C, 0x18, 0x12, 0x24, 0x21, 0 x 06, 0 x 10, 0 x 02, 0x1F, 0xFC, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00}; rayo de PROGMEM de const unsigned char [32] = {0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 01, 0xF8, 0 x 01, 0xF0, 0 x 01, 0xC0, 0 x 03, 0 x 80, 0x07, 0xF8, 0 x 00, 0xF0, 0 x 00, 0xC0, 0 x 01, 0 x 80, 0 x 01, 0 x 00, 0 x 01, 0 x 00}; int read_buttons() {adc_key_in = analogRead(0); / / lee el valor de placa. Valores devuelven si obtiene presiona un botón y que se fue... Si (adc_key_in > 1000) vuelta btnNONE; Si (adc_key_in == 0) volver btnLEFT; Si (adc_key_in > 310 y 330 < adc_key_in) devuelven btnDOWN; Si (adc_key_in > 120 y adc_key_in < 145) vuelta btnUP; Si (adc_key_in > 480 y adc_key_in < 550) volver btnRIGHT; Si (adc_key_in > 700 y 800 < adc_key_in) devuelven btnSELECT; volver btnNONE; Cuando todos los demás fallan, esto regresar...} ---la config menú menú vacío () {delay(400); mientras que (read_buttons()! = 4) {display.clearDisplay(); display.setCursor(0,0); display.setTextSize(1); display.println("Enter=Return"); display.setCursor(0,8); display.println ("hasta = Mi"); display.setCursor(0,18); display.println ("hacia abajo = kilometros"); display.setCursor(0,28); display.println("Left=Indoors"); display.setCursor(0,38); display.println ("derecha = al aire libre"); display.display(); Si (read_buttons() == 1) {mi = 0; EEPROM.write(eeprom_dist,0); Escribir configuración de milla (1) / (0) kilómetro cálculo EEPROM de memoria después de energía apagado display.clearDisplay(); display.setCursor(0,0); display.setTextSize(1); display.println "(juego del km"); display.display(); Delay(1000); Menu(); } Si (read_buttons() == 2) {mi = 1; EEPROM.write(eeprom_dist,1); Escribir ajuste para el cálculo de la milla/kilómetro a EEPROM de memoria después de energía apagado display.clearDisplay(); display.setCursor(0,0); display.setTextSize(1); display.println "(conjunto de millas"); display.display(); Delay(1000); Menu(); } Si (read_buttons() == 0) {lightning0. AS3935_SetIndoors(); Dist = 0; EEPROM.write(eeprom_level,0); Escribir configuración para interiores (0) (1) al aire libre ajuste en AS3935 para EEPROM de memoria después de energía apagado display.clearDisplay(); display.setCursor(0,0); display.setTextSize(1); display.println("Indoor"); display.setCursor(0,20); display.println("Operation"); display.display(); Delay(1000); Menu(); } Si (read_buttons() == 3) {lightning0. AS3935_SetOutdoors(); Dist = 1; EEPROM.write(eeprom_level,1); Escribir configuración para interiores (0) (1) al aire libre ajuste en AS3935 para EEPROM de memoria después de energía apagado display.clearDisplay(); display.setCursor(0,0); display.setTextSize(1); display.println("Outdoor"); display.setCursor(0,20); display.println("Operation"); display.display(); Delay(1000); Menu(); retorno de}}; } void setup() {mi = EEPROM.read(eeprom_dist); //Read almacena configuración de EEPROM dist = EEPROM.read(eeprom_level); //Read almacena la configuración de pinMode(6,OUTPUT) EEPROM; Serial.Begin(115200); display.Begin(); init realizada / / se puede cambiar el contraste para adaptar la pantalla / / para la mejor visualización! display.setContrast(25); display.display(); Show splashscreen display.clearDisplay(); display.setCursor(0,0); display.setTextSize(1); display.println ("hablantes Lightning Detector"); display.setTextSize(1); display.drawBitmap (35, 22, lightning_bmp, 16, 16, 1); display.setTextColor(BLACK); display.display(); Flash(); display.display(); Delay(3000); configuración para el la librería I2C: (permitir finalizar, ajustar la velocidad a 400kHz) I2c.begin(); I2C.pullup(true); I2C.SETSPEED(1); Delay(2); lightning0. AS3935_DefInit(); conjunto de registros por defecto / / actualizar ahora cal sensor para su aplicación y encendido chip lightning0. AS3935_ManualCal (AS3935_CAPACITANCE, AS3935_OUTDOORS, AS3935_DIST_EN); Parámetros de AS3935_ManualCal: / /--> capacidad en pF (marcado en el paquete) / /--> bajo techo/al aire libre (AS3935_INDOORS:0 / AS3935_OUTDOORS:1) / /--> perturbadores (AS3935_DIST_EN:1 / AS3935_DIST_DIS:2) / / función también enciende el chip / / habilitar interrupción (gancho pin IRQ para Arduino Uno/Mega interrupción entrada: 0 -> pin 2, 1 -> pin 3) attachInterrupt (0, AS3935_ISR, RISING); lightning0. AS3935_PrintAllRegs(); AS3935_ISR_Trig = 0; gatillo claro} / /---esto solo consigue jugado una y otra vez... y más... y o... void loop() {display.clearDisplay(); analogWrite(6,60); //---turn en la luz de fondo / /---construir la pantalla display.setCursor(0,0); display.println("LastStrike"); display.setCursor(0,8); display.println ("Dist:" + String(lsDist)); display.setCursor(50,8); ---Si elegimos millas, hacer este si (mi == 1) {display.println ("Mi");} //otherwise suponer que queremos hacer esto... else {display.println ("Km");} display.setCursor(0,17); display.println("0"); display.setCursor(72,17); Si millas---40 km = aaprox 25 millas if(mi==1) {display.println("25");} else {/ /---si no sólo la escala para display.println("40") de 40 km;} display.setCursor(0,39); display.println ("huelgas:"); display.setCursor(48,39); display.println(String(l)); display.setCursor(64,39); --colocar una indicación que nosotros estamos dentro en la esquina inferior derecha de la pantalla si (dist==1){display.println("Out");} más {/ /--o mostrar fueron fijados para al aire libre display.println("In");} //--draw la display.drawLine de la escala de distancia (0, 37, 84, 37, negro); display.drawLine (0, 0, 25, 37, negro); display.drawLine (21, 35, 21, 37, negro); display.drawLine (42, 42, 35, 37, negro); display.drawLine (35, 63, 63, 37, negro); display.drawLine (25, 83, 83, 37, negro); display.fillCircle(mapDist,35,2,BLACK); Si (l == 0) / /--empezamos con no display.setCursor(9,24) de ataques detectados; display.println ("sin golpes"); Si (l > 0) //-if theres una huelga. lugar un poco zap en la distancia lo es... display.drawBitmap (mapDist, 22, relámpago, 16, 16, 1); Si (mapDist > 20) {display.setCursor(9,24); display.println ("Far Ligntning");} display.display(); if(0 == AS3935_ISR_Trig) {/ / Serial.println(read_buttons()); animateCloud(); / / Serial.println(read_buttons()); si (read_buttons()! = 5) {menu();}; / / reposición de bandera de interrupción AS3935_ISR_Trig = 0; / / ahora consigue interrumpir la fuente uint8_t int_src = lightning0. AS3935_GetInterruptSrc(); if(0 == int_src) {display.setCursor(72,0); display.println("?"); display.display(); / / delay(1000); display.setCursor(72,0); display.println("");} otra cosa if(1 == int_src) {flash(); uint8_t lightning_dist_km = lightning0. AS3935_GetLightningDistKm(); display.clearDisplay(); l ++; display.println ("rayos!!"); Si (mi == 1) {lsDist =(lightning_dist_km * 0.62137);} else {lsDist=(lightning_dist_km);} display.println((lsDist)); mapDist = mapa (lsDist, 0, 0, 25, 83); display.println ("millas"); display.display(); Flash(); } else if(2 == int_src) {/ / display.clearDisplay(); display.setCursor(72,0); display.println("N"); / / n ++; display.display(); delay(1000); display.setCursor(72,0); display.println("");} otra cosa if(3 == int_src) {display.clearDisplay(); display.println ("nivel de ruido muy alto"); display.display(); delay(500);} / / lightning0. AS3935_PrintAllRegs(); para debug...} } / / Esto es el controlador de irq para AS3935 interrupciones, tiene que regresar vacío y no tomar argumentos / siempre hacer código en interrumpir controladores rápido y corto void AS3935_ISR() {AS3935_ISR_Trig = 1;} //---flash el flash() vacía rutina pantalla {para (int y = 1; y < 5; y ++) {digitalWrite(6,LOW); display.invertDisplay(true); delay(100); digitalWrite(6,HIGH); display.invertDisplay(false); delay(100);}} //--make que nube bebé ir!!!! void animateCloud() {display.drawBitmap (m, 15, nube, 16, 16, 1); display.display(); si (m > = 80) {m = 0;} m ++; delay(200);}