/* Ce mini Baromètre sur une base Esp 32 avec un écran oled 1.3 est largement inspiré du modèle de https://github.com/ingmar/nanobaro traduction et rajout de l'écran oled et un peu de ménage dans la trame puis basculage sur un ESP 32 puis rajout du Wifi . Et quelques demandes des copains d'Hisse et oh " https://www.hisse-et-oh.com/ " . La demande :"faire un petit baromètre qui affiche une courbe et alarme quant une dépression se pointe et compatible Nmea 0183 avec OpenCPN " https://opencpn.org/ " et qtVlm https://www.meltemus.com/index.php/fr/ autant sous Windows que sous Linux! Rajout d'une tempo sur le temps entre deux trames envoyé à opencpn ou qtvlm pour limiter l'historique visible mit ici par defaut a 1 minute ligne 272 l'alarme se déclenche quant la différence entre l'ancienne mesure (régler ici tous les 15 minutes mais modifiable facilement) et la nouvelle mesure est plus grande que 5 Hpa pour être exact la bonne valeur devrait être 15 Hpa sur 1 heures soit 22 pixels. mais je préféré l'avoir sur 15 minutes donc valeur a peut prés 7 pixels à vous de voir ! le matos 1 Esp32, 1 capteur de pression type BME 280 en I2c ou 1 BMP 180 en I2C , 1 écran oled 128 X 64 en I2C aussi câblage standard plein d'exemple sur le net ! Je préfère le montage en I2C : VIN 3.3v GND GND SCL pin 22 SDA pin 21 par exemple : http://arduino-er.blogspot.com/2017/04/connect-i2c-128x64-oled-ssd1306-to.html C'est ma premiere prise en main d’un ESP 32 (soyez indulgent !)'' . Mais venez apporter vos corrections ou améliorations sur ce site ! Il y a quelques bricoleurs très sympas et beaucoup de compétences ! //Le croquis utilise 661856 octets (50%) de l'espace de stockage de programmes !!! Bonne nav a tous A.guy */ #include #include "SparkFunBME280.h" #include "U8g2lib.h" #include ///////////////////////////////////////Wifi #include WiFiUDP udp; IPAddress udp_ip(10,0,0,255); int Port_udp = 10100; /// ne pas oublier de configurer qtVlm ou openCpn sur ce port !!! // les identifiants de votre reseau Wifi. const char *ssid = "Wifi_Bateau"; //Le nom de votre reseau const char *password = "Introuvable"; // votre mot de passe String Wmsg ; //////////////////////////////////////////////////////////// Votre ecran Oled plusieur choix //U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK); // Affichage qui n'envoie pas de courant alternatif //U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NO_ACK); // Si le premier fait une barre sur le coté essayez celui là ! j'utilise c'est deux types d'ecran ;=) //U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); BME280 mySensor; long temps; long tempstrame; int pmax =1080; int pmin =940; #define NMEA_TALKER_ID "WI" // Instruments météorologiques #define NMEA_DELAY 10 // Envoyer des données toutes les 10 secondes #define PRESS_OVERSAMPLING 2 String s; float temp, pre,humidi; int TA =0; int Hpixel=0; int hpixel[128]; String tabprev[] = {"Tempete", "Pluie/Vent", "Variable","Beau Temps","Tres Sec"}; int inprev =0 ; const byte buff_len = 70; char CRCbuffer[buff_len]; char prevtxt; byte nmea_crc(String msg) { // NMEA CRC: XOR chaque octet avec le précédent pour tous les caractères entre '$' et '*' int i; byte crc = 0; for (i = 0; i < buff_len; i++) { crc ^= msg.charAt(i); // XOR } return crc; } ////////////////////////////////////////////////////////////////////////////////////////////// void nmea_send(String sentence, String params) { String msg = String(NMEA_TALKER_ID) + sentence + params; msg.toCharArray(CRCbuffer, sizeof(CRCbuffer)); // mettre la chaîne complète dans CRCbuffer int crc = nmea_crc(CRCbuffer); if (crc < 16) msg += "0"; // pad with leading 0 String hexcrc = String(crc, HEX); hexcrc.toUpperCase(); Serial.println("$" + msg + "*" + hexcrc); /////////////////////////////////////////////////// Wmsg= ("$" + msg + "*" + hexcrc); Envoi_paquet_Wifi(); } ////////////////////////////////////////////////////// void nmea_txt(String text) { nmea_send("TXT", ",01,01,01," + text); } //////////////////////////////////////////////////////// void tablimite() { int labelmax[] = {960,990,1020,1050,1080}; int labelmin[] = {930,960,990,1020,1050}; int inlimit = map((pre)/100 ,930,1080,0,5); inprev = map((pre)/100 ,930,1080,0,4); if (inprev < 0) { inprev =0;} pmax= labelmax[inlimit]; pmin= labelmin[inlimit]; } //////////////////////////////////////////////////////////////////////////////////////////////// void draw_page_24H(void) { u8g2.setFont(u8g2_font_5x7_tf); u8g2.drawStr( 23, 3, "HPa"); u8g2.drawLine(48, 8, 48, 64); u8g2.drawStr( 42, 3, "12 H"); u8g2.drawLine(96, 8, 96, 64); u8g2.drawStr( 90, 3, "24 H"); u8g2.setCursor(0, 3); u8g2.print(pmax); u8g2.setCursor(0, 58); u8g2.print(pmin); u8g2.drawStr( 23, 58, "HPa"); //if((millis() - temps) > 10000)// chaque 10 seconds pour test if((millis() - temps) > 900000)//chaque 15 minutes pour mieux voir en details //if((millis() - temps) > 1800000)//chaque 30 minutes pensez a changer le 12 H en 24 H et le 24 H en 48 H sur les lignes 180 et 182 menu draw_page_24H { temps = millis(); TA++ ; if (TA ==128) { TA = 0 ;} Hpixel = map((pre)/100,(pmin),(pmax),60,5); hpixel[TA]= (Hpixel); } u8g2.setCursor((TA+5),(Hpixel)); u8g2.print ((pre)/100,0); u8g2.drawStr((TA+25),(Hpixel),"HPa"); for (int TA=0;TA<128;TA=TA+1) u8g2.drawPixel (TA,hpixel[TA]); //u8g2.setCursor (30,30); //u8g2.print (Hpixel); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void draw_gestion_alarmwifi(void) { u8g2.setFont(u8g2_font_5x7_tf); /////IPServeur u8g2.drawStr(4, 0, "Baro_NMEA_ESP32_WIFI \xb0 C.P.H "); u8g2.drawStr( 2, 4, "Capteur:"); u8g2.setCursor(50, 4); ///u8g2.print (IPServeur [0]); u8g2.print (WiFi.localIP()); /// j'ai laissé les commande si vous avez un probléme avec votre wifi pour debugger //u8g2.drawStr( 2, 12, "Distant:"); //u8g2.setCursor(50, 12); ///u8g2.print (WiFi.remotePort()); //u8g2.drawStr( 2, 12, "Distant:"); //u8g2.setCursor(45, 12); //u8g2.print (WiFi.gatewayIP()); // vérifiez la connexion de l'état du réseau: : if (WiFi.waitForConnectResult() != WL_CONNECTED) { u8g2.setCursor(65, 22); u8g2.print("WiFi Non Connecté"); while(1) { delay(1000); } } } //////////////////////////////////////////////////////////// void draw_page_alarm(void) { // les commandes graphiques pour redessiner l'écran complet doivent être placées ici ///test alarme sur 3 if ( ((Hpixel)- hpixel[TA-1] > 3) & (hpixel[TA-1]>0) ) /// declence l'alarme ici a 3hpa par rapport en l'ancienne valeur { u8g2.drawStr( 2, 16, "Alarme chute de pression"); u8g2.drawStr( 2, 26, "> 15 dPA"); u8g2.drawStr( 2, 36, "Risque de :"); u8g2.drawStr( 2, 46, "Enbata,Galerno,Gwalarn....");// dans ma zone de navigation c'est plutot l'Enbata a vous de mettre le nom de vos coups de vents locaux !!! ;=) } else { u8g2.drawStr( 22, 16, " Pas d'Alarme"); u8g2.setCursor(10, 46); //u8g2.print( inprev); u8g2.print(tabprev[inprev]); } } ///////////////////////////////////////////////////////// void draw_tabgene (){ if((millis() - tempstrame) > 10000)// chaque 10 seconds envoie de la trame { temp = mySensor.readTempC(); pre = mySensor.readFloatPressure(); humidi =mySensor.readFloatHumidity(); // u8g2.setFont(u8g2_font_6x13); u8g2.setFont( u8g2_font_5x7_tf); u8g2.setFontRefHeightExtendedText(); // u8g2.setDefaultForegroundColor(); u8g2.setFontPosTop(); u8g2.drawStr(2, 1, "Press :"); u8g2.setCursor(45, 1); u8g2.print (round(pre /100 ),0); u8g2.drawStr(76, 1, "hPa"); u8g2.drawStr(2, 15, "Temp :"); u8g2.setCursor(45, 15); u8g2.print ((temp),1); u8g2.drawStr(66, 15, "\xb0 C"); u8g2.drawStr(2, 30, "Hum :");/// si vous n'utilisez pas de capteur BME 280 vous pouvez virer ces lignes ! sinon l'humidité affichera 0 % // u8g2.setPrintPos(45, 30); u8g2.setCursor(45, 30); u8g2.print (round(humidi),0); u8g2.drawStr(66, 30, "%"); } } /////////////////////////////////////////////////////////////////////// void setup() { Serial.begin(38400); /// si vous raccordé en usb ne pas oublier de bien configurer votre port serie sur 38400 ;=) mySensor.setI2CAddress(0x76); mySensor.beginI2C(); Wire.begin(); Wire.setClock(400000); //Increase to fast I2C speed! delay(1000); u8g2.setDisplayRotation(U8G2_R2); //u8g2.setRot180(); /// rotation ecran si besoin //u8g2.setContrast(3); /// reglage du contraste u8g2.begin(); ////////////////////////////////////wifi Serial.println("Connecté a "); Serial.println(ssid); WiFi.mode(WIFI_STA); //connect to your local wi-fi network WiFi.begin(ssid, password); ////////////////////////// //check wi-fi is connected to wi-fi network if (WiFi.waitForConnectResult() != WL_CONNECTED) { Serial.println("WiFi Non Connecté"); while(0) { delay(1000); } } WiFi.softAP("TEST_NETWORK", "12345678"); udp.begin(10110); } ///////////////////////////////////////////////////////////////////////////////////////////// void connexion_Wifi(){ if (WiFi.waitForConnectResult() != WL_CONNECTED) { Serial.println("WiFi Non Connecté"); while(0) { delay(1000); } } } void updatenmea() { // if((millis() - tempstrame) > 10000)// chaque 10 seconds envoie de la trame if((millis() - tempstrame) > 60000)// chaque 60 seconds envoie de la trame { tempstrame = millis(); s = ""; s = ",C," + String (temp) + ",C,TempAir"; s += ",P," + String(round(pre) / 100000.0, 5) + ",B,Barometer"; // OpenCPN ne semble pas vouloir Pascal (unité "P"), seulement Bar ("B") nmea_send("XDR", s); nmea_send("XDR,C", "," + String (temp) + ",C,TempAir"); nmea_send("XDR,P", "," + String (round(pre) / 100000.0, 5) + ",B,Barometer"); } } /////////////////////////////////////////////////////////////////////////// void loop() { u8g2.firstPage(); do { tablimite(); draw_page_24H(); } while( u8g2.nextPage() ); while( u8g2.nextPage() );//end of picture loop delay(2500); //////////////////////////// u8g2.firstPage(); do { draw_page_alarm(); updatenmea(); //trame nmea } while( u8g2.nextPage() );//end of picture loop delay(2500); //////////////////// u8g2.firstPage(); do { draw_tabgene(); } while( u8g2.nextPage() );//end of picture loop // rebuild the picture after some delay delay(2500); ///////////////////////// connexion_Wifi(); } void Envoi_paquet_Wifi () { if (WiFi.waitForConnectResult() == WL_CONNECTED) { Serial.println(" Connection possible"); udp.beginPacket(udp_ip, 10110); udp.println( Wmsg ); udp.endPacket(); delay(1000); } }