Stap 22: MEGA 2560 volledige Code
< p > / / SLAVE zie bijgevoegd bestand voor volledige details. < 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 DHTTYPE DHT11 / / DHT 11 #define DHTTYPE DHT22 / / DHT 22 (AM2302), AM2321 / / Pin 5 //Sends een call back signaal naar de master wanneer succesvol gegevensoverdracht. DHT dht (DHTPIN, DHTTYPE); Privacy oneWire(ONE_WIRE_BUS_PIN); DallasTemperature sensoren (& Privacy); DeviceAddress Probe01 = {0x28, 0xFF, 0xA3, 0x4D, 0x00, 0x16, 0x03, 0xEC}; Dit zijn de adressen van de temp sondes DS18B20 DeviceAddress Probe02 = {0x28, 0x4E, 0xCA, 0x80, 0x04, 0x00, 0x00, 0xA0}; DeviceAddress Probe03 = {0x28, 0x7C, 0x8A, 0x5D, 0x05, 0x00, 0x00, 0xFD}; Const lange fretten = 179224; int n = 0; int z = 0; int vocht = 0; unsigned long heatindex = 0; unsigned long vochtigheid = 0; unsigned long tempDHT22 = 0; niet-ondertekende lange windsnelheid = 0; unsigned long windgust = 0; unsigned long avWindPulseRate = 0; unsigned long maxWindPulseRate = 0; unsigned long regen = 0; niet-ondertekende lange windrichting = 0; unsigned long windway = 0; unsigned long moistureValue = 0; niet-ondertekende lange druk = 0; unsigned long volt = 1200; vermenigvuldigd met 100. unsigned long tempint; unsigned long tempout; unsigned long tempsoil; unsigned long previousMillis = 0; Const lange interval = 10000; Dit is een grote buffer voor antwoorden char replybuffer [255]; Tekenreeks initiatiefnemer, dataString; const char adres [180] = "http://www.goatindustries.co.uk/weather/send.php?"; char url [180]; #include SoftwareSerial fonaSS = SoftwareSerial (FONA_TX, FONA_RX); SoftwareSerial * fonaSerial = & fonaSS; Adafruit_FONA fona = Adafruit_FONA(FONA_RST); Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085); uint8_t readline (char * buff, uint8_t maxbuff, uint16_t-timeout = 0); uint8_t type; void setup {Serial.begin(115200) pinMode (5, OUTPUT); //Sends een oproep terug signaal naar de wanneer succesvol stamgegevens transmissie. pinMode (6, OUTPUT); / / reset FONA digitalWrite(6,LOW); / / vertraging (1000); / / digitalWrite(6,HIGH); / / vertraging (100); / / digitalWrite(6,LOW); dht.begin(); if(!bmp.begin()) {/ * er was een probleem opsporen van de BMP085... controleren van uw verbindingen * / Serial.print ("Ooops, geen BMP085 gedetecteerd... Check uw bedrading of I2C ADDR!"); while(1); } Wire.begin(9); Wire.onReceive(receiveEvent); terwijl (!. Serieel); Gebruik dit voor het initiëren van programma door opening van seriële monitor. Verwijder onder normaal bedrijf. Serial.println (F ("FONA basis test")); Serial.println (F ("initialiseren... (Kan 3 seconden duren) ")); sensors.begin(); Temperatuursensoren DS18B20. sensors.setResolution (Probe01, 11); Was op pin 10 in versie 09 sensors.setResolution (Probe02, 11); sensors.setResolution (Probe03, 11); fonaSerial -> begin(4800); Als (! fona.begin(*fonaSerial)) {Serial.println (F ('niet kon vinden FONA')); terwijl (1);} type = fona.type(); Serial.println (F ("FONA is OK")); Serial.Print (F ('gevonden')); switch (type) {FONA800L kast: Serial.println (F ("FONA 800L")); break; case FONA800H: Serial.println (F ("FONA 800H")); break; case FONA808_V1: Serial.println (F), ("FONA 808 (v1)"); break; case FONA808_V2: Serial.println (F), ("FONA 808 (v2)"); break; case FONA3G_A: Serial.println (F), ("FONA 3G (Amerikaans)"); break; case FONA3G_E: Serial.println (F ("FONA 3G (Europese)")); break; default: Serial.println(F("???")); break;} networkStatus(); Controleer dat het netwerk beschikbaar is. Huis is goed. Test FONA door afdrukken module IMEI-nummer. char imei [15] = {0}; MOET een buffer van 16 tekens voor IMEI gebruiken! uint8_t imeiLen = fona.getIMEI(imei); Als (imeiLen > 0) {Serial.print ("Module IMEI:"); Serial.println(IMEI); } Serial.println(""); Serial.println ("controleren dat GPRS is uitgeschakeld om te beginnen met..."); fona.setGPRSNetworkSettings(F("pp.vodafone.co.uk"), F("wap"), F("wap")); Deze instellingen te wijzigen! (Netwerk APN, gebruikersbenaming, wachtwoord) vertraging (1000); GPRS uitschakelen: als ()
! fona.enableGPRS(false)) Serial.println (F ("No - Failed to uitschakelen")); Serial.println is ("als de bovenstaande regel zegt OK, dan GPRS gewoon uitgeschakeld"); vertraging (1000); Serial.println(""); Serial.println ("Waiting for gegevens uit i2c..."); Serial.println("");} void loop {als (z > 0) / / deze lus wordt geïnitieerd als z groter dan 1 is. De waarde van z wordt gegeven door de ontvangst {/ / i2c vangegevens. Er moet een tweede evaluatie van de z om fona inschakelen zijn GPRS networkStatus(); en gegevensverlies voorkomen in het tijdsverschil. volt = analogRead (0) * 4.688; Alle decimalen worden geconverteerd naar gehele getallen, omdat we niet willen sturen het decimaal teken via HTTP. / / Lezing temperatuur of vochtigheid neemt ongeveer 250 milliseconden! Sensor lezingen kunnen ook worden maximaal 2 seconden 'oude' (het is een zeer langzame sensor) zweven h = dht.readHumidity(); Temperatuur gelezen als Celsius (de standaardinstelling) zweven t = dht.readTemperature(); Lees de temperatuur als Fahrenheit (isFahrenheit = true) vlotter f = dht.readTemperature(true); vertraging (3000); Controleer als elke leest mislukt en exit vroeg (om te probeer het opnieuw). Als (isnan(h) || isnan(t) || isnan(f)) {Serial.println ("Failed to lezen van DHT sensor!"); terugkeer;} / / Compute warmte-index in Fahrenheit (de standaardinstelling) zweven hif = dht.computeHeatIndex (f, h); Berekenen van de warmte-index in Celsius (isFahreheit = false) zweven hic = dht.computeHeatIndex (t, h, false); vochtigheid = h; tempDHT22 = t; heatindex = hic; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// sensors_event_t event; bmp.getEvent(&event); Als (event.pressure) {druk = (event.pressure) * 100;} / / / sensors.requestTemperatures(); DS18B20s windsnelheid = avWindPulseRate * 20; windgust = maxWindPulseRate * 20; Windway = windrichting; vocht = moistureValue * 1,08; printData(); Drukt alle gegevens seriële voor foutopsporing. Serial.Print (F ("FONA >")); turnOnGPRS(); turnOnGPRS(); Lees website URL uint16_t statuscode; de lengte van de int16_t; char url [180]; flushSerial(); weatherData(); / / Dit is waar de gegevens is gecompileerd tot een karakter... dataString = initiatiefnemer + adres + "windsnelheid =" + windsnelheid + "& windgust =" + windgust + "& windway =" + windway + "& tempout =" + tempout + "& tempsoil =" + tempsoil + "& regen =" + regen + "& vochtigheid =" + vochtigheid + "& Druk =" + druk + "& volt =" + volt + "& vocht =" + vocht + "& tempint =" + tempint + "& fretten =" + fretten; int n = dataString.length(); Serial.Print ("de tekenreeks van de Data te sturen:"); Serial.println(dataString); Serial.Print ("grootte van de tekenreeks:"); Serial.println(n); Bouwt de url-karakter: voor (int aa = 0; aa < = n; aa ++) {url [aa] = dataString [aa];} Serial.Print ("karakter van de gegevens moeten worden verzonden:"); Serial.println(URL); Serial.println(""); / /... en verzonden uit via HTTP naar een PHP bestand klaar om te ontvangen het send.php genoemd. Serial.Print ("versturen url... "); Serial.Print ("Compiled url is:"); Serial.println(URL); Serial.println(F("***")); Als (! fona. HTTP_GET_start(URL, &statuscode, (uint16_t *) & lengte)) {Serial.println("Failed!");} terwijl (lengte > 0) {terwijl (fona.available()) {char c = fona.read(); / / Serial.write is te traag, we schrijven rechtstreeks naar seriële register! #if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__) loop_until_bit_is_set (UCSR0A, UDRE0); / * wachten totdat de gegevens registreren empty. * / UDR0 = c; #else digitalWrite (5, hoog); / / terugbellen naar Master zeggen dat tranmission was succesvol. Toon (7 ((windway*15) +400), 1000); noTone(7); Serial.write(c); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #endif length--; Als (! lengte) breken; }} Serial.println(F("\n***")); FONA. HTTP_GET_end(); Serial.println ("wacht 10 seconden..."); delay(500); digitalWrite (5, laag); vertraging (10000); GPRS uitschakelen: als (! fona.enableGPRS(false)) Serial.println (F ("No - Failed to uitschakelen")); Serial.println ("GPRS uitgeschakeld?"); Serial.println ("Waiting for gegevens uit i2c..."); spoelen van de invoer flushSerial(); terwijl (fona.available()) {Serial.write(fona.read())}; z = 0; }} / / Einde van de hoofdlus. / / Functies: void flushSerial() {terwijl (Serial.available()) Serial.read();} char readBlocking() {tijdje (! Serial.available()); Return Serial.read(); } uint16_t readnumber() {uint16_t x = 0, c char; terwijl (! isdigit (c = readBlocking())) {/ / Serial.print(c);} Serial.Print(c); x = c - '0'; terwijl (isdigit (c = readBlocking())) {Serial.print(c); x * = 10; x += c - "0";} retour x; } uint8_t readline (char * buff, uint8_t maxbuff, uint16_t-timeout) {uint16_t buffidx = 0; Boole timeoutvalid = waar; als (timeout == 0) timeoutvalid = false; terwijl (waar) {als (buffidx > maxbuff) {/ / Serial.println(F("SPACE")); break;} terwijl (Serial.available()) {char c = Serial.read(); //Serial.print (c, HEX); Serial.Print("#"); Serial.println(c); Als (c == '\r') blijven; Als (c == 0xA) {als (buffidx == 0) / / de eerste 0x0A wordt genegeerd blijven; timeout = 0; / / de tweede 0x0A is het einde van de lijn timeoutvalid = true; break;} buff [buffidx] = c; buffidx ++; } Als (timeoutvalid & & timeout == 0) {/ / Serial.println(F("TIMEOUT")); break;} delay(1); } buff [buffidx] = 0; Null term return buffidx; } / / / void receiveEvent (int bytes) {/ / ervoor zorgen dat de volgorde is hetzelfde in de meester en slaaf. delay(10); maxWindPulseRate = Wire.read(); delay(10); windrichting = Wire.read(); delay(10); regen = Wire.read(); delay(10); avWindPulseRate = Wire.read(); delay(10); moistureValue = Wire.read(); delay(10); z = 1; vocht = moistureValue;} / / void printSoilTemperature (DeviceAddress deviceAddress) {float temp = sensors.getTempC(deviceAddress); tempsoil = temp * 100; als (tempsoil ==-127.00) {Serial.print ("Error getting temperatuur");} else {Serial.print(tempsoil); Serial.Print ("graden C * 100"); }} ongeldig printOutsideTemperature (DeviceAddress deviceAddress) {float temp = sensors.getTempC(deviceAddress); tempout = temp * 100; als (tempout ==-127.00) {Serial.print ("Error getting temperatuur");} else {Serial.print(tempout); Serial.Print ("graden C * 100"); }} ongeldig printInsideTemperature (DeviceAddress deviceAddress) {float temp = sensors.getTempC(deviceAddress); tempint = temp; if (tempint ==-127.00) {Serial.print ("Error getting temperatuur");} else {Serial.print(tempint); Serial.Print ("graden CC * 100"); }} / / void networkStatus() {/ / Lees de netwerk/mobiele status uint8_t n = fona.getNetworkStatus(); Serial.println(""); Serial.Print (F ("Network status")); Serial.Print(n); Serial.Print (F(":")); Als (n == 0) Serial.println (F ("niet geregistreerd")); Als (n == 1) Serial.println (F ("Registered (home)")); Als (n == 2) Serial.println (F ("niet geregistreerd (zoeken)")); Als (n == 3) Serial.println(F("Denied")); Als (n == 4) Serial.println(F("Unknown")); Als (n == 5) Serial.println (F ("aangetekende roaming")); Serial.println ("status van het netwerk moet worden ' geregistreerd' 'thuis' in de bovenstaande regel"); Serial.println("");} VOID turnOnGPRS() {Serial.println ("nu probeert te schakelen GPRS...'); Als ()! fona.enableGPRS(true)) Serial.println (F ("No - Failed to inschakelen")); Serial.println ("GPRS is als de lijn hierboven toont 'OK'"); Serial.println ("wacht 10 seconden om te controleren of dat GPRS is op..."); vertraging (10000); } / / void printData() {Serial.print ("Probe01 (buiten) temp:"); printOutsideTemperature(Probe01); Serial.println(); Serial.Print ("Probe02 (bodem) temp:"); printSoilTemperature(Probe02); Serial.println(); Serial.Print ("Probe03 (tempint) temp:"); printInsideTemperature(Probe03); Serial.println(); Serial.Print ("Main accuspanning:"); Serial.println(Volts); Serial.Print ("i2c-maxWindPulseRate:"); Serial.println(windgust); Nog niet gekalibreerd. Serial.Print ("i2c-avWindPulseRate:"); Serial.println(windspeed); Serial.Print ("i2c windrichting:"); Serial.println(windDirection); Serial.Print ("i2c regen:"); Serial.println(Rain); Serial.Print ("i2c-moistureValue:"); Serial.println(moistureValue); Serial.Print ("atmosferische druk:"); Serial.Print(Pressure); Serial.println ("hPa * 100"); Serial.Print ("vochtigheid:"); Serial.Print(Humidity); Serial.println ("% \t"); Serial.Print ("DHT22 temp:"); Serial.Print(tempDHT22); Serial.println ("* C"); Serial.Print ("warmte-index:"); Serial.Print(heatindex); Serial.println ("* C"); Serial.println("");} < /p >