Arduino prog météo

Arduino prog météo

#include "SparkFunBME280.h"
//Library allows either I2C or SPI, so include both.
#include "Wire.h"
#include "SPI.h"
#include "DHT.h"

#include 

#include 
LiquidCrystal lcd( 3, 4, 5, 6, 9, 8);

#define        REFRESH                         3000

#define DHTPIN 2    // Changer le pin sur lequel est branché le DHT
#define DHTTYPE DHT11     // DHT 11 

SoftwareSerial softSerial(10, 11); // RX, TX
String SSID = "";  // SSID du réseau Wi-Fi
String PASS = ""; // Mot de passe Wi-Fi


DHT dht(DHTPIN, DHTTYPE);
BME280 capteur;

int dustPin = 7; // dust sensor - Arduino A0 pin
int ledPin = 0;

float voltsMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;
float Humidity = 0;
float Pression_at = 0;
float Temperature = 0;
float pressure;    //Pour stocker la pression (Pa)

/*
  private function
*/
/** Fonction de calcul rapide du point de rosée en fonction de la température et de l'humidité ambiante */
double dewPoint(double celsius, double humidity) {

  // Constantes d'approximation
  // Voir http://en.wikipedia.org/wiki/Dew_point pour plus de constantes
  const double a = 17.27;
  const double b = 237.7;

  // Calcul (approximation)
  double temp = (a * celsius) / (b + celsius) + log(humidity * 0.01);
  return (b * temp) / (a - temp);
}

void setup() {
  Serial.begin(9600);

  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);                                     //iled default closed

  while (!Serial) {
    // Attente de l'ouverture du port série pour Arduino LEONARDO
  }
  //configuration du capteur
  capteur.settings.commInterface = I2C_MODE;
  capteur.settings.I2CAddress = 0x76;
  capteur.settings.runMode = 3;
  capteur.settings.tStandby = 0;
  capteur.settings.filter = 0;
  capteur.settings.tempOverSample = 1 ;
  capteur.settings.pressOverSample = 1;
  capteur.settings.humidOverSample = 1;

  Serial.println("Starting BME280... ");
  delay(10);  // attente de la mise en route du capteur. 2 ms minimum
  // chargement de la configuration du capteur
  capteur.begin();
  dht.begin();
  lcd.begin(16, 2);

  //config wifi
  softSerial.begin(115200); // baudrate par défaut de l'ESP8266
  delay(100);
  // on demande à utiliser un baudrate inférieur
  // (notre esp8266 s'est montrer plus stable ainsi)
  softSerial.println("AT+CIOBAUD=9600");
  delay(200);
  softSerial.begin(9600);

}

void sendValue(String value) {
  //IP de votre serveur web a changer selon votre réseau";
  String host = "192.168.0.12";
  delay(100);
  // on va se connecter à un réseau existant, donc on passe en mode station
  softSerial.println("AT+CWMODE=1");
  delay(1000);
  // on se connecte au réseau
  softSerial.println("AT+CWJAP=\"" + SSID + "\",\"" + PASS + "\"");
  delay(10000);
  // mode "connexions multiples"
  softSerial.println("AT+CIPMUX=1");

  delay(3000);
  // on se connecte à notre serveur en TCP sur le port 80
  softSerial.println("AT+CIPSTART=4,\"TCP\",\"" + host + "\",80");
  delay(1000);


  String request = "GET /meteo/receive.php" + value + " HTTP/1.0\r\n";
  // chemin de et nom du fichier qui recevra les données

  request       += "Host:" + host + "\r\n";
  // on donne la taille de la requête qu'on va envoyer, en ajoutant 2 car
  // println ajouter 2 caractères à la fin "\r" et "\n"
  softSerial.println("AT+CIPSEND=4," + String(request.length() + 2));
  delay(500);
  // on envoie la requete
  softSerial.println(request);

  if (softSerial.available()) {
    Serial.print(softSerial.read());
  }

  
  delay(3000);
  // on ferme la connexion
  softSerial.println("AT+CIPCLOSE=4");

  Serial.println(request);
}

