// // ########################## // # STATION METEOROMOGIQUE # // ########################## // # Guy Magli 18.08.2019 # // # 20.11.2019 # // ########################## // # Conception, cablages # // # mises a jour, # // # contact... # // # www.magli.fr # // ########################## // // Afin d'eviter les problemes d'affichage et d'impression les signes diacritiques // ont ete retires des commentaires et des chaines de caracteres. // // ! ======================== ! // ! LIBRAIRIES ET PARAMETRES ! // ! ======================== ! // #include #include #include // Mesures de la temperature, de la pression et de l'humidite. #include // Broches 20 et 21 #include //// // ! ================================================= ! // ! VARIABLES GLOBALES, CONSTANTES ET INITIALISATIONS ! // ! ================================================= ! // // : -------------------- : // : Le bouclier Internet : // : -------------------- : // // Adresse Mac du bouclier. // Cette adresse figure sur le bouclier Internet. // Elle peut etre modifiee. // Elle doit etre modifiee si vous avez deja une carte reseau avec la meme adresse MAC. // Par exemple { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE }; puis { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEF }; byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEC}; // Attention : l'adresse doit etre libre (voir IPSCAN ci-dessous) // Adresse IP du bouclier. IPAddress ip(192, 168, 1, 39); // Definie (libre) grace a IPSCAN. Voir la page ci-dessous // www.advanced-ip-scanner.com/fr int iPort = 10390; // Choisir un port disponible (< 65535) J'ai pris les deux derniers nombres de l'IP (1 et 39) // multiplies par 10 (10 et 390) EthernetServer server(iPort); // Choisir un port disponible // // : ----------------------------------------------------------------------- : // : Accessoire de mesure de la temperature, de la pression et de l'humidite : // : ----------------------------------------------------------------------- : // Adafruit_BME280 bme; float fTemperatureC = 0; // Temperature mesuree en C. float fTemperatureF = 0; // Temperature convertie en F. String cPlurielC = ""; // Pour l'accord en nombre. String cPlurielF = ""; float fHygrometrie = 0; // Taux d'humidite mesure. float fPressionA = 0; // Pression absolue mesuree. float fPressionR = 0; // Pression relative calculee correspondant a l'altitude. float fAltitude = 493; // Altitude du lieu pour conversion des pressions absolue et relative. // // : ---------- : // : Anemometre : // : ---------- : // float fVitesseKmh = 0; // Calcul de la vitesse du vent en km/h float fVitesseMph = 0; // et en miles per hour. float fIntervalle = 0; // Intervalle entre deux passages devant l'aimant. int iPin = 2; // A regler selon le type de carte. 2 convient pour une carte Mega 2560 . int iNbTours = 0; // Nombre de tours de l'anemometre dans le delai impose. // // ! ===== ! // ! SETUP ! // ! ===== ! // void setup() { // // Pour la communication via la console. // Serial.begin(9600); while(!Serial) {;} // // Titre // Serial.println(" "); Serial.println(": ---------------------------- :"); Serial.println(": INFORMATIONS METEOROLOGIQUES :"); Serial.println(": ---------------------------- :"); Serial.println(" "); // // Internet/Ethernet // Ethernet.begin(mac, ip); server.begin(); Serial.print("Le serveur est a l'adresse "); Serial.print(Ethernet.localIP()); Serial.print(" sur le port "); Serial.println(iPort); Serial.print("L'adresse MAC est "); Serial.print(mac[0], HEX); Serial.print(", "); Serial.print(mac[1], HEX); Serial.print(", "); Serial.print(mac[2], HEX); Serial.print(", "); Serial.print(mac[3], HEX); Serial.print(", "); Serial.print(mac[4], HEX); Serial.print(", "); Serial.print(mac[5], HEX); Serial.println(" "); server.begin(); delay(1000); // // Test du capteur meteorologique. // if (bme.begin()) { fTemperatureC = bme.readTemperature(); fTemperatureF = (bme.readTemperature() * 9 / 5) + 32; cPlurielC = ""; cPlurielF = ""; if (fTemperatureC >= 2) { cPlurielC = "s";} if (fTemperatureF >= 2) { cPlurielF = "s";} fHygrometrie = bme.readHumidity(); fPressionA = bme.readPressure() / 100.0F; fPressionR = (bme.readPressure() / 100.0F) + (fAltitude/8.3F); Serial.print("Temperatures : "); Serial.print(fTemperatureC); Serial.print(" degre"); Serial.print(cPlurielC); Serial.println(" Celsius"); Serial.print(" : "); Serial.print(fTemperatureF); Serial.print(" degre"); Serial.print(cPlurielF); Serial.println(" Farenheit"); Serial.print("Humidite : "); Serial.print(fHygrometrie); Serial.println(" %"); Serial.print("Pressions : "); Serial.print(fPressionA); Serial.println(" hPa (absolue)"); Serial.print(" : "); Serial.print(fPressionR); Serial.print(" hPa (relative a "); Serial.print((int)fAltitude); Serial.println (" m d'altitude)"); Serial.println(" "); } else { Serial.println("-> Le capteur meteorologique NE fonctionne PAS correctement."); } // // Initialisation anemometre. // pinMode(iPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(iPin), comptage, RISING); // Serial.println(" "); } // // ! ==== ! // ! LOOP ! // ! ==== ! // void loop() { char c; // // Ecoute des clients Ethernet. // EthernetClient client = server.available(); if (client) { Serial.println("Un client a ete trouve."); boolean bLigneVide = true; // La requete se terminera par une ligne blanche. while (client.connected()) { if (client.available()) { char c = client.read(); // Si une ligne est terminee et vide alors on envoie la reponse. if (c == '\n' && bLigneVide) { // // Temperature. // fTemperatureC = bme.readTemperature(); // La capteur donne la tempereture en degres Celsius. fTemperatureF = (bme.readTemperature() * 9 / 5) + 32; // On convertit en degres Farenheit. // // Hygrometrie. // fHygrometrie = bme.readHumidity(); // // Pression. // fPressionA = bme.readPressure() / 100.0F; // La capteur donne la pression absolue. fPressionR = (bme.readPressure() / 100.0F) + (fAltitude/8.3F); // On convertit en pression relative. // // Vitesse du vent. // iNbTours = 0; Serial.println("Mise a zero du compteur de tours."); delay(4000); // La page web de mon site n'est rafraichie que toutes les cinq secondes. // On peut se permettre de compter les tours de l'anemometre durant quatre secondes. // 2,4 km/h (1.492 mph) correspondent a un tour par seconde. Serial.print("Apres quatre secondes il y a eu "); Serial.print(iNbTours); Serial.println(" tour(s)."); iNbTours /= 12.5; // En comptant manuellement le nombre de tours reelement effectues et en comparant au // nombre de tours comptes, il y avait une difference de 12.5 fois. fVitesseKmh = 2.4 / 4.0 * (float)iNbTours; fVitesseMph = 1.492 / 4.0 * (float)iNbTours; client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.print("TCD"); // Balise-repere pour le debut (D) de la valeur de la temperature en Celsius (TC) client.print(fTemperatureC); client.print("TCF"); // Fin (F) pour la temperature en Celsius. client.print("TFD"); // Debut en Farenheit. client.print(fTemperatureF); client.print("TFF"); // Fin en Farenheit. client.print("HD"); // Debut Humidite. client.print(fHygrometrie); client.print("HF"); // Fin Humidite. client.print("PAD"); // Debut pression absolue. client.print(fPressionA); client.print("PAF"); // Fin pression absolue. client.print("PRD"); // Debut pression relative. client.print(fPressionR); client.print("PRF"); // Fin pression relative. client.print("VKD"); // Debut vitesse du vent en km/h. client.print(fVitesseKmh); client.print("VKF"); // Fin vitesse du vent en km/h. client.print("VMD"); // Debut vitesse du vent en miles/h. client.print(fVitesseMph); client.print("VMF"); // Fin vitesse du vent en miles/h. client.println("
"); break; } if (c == '\n') { // Une nouvelle ligne commence. bLigneVide = true; } else if (c != '\r') { // Cette ligne n'est pas vide. bLigneVide = false; } } } // Delai de reception. delay(1); // Fin de la connexion. client.stop(); } } // // ! ========== ! // ! Procedures ! // ! ========== ! // // : ---------------------------------- : // : Comptage des tours de l'anemometre : // : ---------------------------------- : // void comptage() { iNbTours++; }