Étape 22 : MEGA 2560 Code complet
< p > / / Voir esclave attaché le fichier texte complet détails. < 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 / / broche 5 //Sends un rappel de signaux pour la transmission de données permanentes lorsque réussie. DHT dht (DHTPIN, DHTTYPE) ; OneWire oneWire(ONE_WIRE_BUS_PIN) ; Capteurs DallasTemperature (& oneWire) ; DeviceAddress Probe01 = {0 x 28, 0xFF, 0xA3, 0x4D, 0 x 00, 0 x 16, 0 x 03, 0xEC} ; Voici les adresses des sondes de température DS18B20 DeviceAddress Probe02 = {0 x 28, 0x4E, 0xCA, 0 x 80, 0 x 04, 0 x 00, 0 x 00, 0xA0} ; DeviceAddress Probe03 = {0 x 28, 0x7C, 0x8A, 0x5D, 0 x 05, 0 x 00, 0 x 00, 0xFD} ; const longs furets = 179224 ; int n = 0 ; int z = 0 ; humidité int = 0 ; unsigned long heatindex = 0 ; unsigned longue humidité = 0 ; unsigned long tempDHT22 = 0 ; unsigned long windspeed = 0 ; unsigned long windgust = 0 ; unsigned long avWindPulseRate = 0 ; unsigned long maxWindPulseRate = 0 ; unsigned long pluie = 0 ; unsigned long direction du vent = 0 ; unsigned long windway = 0 ; unsigned long moistureValue = 0 ; unsigned longue pression = 0 ; unsigned longs volts = 1200 ; multiplié par 100. unsigned long tempint ; unsigned long tempout ; unsigned long tempsoil ; unsigned long previousMillis = 0 ; const long intervalle = 10000 ; Il s’agit d’un gros tampon pour réponses char replybuffer [255] ; Initiateur de la chaîne, dataString ; const char Adresse_web [180] = « http://www.goatindustries.co.uk/weather/send.php? » ; url de char [180] ; #include SoftwareSerial fonaSS = SoftwareSerial (FONA_TX, FONA_RX) ; SoftwareSerial * fonaSerial = & fonaSS ; Adafruit_FONA fona = Adafruit_FONA(FONA_RST) ; Bmp Adafruit_BMP085_Unified = Adafruit_BMP085_Unified(10085) ; uint8_t readline (char * chamois, uint8_t maxbuff, uint16_t timeout = 0) ; type d’uint8_t ; void setup() {Serial.begin(115200) ; pinMode (sortie 5,); //Sends un appel retour de signal pour le données permanentes lorsque réussie transmission. pinMode (6, sortie); / / réinitialise FONA digitalWrite(6,LOW); / / delay (1000); / / digitalWrite(6,HIGH); / / delay (100); / / digitalWrite(6,LOW) ; dht.begin() ; if(!bmp.begin()) {/ * il y avait un problème de détection de la BMP085... Vérifiez vos connexions * / Serial.print ("Oups, pas BMP085 détecté... Vérifiez votre câblage ou I2C ADDR!") ; while(1) ; } Wire.begin(9) ; Wire.onReceive(receiveEvent) ; while (!. Série) ; L’utiliser pour lancer le programme par ouverture de serial monitor. Supprimer en fonctionnement normal. Serial.println (F (« FONA test de base")) ; Serial.println (F ("initialisation... (Peut prendre 3 secondes) ")) ; sensors.Begin() ; Capteurs de température DS18B20. sensors.setResolution (Probe01, 11) ; Était sur la broche 10 en version 09 sensors.setResolution (Probe02, 11) ; sensors.setResolution (Probe03, 11) ; fonaSerial -> begin(4800) ; Si (! fona.begin(*fonaSerial)) {Serial.println (F ("Impossible de trouver FONA")); while (1);} type = fona.type() ; Serial.println (F (« FONA est OK")) ; Serial.Print (F ("Found")) ; commutateur (type) {case FONA800L : 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 (américain)")); break ; case FONA3G_E : Serial.println (F (« FONA 3G (européenne)")); break ; default : Serial.println(F("???")) ; break;} networkStatus() ; Vérifiez que le réseau est disponible. La maison est bonne. Test FONA en imprimant le numéro IMEI du module. char imei [15] = {0} ; DOIT utiliser une mémoire tampon de 16 caractères pour IMEI ! uint8_t imeiLen = fona.getIMEI(imei) ; Si (imeiLen > 0) {Serial.print ("Module IMEI:") ; Serial.println(IMEI) ; } Serial.println("") ; Serial.println ("vérification que GPRS est désactivé à commencer par...") ; fona.setGPRSNetworkSettings(F("pp.vodafone.co.uk"), F("wap"), F("wap")) ; Modifiez ces paramètres ! Retard (APN, nom d’utilisateur, mot de passe réseau) (1000) ; Désactiver GPRS : si ()
! fona.enableGPRS(false)) Serial.println (F (« No - impossible d’éteindre")) ; Serial.println ("si la ligne du dessus dit OK, alors le GPRS a juste été désactivée ») ; retarder (1000) ; Serial.println("") ; Serial.println ("Waiting for données i2c...") ; Serial.println("");} void loop() {si (z > 0) / / cette boucle est lancée si z est supérieur à 1. La valeur de z est donnée par la réception {/ / des données i2c. Il faut faire une deuxième évaluation de z pour activer fona allumer c' est GPRS networkStatus() ; et éviter toute perte de données dans l’intervalle de temps. v = analogRead (0) * 4,688 ; Tous les nombres décimaux est convertis en entiers comme nous ne voulons pas envoyer le caractère décimale via HTTP. / / Lecture de température ou d’humidité prend environ 250 millisecondes ! Lectures du capteur peuvent être aussi jusqu'à 2 secondes « ancienne » (c’est un capteur très lent) flotter h = dht.readHumidity() ; Lire la température en degrés Celsius (la valeur par défaut) flotter t = dht.readTemperature() ; Lire la température en degrés Fahrenheit (isFahrenheit = true) flotteur f = dht.readTemperature(true) ; retarder (3000) ; Vérifier si des lectures a échoué et arrêter prématurément (pour réessayer). Si (isnan(h) || isnan(t) || isnan(f)) {Serial.println ("Impossible de lire du capteur DHT!"); return;} / / indice de chaleur de calcul en degrés Fahrenheit (par défaut) flotteur hif = dht.computeHeatIndex (f, h) ; Calculer l’indice de chaleur en degrés Celsius (isFahreheit = false) flotter hic = dht.computeHeatIndex (t, h, false) ; humidité = h ; tempDHT22 = t ; heatindex = hic ; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// sensors_event_t event; bmp.getEvent(&event) ; Si (event.pressure) {pression = (event.pressure) * 100;} / / / sensors.requestTemperatures() ; Vitesse du vent de DS18B20s = avWindPulseRate * 20 ; windgust = maxWindPulseRate * 20 ; Windway = direction du vent ; l’humidité = moistureValue * 1.08 ; printData() ; Imprime toutes les données de série pour le débogage. Serial.Print (F (« FONA > ")) ; turnOnGPRS() ; turnOnGPRS() ; lire le site Web URL uint16_t statuscode ; int16_t longueur ; url de char [180] ; flushSerial() ; weatherData() ; / / C’est où les données sont compilées en un personnage... dataString = initiateur + Adresse_web + "windspeed =" + vitesse du vent + "& windgust =" + windgust + "& windway =" + windway + "& tempout =" + tempout + "& tempsoil =" + tempsoil + "& pluie =" + pluie + "& humidité =" + humidité + "& pression =" + pression + "& volts =" + VCC + "& humidité =" + humidité + "& tempint =" + tempint + "& furets =" + furets ; int n = dataString.length() ; Serial.Print ("chaîne de données à envoyer:") ; Serial.println(dataString) ; Serial.Print ("taille de la chaîne:") ; Serial.println(n) ; Crée le personnage d’url : pour (int aa = 0; aa < = n; aa ++) {url [aa] = dataString [aa];} Serial.Print ("données d’envoyer des caractères:") ; Serial.println(URL) ; Serial.println("") ; / /... et envoyé dehors par l’intermédiaire de HTTP vers un fichier PHP appelé send.php prêt à le recevoir. Serial.Print ("envoi d’url... "); Serial.Print ("Compiled url est:") ; Serial.println(URL) ; Serial.println(F("***")) ; Si (! fona. HTTP_GET_start(URL, &StatusCode, (uint16_t *) & longueur)) {Serial.println("Failed!");} while (longueur > 0) {tandis que (fona.available()) {char c = fona.read(); / / Serial.write est trop lent, nous allons écrire directement au registre série! #if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__) loop_until_bit_is_set (UCSR0A, UDRE0); / * attendre jusqu'à ce que le registre de données vide. * / UDR0 = c; #else digitalWrite (5, HIGH); / / Call back au maître de dire cette transmission a été un succès. ton (7 ((windway*15) + 400), 1000) ; noTone(7) ; Serial.Write(c) ; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #endif length--; Si (! longueur) break ; }} Serial.println(F("\n***")) ; fona. HTTP_GET_end() ; Serial.println ("Wait for 10 secondes...") ; Delay(500) ; digitalWrite (5, faible) ; retard (10000) ; Désactiver GPRS : si (! fona.enableGPRS(false)) Serial.println (F (« No - impossible d’éteindre")) ; Serial.println ("Data désactivé?"); Serial.println ("Waiting for données i2c...") ; Rincer les flushSerial() d’entrée ; tandis que (fona.available()) {Serial.write(fona.read());} z = 0 ; }} / / Fin de la boucle principale. / / Fonctions : void flushSerial() {tout en (Serial.available()) Serial.read();} readBlocking() de char {while (! Serial.available()) ; Return Serial.read() ; } uint16_t readnumber() {uint16_t x = 0; char c; while (! isdigit (c = readBlocking())) {/ / Serial.print(c);} Serial.Print(c) ; x = c - « 0 » ; tandis que (isdigit (c = readBlocking())) {Serial.print(c); x * = 10 ; x += c - '0';} return x ; } uint8_t readline (char * chamois, uint8_t maxbuff, uint16_t timeout) {uint16_t buffidx = 0; boolean timeoutvalid = true ; if (timeout == 0) timeoutvalid = false ; while (true) {si (buffidx > maxbuff) {/ / Serial.println(F("SPACE")) ; break;} tandis que (Serial.available()) {char c = Serial.read() ; //Serial.print (c, HEX) ; Serial.Print("#") ; Serial.println(c) ; Si (c == « \r ») continuer ; Si (c == 0xA) {si (buffidx == 0) / / est ignoré la première 0x0A continuer ; timeout = 0; / / la deuxième 0x0A est la fin de la ligne timeoutvalid = true ; break;} buff [buffidx] = c ; buffidx ++ ; } Si (timeoutvalid & & timeout == 0) {/ / Serial.println(F("TIMEOUT")) ; break;} delay(1) ; } buff [buffidx] = 0 ; buffidx retour de null à terme ; } / / / void receiveEvent (int bytes) {/ / s’assurer que l’ordre est le même en maître et esclave. delay(10) ; maxWindPulseRate = Wire.read() ; delay(10) ; direction du vent = Wire.read() ; delay(10) ; pluie = Wire.read() ; delay(10) ; avWindPulseRate = Wire.read() ; delay(10) ; moistureValue = Wire.read() ; delay(10); z = 1; humidité = moistureValue;} / / / Sub printSoilTemperature (DeviceAddress deviceAddress) {temp flotteur = sensors.getTempC(deviceAddress) ; tempsoil = temp * 100 ; if (tempsoil ==-127.00) {Serial.print ("Error getting température");} else {Serial.print(tempsoil) ; Serial.Print ("degrés C * 100") ; }} void printOutsideTemperature (DeviceAddress deviceAddress) {temp flotteur = sensors.getTempC(deviceAddress) ; tempout = temp * 100 ; if (tempout ==-127.00) {Serial.print ("Error getting température");} else {Serial.print(tempout) ; Serial.Print ("degrés C * 100") ; }} void printInsideTemperature (DeviceAddress deviceAddress) {temp flotteur = sensors.getTempC(deviceAddress) ; tempint = temp ; if (tempint ==-127.00) {Serial.print ("Error getting température");} else {Serial.print(tempint) ; Serial.Print ("degrés CC * 100") ; }} / / / void networkStatus() {/ / lecture du réseau cellulaire/statut uint8_t n = fona.getNetworkStatus() ; Serial.println("") ; Serial.Print (F (« État du réseau")) ; Serial.Print(n) ; Serial.Print (F(":")) ; Si (n == 0) Serial.println (F ("non enregistrée")) ; Si (n == 1) Serial.println (F "(Registered (maison)")) ; Si (n == 2) Serial.println (F ("n’est pas inscrit (la recherche)")) ; Si (n == 3) Serial.println(F("Denied")) ; Si (n == 4) Serial.println(F("Unknown")) ; Si (n == 5) Serial.println (F (« Registered roaming")) ; Serial.println ("l’état du réseau doit être" inscrit"« home » dans la ligne du dessus") ; Serial.println("");} void turnOnGPRS() {Serial.println ("maintenant tenter activer GPRS...") ; Si ()! fona.enableGPRS(true)) Serial.println (F (« No - n’a pas pu mettre en marche")) ; Serial.println ("GPRS est allumé si la ligne ci-dessus montre « OK »") ; Serial.println ("attendez 10 secondes pour s’assurer que le GPRS est sur...") ; retard (10000) ; } void printData() / / / {Serial.print ("Probe01 temp (extérieur):") ; printOutsideTemperature(Probe01) ; Serial.println() ; Serial.Print ("Probe02 temp (sol):") ; printSoilTemperature(Probe02) ; Serial.println() ; Serial.Print ("Probe03 (tempint) temp:") ; printInsideTemperature(Probe03) ; Serial.println() ; Serial.Print ("tension de la batterie principale:") ; Serial.println(volts) ; Serial.Print ("i2c maxWindPulseRate:") ; Serial.println(windgust) ; Pas encore étalonné. Serial.Print ("i2c avWindPulseRate:") ; Serial.println(WindSpeed) ; Serial.Print ("i2c direction du vent:") ; Serial.println(windDirection) ; Serial.Print ("pluie i2c:") ; Serial.println(Rain) ; Serial.Print ("i2c moistureValue:") ; Serial.println(moistureValue) ; Serial.Print ("pression atmosphérique:") ; Serial.Print(Pressure) ; Serial.println (« hPa * 100") ; Serial.Print ("humidité:") ; Serial.Print(Humidity) ; Serial.println ("\t %") ; Serial.Print ("temp DHT22:") ; Serial.Print(tempDHT22) ; Serial.println ("* C") ; Serial.Print ("indice de chaleur:") ; Serial.Print(heatindex) ; Serial.println ("* C") ; Serial.println("");} < /p >
- MEGA 2560 code.txt