Paso 22: MEGA 2560 código completo
< p > / / esclavo ver adjunto archivo de texto para detalles completo. < br > #include #include "Adafruit_FONA.h" #include #include #include #include #include #include "DHT.h" #define FONA_RX 2 #define FONA_TX 10 #define FONA_RST 4 #define ONE_WIRE_BUS_PIN 11 #define DHTPIN 4 //#define DHT11 DHTTYPE / / 11 de DHT #define DHTTYPE DHT22 / / 22 de DHT (AM2302), AM2321 / //Sends Pin 5 señal llamemos a la transmisión de datos maestros al éxito. DHT dht (DHTPIN, DHTTYPE); OneWire oneWire(ONE_WIRE_BUS_PIN); DallasTemperature sensors (& oneWire); DeviceAddress Probe01 = {0x28, 0xFF, 0xA3, 0x4D, 0 x 00, 0x16, 0 x 03, 0xEC}; Estas son las direcciones de las sondas de temperatura DS18B20 DeviceAddress Probe02 = {0x28, 0x4E, 0xCA, 0 x 80, 0 x 04, 0 x 00, 0 x 00, 0xA0}; DeviceAddress Probe03 = {0x28, 0x7C, 0x8A, 0x5D, 0 x 05, 0 x 00, 0 x 00, 0xFD}; Hurones largo const = 179224; int n = 0; int z = 0; humedad int = 0; heatindex largo sin signo = 0; sin firmar largo humedad = 0; tempDHT22 largo sin signo = 0; velocidad del viento largo sin signo = 0; windgust largo sin signo = 0; avWindPulseRate largo sin signo = 0; maxWindPulseRate largo sin signo = 0; sin firmar largo lluvia = 0; windDirection largo sin signo = 0; Canal largo sin signo = 0; moistureValue largo sin signo = 0; sin firmar largo presión = 0; sin firmar largo voltios = 1200; multiplicado por 100. tempint largo sin firmar; tempout largo sin firmar; tempsoil largo sin firmar; unsigned previousMillis largo = 0; const largo intervalo de tiempo = 10000; se trata de un búfer grande para respuestas char replybuffer [255]; Iniciador de la cadena, dataString; const char DirecciónWeb [180] = "http://www.goatindustries.co.uk/weather/send.php?"; char la url [180]; #include fonaSS SoftwareSerial = SoftwareSerial (FONA_TX, FONA_RX); SoftwareSerial * fonaSerial = & fonaSS; Fona Adafruit_FONA = Adafruit_FONA(FONA_RST); Bmp Adafruit_BMP085_Unified = Adafruit_BMP085_Unified(10085); readline de uint8_t (char * buff, uint8_t maxbuff, uint16_t timeout = 0); tipo uint8_t; void setup() {pinMode (salida 5), Serial.begin(115200); //Sends una llamada de vuelta señal a datos maestros cuando exitosa transmisión. pinMode (6, salida); / / FONA restablece digitalWrite(6,LOW); / / delay (1000); / / digitalWrite(6,HIGH); / / delay (100); / / digitalWrite(6,LOW); dht.begin(); if(!bmp.begin()) {/ * hubo un problema detectando el BMP085... Compruebe sus conexiones * / Serial.print ("Ooops, no BMP085 detectado... Compruebe el cableado o I2C ADDR!"); while(1); } Wire.begin(9); Wire.onReceive(receiveEvent); mientras (!. Serie); Utilícela para iniciar el programa por la apertura de la serie monitor. Eliminar en la operación normal. Serial.println (F ("prueba básica de manejo")); Serial.println (F ("inicializando... (Puede tardar 3 segundos) ")); Sensors.Begin(); Sensores de temperatura DS18B20. sensors.setResolution (Probe01, 11); Fue en el pin 10 en versión 09 sensors.setResolution (Probe02, 11); sensors.setResolution (Probe03, 11); fonaSerial -> begin(4800); Si (! fona.begin(*fonaSerial)) {Serial.println (F ("no pudo encontrar FONA")); mientras que (1);} tipo = fona.type(); Serial.println (F (FONA es OK")); Serial.Print (F ("encontrado")); Switch (tipo) {caso FONA800L: Serial.println (F ("FONA 800L")); break; caso FONA800H: Serial.println (F ("FONA 800H")); break; caso FONA808_V1: Serial.println (F ("FONA 808 (v1)")); break; caso FONA808_V2: Serial.println (F ("FONA 808 (v2)")); break; caso FONA3G_A: Serial.println (F ("FONA 3G (americano)")); break; caso FONA3G_E: Serial.println (F ("FONA 3G (Europea)")); break; default: Serial.println(F("???")); break;} networkStatus(); Compruebe que la red está disponible. Página de inicio es bueno. Prueba de manejo por número IMEI del módulo de impresión. char el imei [15] = {0}; DEBE utilizar un buffer de 16 caracteres por IMEI! uint8_t imeiLen = fona.getIMEI(imei); Si (imeiLen > 0) {Serial.print ("módulo de IMEI:"); Serial.println(IMEI); } Serial.println(""); Serial.println ("comprobando que GPRS es apagado para comenzar con..."); fona.setGPRSNetworkSettings(F("pp.vodafone.co.uk"), F("wap"), F("wap")); Cambiar la configuración. Retardo de (red APN, username, password) (1000); Desactivar GPRS: Si ()
! fona.enableGPRS(false)) Serial.println (F ("No - no ha podido apagar")); Serial.println ("si la línea anterior dice OK, luego GPRS sólo esté apagado"); retrasar (1000); Serial.println(""); Serial.println ("esperando datos i2c..."); Serial.println("");} void loop() {si (z > 0) / / este bucle se inicia si z es mayor que 1. El valor de z está dado por el recibo {/ / de datos i2c. Tiene que haber una segunda evaluación de z que permita fona encender su GPRS networkStatus(); y evitar la pérdida de datos en el espacio de tiempo. voltios = analogRead (0) * 4.688; Los decimales se convierten a enteros como no queremos enviar el carácter de lugar decimal a través de HTTP. / / Lectura de temperatura o la humedad tarda aproximadamente 250 milisegundos! Lecturas del sensor también pueden ser de hasta 2 segundos 'old' (es un sensor muy lento) flotador h = dht.readHumidity(); Leer temperatura Celsius (predeterminado) flotador t = dht.readTemperature(); Leer temperatura Fahrenheit (isFahrenheit = true) float f = dht.readTemperature(true); retrasar (3000); Compruebe si cualquier Lee falló y salir temprano (para intentarlo de nuevo). Si (isnan(h) || isnan(t) || isnan(f)) {Serial.println ("error al leer del sensor DHT!"); vuelta;} / / cálculo índice de calor en grados Fahrenheit (predeterminado) flotador hif = dht.computeHeatIndex (f, h); Calcular el índice de calor en grados Celsius (isFahreheit = false) flotador hic = dht.computeHeatIndex (t, h, false); humedad = h; tempDHT22 = t; heatindex = hic; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// sensors_event_t event; bmp.getEvent(&event); Si (event.pressure) {presión = (event.pressure) * 100;} / / / sensors.requestTemperatures(); DS18B20s velocidad del viento = avWindPulseRate * 20; windgust = maxWindPulseRate * 20; canal = windDirection; humedad = moistureValue * 1.08; printData(); Imprime todos los datos en serie para la depuración. Serial.Print (F ("FONA >")); turnOnGPRS(); turnOnGPRS(); leer página web URL uint16_t statuscode; longitud de int16_t; char la url [180]; flushSerial(); weatherData(); / Esto es donde los datos se compilaron un carácter dataString = DirecciónWeb iniciador + "velocidad del viento =" + velocidad del viento + "& windgust =" + windgust + "& canal =" + canal + "& tempout =" + tempout + "& tempsoil =" + tempsoil + "& lluvia =" + lluvia + "& humedad =" + humedad + "& presión =" + presión + "& voltios =" + voltios + "& humedad =" + humedad + "& tempint =" + tempint + "& hurones =" + hurones; int n = dataString.length(); Serial.Print ("cadena de datos a enviar:"); Serial.println(dataString); Serial.Print ("tamaño de cadena:"); Serial.println(n); Construye el carácter del enlace: para (int aa = 0; aa < = n; aa ++) {url [aa] = dataString [aa];} Serial.Print ("para enviar los datos de carácter:"); Serial.println(URL); Serial.println(""); / /... y se envía hacia fuera vía HTTP a un archivo PHP llamado send.php listo para recibirlo. Serial.Print ("enviar url... "); Serial.Print ("url del compilado es:"); Serial.println(URL); Serial.println(F("***")); Si (! fona. HTTP_GET_start(URL, &StatusCode, (uint16_t *) & longitud)) {Serial.println("Failed!");} mientras (longitud > 0) {mientras que (fona.available()) {char c = fona.read(); / / Serial.write es demasiado lento, a escribir directamente a registro Serial! #if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__) loop_until_bit_is_set (UCSR0A, UDRE0); / * espere hasta que el registro de datos vacía. * / UDR0 = c; #else digitalWrite (5, alto); / / llamar al maestro decir que transmisión fue exitosa. tono (7 ((windway*15) + 400), 1000); noTone(7); Serial.Write(c); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #endif length--; Si (! longitud) break; }} Serial.println(F("\n***")); FONA. HTTP_GET_end(); Serial.println ("espere 10 segundos..."); Delay(500); digitalWrite (5, bajo); retardo (10000); Desactivar GPRS: Si (! fona.enableGPRS(false)) Serial.println (F ("No - no ha podido apagar")); Serial.println ("GPRS desactivado?"); Serial.println ("esperando datos i2c..."); ras flushSerial() de entrada; mientras que (fona.available()) {Serial.write(fona.read());} z = 0; }} / / Fin de bucle principal. / / Funciones: void flushSerial() {mientras que (Serial.available()) Serial.read();} char readBlocking() {mientras que (! Serial.Available()); volver Serial.read(); } uint16_t readnumber() {uint16_t x = 0; char c; mientras que (! isdigit (c = readBlocking())) {/ / Serial.print(c);} Serial.Print(c); x = c - '0'; mientras que (isdigit (c = readBlocking())) {Serial.print(c); x * = 10; x += c - '0';} return x; } uint8_t readline (char * buff, uint8_t maxbuff, tiempo de espera de uint16_t) {uint16_t buffidx = 0; timeoutvalid booleano = true; if (tiempo de espera == 0) timeoutvalid = falso; mientras que (verdad) {si (buffidx > maxbuff) {/ / Serial.println(F("SPACE")); break;} mientras que (Serial.available()) {char c = Serial.read(); //Serial.print c, HEX; Serial.Print("#"); Serial.println(c); Si (c == '\r') continuar; Si (c == 0xA) {si (buffidx == 0) / / se omite la primera 0x0A continuar; timeout = 0; / / el segundo 0x0A es el final de la línea timeoutvalid = cierto; break;} buff [buffidx] = c; buffidx ++; } Si (timeoutvalid & & tiempo de espera == 0) {/ / Serial.println(F("TIMEOUT")); break;} delay(1); } buff [buffidx] = 0; buffidx retorno del término nulo; } / / void receiveEvent (int bytes) {/ / asegurarse de que el orden es el mismo en maestro y esclavo. delay(10); maxWindPulseRate = Wire.read(); delay(10); windDirection = Wire.read(); delay(10); lluvia = Wire.read(); delay(10); avWindPulseRate = Wire.read(); delay(10); moistureValue = Wire.read(); delay(10); z = 1; humedad = moistureValue;} / / void printSoilTemperature (DeviceAddress deviceAddress) {temp flotador = sensors.getTempC(deviceAddress); tempsoil = temp * 100; si (tempsoil ==-127.00) {Serial.print ("Error al obtener la temperatura");} Else {Serial.print(tempsoil); Serial.Print ("grados C * 100"); }} void printOutsideTemperature (DeviceAddress deviceAddress) {temp flotador = sensors.getTempC(deviceAddress); tempout = temp * 100; si (tempout ==-127.00) {Serial.print ("Error al obtener la temperatura");} Else {Serial.print(tempout); Serial.Print ("grados C * 100"); }} void printInsideTemperature (DeviceAddress deviceAddress) {temp flotador = sensors.getTempC(deviceAddress); tempint = temp; if (tempint ==-127.00) {Serial.print ("Error al obtener la temperatura");} Else {Serial.print(tempint); Serial.Print ("grados CC * 100"); }} / / void networkStatus() {/ / leer la red celular estado uint8_t n = fona.getNetworkStatus(); Serial.println(""); Serial.Print (F "(estado de la red del)); Serial.Print(n); Serial.Print (F(":")); Si (n == 0) Serial.println (F ("no registrado")); Si (n == 1) Serial.println (F ("Registered (Inicio)")); Si (n == 2) Serial.println (F ("no registrados (buscando)")); Si (n == 3) Serial.println(F("Denied")); Si (n == 4) Serial.println(F("Unknown")); Si (n == 5) Serial.println (F ("Registered roaming")); Serial.println ("el estado de la red debe ser ' registrado' 'Inicio' en la línea anterior"); Serial.println("");} void turnOnGPRS() {Serial.println ("intentando encender GPRS..."); Si ()! fona.enableGPRS(true)) Serial.println (F ("No - error al encender")); Serial.println ("GPRS es cuando la línea superior muestra 'OK'"); Serial.println ("espere 10 segundos para asegurarse de que GPRS es de..."); retardo (10000); } / / void printData() {Serial.print ("Probe01 (exterior) temperatura:"); printOutsideTemperature(Probe01); Serial.println(); Serial.Print ("Probe02 temp (suelo):"); printSoilTemperature(Probe02); Serial.println(); Serial.Print ("Probe03 (tempint) temperatura:"); printInsideTemperature(Probe03); Serial.println(); Serial.Print ("voltaje de la batería principal:"); Serial.println(Volts); Serial.Print ("i2c maxWindPulseRate:"); Serial.println(windgust); Sin embargo no calibrado. Serial.Print ("i2c avWindPulseRate:"); Serial.println(windspeed); Serial.Print ("i2c windDirection:"); Serial.println(windDirection); Serial.Print ("lluvia de i2c:"); Serial.println(RAIN); Serial.Print ("i2c moistureValue:"); Serial.println(moistureValue); Serial.Print ("presión atmosférica:"); Serial.Print(Pressure); Serial.println ("hPa * 100"); Serial.Print ("humedad:"); Serial.Print(Humidity); Serial.println ("% \t"); Serial.Print ("temperatura de DHT22:"); Serial.Print(tempDHT22); Serial.println ("* C"); Serial.Print ("índice de calor:"); Serial.Print(heatindex); Serial.println ("* C"); Serial.println("");} < /p >