void loop() {

  digitalWrite(ledPin, HIGH); // power on the LED
  delayMicroseconds(280);

  voltsMeasured = analogRead(dustPin); // read the dust value

  delayMicroseconds(40);
  digitalWrite(ledPin, LOW); // turn the LED off
  delayMicroseconds(9680);

  //measure your 5v and change below
  calcVoltage = voltsMeasured * (5.0 / 1024.0);
  dustDensity = 0.17 * calcVoltage - 0.1;
  Serial.println("GP2Y1010AU0F readings");
  Serial.print("Raw Signal Value = ");
  Serial.println(voltsMeasured);
  Serial.print("Voltage = ");
  Serial.println(calcVoltage);
  Serial.print("Dust Density = ");
  Serial.println(dustDensity); // mg/m3
  Serial.println("");

  //Serial.print("Altitude: ");
  //Serial.print(capteur.readAltitude (1020));
  Serial.print("Température : ");
  Temperature = capteur.readTempC();
  Serial.print(Temperature, 2);
  Serial.println(" °C");
  Serial.print("Pression : ");
  Pression_at  = capteur.readFloatPressure();
  //Serial.print(Pression_at, 2);
  //Serial.println(" Pa ");
  Serial.print(Pression_at / 100);
  Serial.println(" mB");
  Serial.print("Humidité relative : ");
  Serial.print(capteur.readFloatHumidity(), 2);
  Serial.println(" %");
  Serial.print("Poussiere : ");
  Serial.print(dustDensity);
  Serial.println(" mg/m3");

  // Lecture du taux d'humidité
  float Humidity = dht.readHumidity();
  // Lecture de la température en Celcius
  float t = dht.readTemperature();
  // Pour lire la température en Fahrenheit
  float f = dht.readTemperature(true);
  // Calcul la température ressentie. Il calcul est effectué à partir de la température en Fahrenheit
  // On fait la conversion en Celcius dans la foulée
  float hi = dht.computeHeatIndex(f, Humidity);


  Serial.print("Humidite: ");
  Serial.print(Humidity);
  Serial.println(" %");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.println(" °C ");
  Serial.print("Temperature ressentie: ");
  Serial.print(dht.convertFtoC(hi));
  Serial.println(" °C");
  Serial.print("Point de rosee: ");
  Serial.print(dewPoint(t, Humidity));
  Serial.println(" °C\n");

  // set the cursor to (0,0):
  lcd.setCursor(0, 0);
  // print from 0 to 9:

  lcd.print("Temp: ");
  lcd.print(capteur.readTempC(), 2);
  lcd.print("C       ");
  // set the cursor to (16,1):
  lcd.setCursor(0, 1);
  lcd.print("Humidity: ");
  lcd.print(Humidity);
  lcd.print("%");
  delay(REFRESH);


  // set the cursor to (0,0):
  lcd.setCursor(0, 0);
  // print from 0 to 9:

  lcd.print("Dust: ");
  lcd.print(dustDensity);
  lcd.print("mg/m3");
  // set the cursor to (16,1):
  lcd.setCursor(0, 1);
  lcd.print("Pressur: ");
  lcd.print(Pression_at / 100);
  lcd.print("mb");

  delay(REFRESH);
  // construction des paramètres à transférer
  // ici le capteur est l'id 1, a changer sur chaque station pour les différencier
  String url_temperature = String(Temperature); // dans la vraie vie on utiliserait la valeur retournée par un capteur
  String url_pression = String(Pression_at);
  String url_humidite = String(Humidity);
  String url = "?capteur=1&temperature=" + url_temperature + "&pression=" + url_pression + "&humidite=" + url_humidite;

  sendValue( url);
}
Code sources Arduino CPP
jensepas
Publié le : 01/06/2022
Mise à jour : 06/07/2022