1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
| #include "SparkFunBME280.h"
#include "Wire.h"
#include "SPI.h"
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Déclaration des broches de l'afficheur
#include <Adafruit_SSD1306.h>
#include <splash.h>
BME280 bme;
// Afficheur OLED
#define SCREEN_WIDTH 128 // Ecran OLED 128 pixels de long
#define SCREEN_HEIGHT 64 // Ecran OLED 64 pixels de haut
#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//Declare variable
class Capteur
{
public:
float pression;
float temperature;
float humidite;
};
void setup()
{
Serial.begin(4800); // initialisation com série
//configuration du capteur BME280
bme.settings.commInterface = I2C_MODE; //Broche SKL>SDI BME280 - Broche SCL>SCK BME280
bme.settings.I2CAddress = 0x76;
bme.settings.runMode = 3;
bme.settings.tStandby = 0;
bme.settings.filter = 0;
bme.settings.tempOverSample = 1 ;
bme.settings.pressOverSample = 1;
bme.settings.humidOverSample = 1;
delay(100); // attente de la mise en route du capteur. 2 ms minimum
// chargement de la configuration du capteur
bme.begin();
// Configuration de l'afficheur LCD -20 caractères par lignes, 4 lignes.
lcd.begin (20, 4);
lcd.clear(); // Efface l'écran
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Address 0x3C for 128x64
// Show initial display buffer contents on the screen --
// the library initializes this with an Adafruit splash screen.
display.clearDisplay(); // Efface l'écran et le buffer
display.display(); // Affiche le logo Adafruit
}
Capteur retourneCapteur(BME280 bme)
{
Capteur capteur;
capteur.pression = bme.readFloatPressure() / 100;
capteur.humidite = bme.readFloatHumidity();
capteur.temperature = bme.readTempC();
return capteur;
}
void loop()
{
Capteur capteur = retourneCapteur(bme);
String nmea = retourneNmea(capteur);
Serial.println(nmea); // Affichage sentence sur port série
Serial.println (bme.readTempC());
// afficheurLCD(capteur); // Fonction affichage LCD
// Serial.println("LCD");
afficheurOLED(capteur); // Appel de la fonction affichage OLED
Serial.println("OLED");
delay (1000);// temporisation avant nouvelle mesure de température en mS
Serial.println("Fin de loop");
} // Fin de programme
// Sentence NMEA0183
String retourneNmea(Capteur capteur)
{
// Construction de la trame NMEA à partir de laquelle on calculera le CRC
String donnees = "WIXDR,P,";
donnees += String (capteur.pression,1);
donnees += ",mB,barometer,C,";
donnees += String (capteur.temperature,2);
donnees += ",C,temperature,H,";
donnees += String (capteur.humidite,0);
donnees += ",%,humidite";
// Calcul du CRC
int crc8Res = crc8Xor(donnees); // CRC en decimal
String crc8Hex = String(crc8Res, HEX); // Conversion en hexa
// Construction finale de la trame NMEA
String nmea = "$" + donnees + "*" + crc8Hex;
Serial.println("Fin de boucle Sentence NMEA");
return nmea;
}
// Calcul CRC8
int crc8Xor(const String s) {
int i;
int _xor;
int c;
for (_xor = 0, i = 0; i < s.length(); i++) {
c = (unsigned char)s.charAt(i);
if (c == '*') break;
if ((c!='$') && (c!='!')) _xor ^= c;
}
Serial.print(_xor);
Serial.println("Fin de boucle calcul CRC");
return _xor;
}
void afficheurLCD(Capteur capteur)
{
lcd.clear(); // Efface l'écran
lcd.setCursor(0, 0); //Position du curseur colonne 0 et ligne 0 (la première ligne)
lcd.print ("Station meteo");
lcd.setCursor(0, 1);
lcd.print ("Humidite : ");
lcd.print (String(capteur.humidite, 0));
lcd.print ("%");
lcd.setCursor(0, 2);
lcd.print ("Temp.: ");
lcd.print(String (capteur.temperature,2));
lcd.print ("*C");
lcd.setCursor(0, 3);
lcd.print ("Pres.: ");
lcd.print (String(capteur.pression, 1));
lcd.print ("hPa");
Serial.println("Fin de boucle LCD");
}
void afficheurOLED(Capteur capteur) // Déclaration de la fonction
{
display.clearDisplay(); //Efface l'écran et le tampon
display.setTextSize(2); // Taille du texte
display.setTextColor(WHITE); // Couleur du texte
display.setCursor(0, 1); // Position origine du texte T
display.print("T: "); // Ligne pour la température eau de mer
display.setCursor(39, 1); // Position origine valeur température
// display.print(readTemperatureMeasure(SENSOR_ADDRESS_1)); // Affiche la température
display.drawCircle(107, 4, 4, WHITE); // Dessine le symbole degré
display.drawCircle(107, 4, 3, WHITE); // Epaissi le symbole degré
display.setCursor(115, 1); // Position origine de l'unité
display.print("C"); // Affiche C pour l'unité
display.setCursor(0, 16); // Position origine du texte T
display.print("T: "); // Ligne pour la température air exterieur
display.setCursor(39, 16); // Position origine valeur température
display.print(capteur.temperature,2); // Affiche la température
display.drawCircle(107, 20, 4, WHITE); // Dessine le symbole degré
display.drawCircle(107, 20, 3, WHITE); // Epaissi le symbole degré
display.setCursor(115, 16); // Position origine de l'unité
display.print("C"); // Affiche C pour l'unité
display.setCursor(0, 33); // Position origine du texte H
display.print("H: "); // Ligne pour l'humidité
display.setCursor(39, 33); // Position origine valeur Humidité
display.print(capteur.humidite, 0); // Affiche l'humidité
display.setCursor(107, 33); // Position origine der l'unité
display.print("%"); // Affiche % pour l'unité
display.setCursor(0, 51); // Position origine du texte P
display.print("P: "); // Ligne pour la pression
display.setCursor(28, 51); // Position origine valeur pression
display.print(capteur.pression, 1); // Affiche la pression
display.setTextSize(1); // Taille du texte
display.setCursor(108, 55); // Position origine der l'unité
display.print("hPa"); // Affiche Pa pour l'unité
display.display();
} // Fin de la fonction affichage OLED |
Partager