code-grappe/src/main.cpp

160 lines
4.0 KiB
C++

#include "header.h"
using namespace std;
DHT capteurs[NOMBRE_CAPTEUR] = {DHT(23, DHT22), DHT(22, DHT22), DHT(21, DHT22), DHT(17, DHT22), DHT(2, DHT22)};
float temp[NOMBRE_CAPTEUR];
float hum[NOMBRE_CAPTEUR];
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 0, 60000);
Pangodream_18650_CL BL(ADC_PIN, CONV_FACTOR, READS);
//-------------------- FONCTIONS --------------------//
void setupMQTT(const char *adresse, int port)
{
mqttClient.setServer(adresse, port);
}
void setupWIFI(const char *wifiName, const char *password)
{
Serial.println('\n');
WiFi.begin(wifiName, password);
Serial.print("Connecting to ");
Serial.print(wifiName);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print('.');
}
Serial.println('\n');
Serial.println("Connection established!");
Serial.print("IP address:\t");
Serial.println(WiFi.localIP());
}
void reconnect(void)
{
Serial.println("Connecting to MQTT Broker...");
while (!mqttClient.connected())
{
Serial.print(".");
if (mqttClient.connect(ESPNAME,MQTT_USER,MQTT_MDP))
{
Serial.println("Connected.");
}
}
}
void initCapteurs(DHT *capteurs, int L)
{
int i;
for (i = 0; i < L; i++)
{
capteurs[i].begin();
}
}
void lireCapteurs(DHT capteurs[], float temp[], float hum[], int L)
{
int i;
for (i = 0; i < L; i++)
{
*(temp + i) = capteurs[i].readTemperature();
*(hum + i) = capteurs[i].readHumidity();
}
}
void sleep()
{
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
esp_deep_sleep_start();
}
//exemple d'une triple utilisation de valeur pour une fonction
std::tuple<int, int, int> getDate()
{
time_t rawtime = timeClient.getEpochTime();
struct tm *ti;
ti = localtime(&rawtime);
int year = ti->tm_year + 1900;
int month = (ti->tm_mon + 1) < 10 ? 0 + (ti->tm_mon + 1) : (ti->tm_mon + 1);
int day = (ti->tm_mday) < 10 ? 0 + (ti->tm_mday) : (ti->tm_mday);
return std::make_tuple(year, month, day);
}
void ecrireMessage(char *txt, float *temp, float *hum, int L)
{
int batte = BL.getBatteryChargeLevel();
switch (L)
{
case 1:
sprintf(txt, "|%s|%0.2f|%0.2f", GRAPPE, temp[0], hum[0]);
break;
case 2:
sprintf(txt, "|%s|%0.2f %0.2f|%0.2f %0.2f", GRAPPE, temp[0], temp[1], hum[0], hum[1]);
break;
case 3:
sprintf(txt, "|%s|%0.2f %0.2f %0.2f|%0.2f %0.2f %0.2f", GRAPPE, temp[0], temp[1], temp[2], hum[0], hum[1], hum[2]);
break;
case 4:
sprintf(txt, "|%s|%0.2f %0.2f %0.2f %0.2f|%0.2f %0.2f %0.2f %0.2f", GRAPPE, temp[0], temp[1], temp[2], temp[3], hum[0], hum[1], hum[2], hum[3]);
break;
case 5:
sprintf(txt, "|%s|%0.2f %0.2f %0.2f %0.2f %0.2f|%0.2f %0.2f %0.2f %0.2f %0.2f|%d", GRAPPE, temp[0], temp[1], temp[2], temp[3], temp[4], hum[0], hum[1], hum[2], hum[3], hum[4], batte);
break;
case 6:
sprintf(txt, "|%s|%0.2f %0.2f %0.2f %0.2f %0.2f %0.2f|%0.2f %0.2f %0.2f %0.2f %0.2f %0.2f", GRAPPE, temp[0], temp[1], temp[2], temp[3], temp[4], temp[5], hum[0], hum[1], hum[2], hum[3], hum[4], hum[5]);
break;
default:
Serial.println("Erreur, temp et hum sont trop longs : trop de capteurs");
break;
}
}
void setup()
{
Serial.begin(9600);
setupWIFI(SSID, PWD);
setupMQTT(MQTT_ADRESS, MQTT_PORT);
initCapteurs(capteurs, NOMBRE_CAPTEUR);
timeClient.begin();
}
void loop()
{
int year, month, day;
int lenght;
char time[30];
char date[30];
char msg[70];
mqttClient.loop();
if (!mqttClient.connected())
{
reconnect();
}
lireCapteurs(capteurs, temp, hum, NOMBRE_CAPTEUR);
ecrireMessage(msg, temp, hum, NOMBRE_CAPTEUR);
timeClient.update();
timeClient.getFormattedTime().toCharArray(time, 30);
tie(year, month, day) = getDate();
lenght = sprintf(date, "%d-%d-%d ", year, month, day);
sprintf(date + lenght, time);
sprintf(date + strlen(date), msg);
mqttClient.publish(TOPIC, date);
sleep();
delay(DELAI);
}