first commit
This commit is contained in:
parent
a7c5dbe592
commit
5a6b55af27
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
|
@ -0,0 +1,6 @@
|
|||
.pio
|
||||
.vscode/.browse.c_cpp.db*
|
||||
.vscode/c_cpp_properties.json
|
||||
.vscode/launch.json
|
||||
.vscode/ipch
|
||||
include/secret.h
|
39
include/README
Normal file
39
include/README
Normal file
|
@ -0,0 +1,39 @@
|
|||
|
||||
This directory is intended for project header files.
|
||||
|
||||
A header file is a file containing C declarations and macro definitions
|
||||
to be shared between several project source files. You request the use of a
|
||||
header file in your project source file (C, C++, etc) located in `src` folder
|
||||
by including it, with the C preprocessing directive `#include'.
|
||||
|
||||
```src/main.c
|
||||
|
||||
#include "header.h"
|
||||
|
||||
int main (void)
|
||||
{
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
Including a header file produces the same results as copying the header file
|
||||
into each source file that needs it. Such copying would be time-consuming
|
||||
and error-prone. With a header file, the related declarations appear
|
||||
in only one place. If they need to be changed, they can be changed in one
|
||||
place, and programs that include the header file will automatically use the
|
||||
new version when next recompiled. The header file eliminates the labor of
|
||||
finding and changing all the copies as well as the risk that a failure to
|
||||
find one copy will result in inconsistencies within a program.
|
||||
|
||||
In C, the usual convention is to give header files names that end with `.h'.
|
||||
It is most portable to use only letters, digits, dashes, and underscores in
|
||||
header file names, and at most one dot.
|
||||
|
||||
Read more about using header files in official GCC documentation:
|
||||
|
||||
* Include Syntax
|
||||
* Include Operation
|
||||
* Once-Only Headers
|
||||
* Computed Includes
|
||||
|
||||
https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html
|
43
include/header.h
Normal file
43
include/header.h
Normal file
|
@ -0,0 +1,43 @@
|
|||
#ifndef HEADER_H
|
||||
#define HEADER_H
|
||||
#include <ESPAsyncWebServer.h>
|
||||
#include <WiFiUdp.h>
|
||||
#include <NTPClient.h>
|
||||
#include <DHT.h>
|
||||
#include <PubSubClient.h>
|
||||
#include <Pangodream_18650_CL.h>
|
||||
#include <secret.h>
|
||||
|
||||
#define TOPIC "test1"
|
||||
#define MQTT_ADRESS "192.168.0.242"
|
||||
#define MQTT_PORT 1883
|
||||
#define DELAI 600000 //en ms
|
||||
#define ESPNAME "esp32-bastien"
|
||||
#define GRAPPE "grappe2"
|
||||
#define NOMBRE_CAPTEUR 5
|
||||
#define DHT22 22
|
||||
#define TIME_TO_SLEEP 598
|
||||
#define uS_TO_S_FACTOR 1000000
|
||||
#define R2 100
|
||||
#define R3 10
|
||||
#define VOLTAGE_OUT(Vin) (((Vin)*R3) / (R2 + R3))
|
||||
#define VOLTAGE_MAX 4200
|
||||
#define VOLTAGE_MIN 3300
|
||||
#define ADC_REFERENCE 1100
|
||||
#define VOLTAGE_TO_ADC(in) ((ADC_REFERENCE * (in)) / 4096)
|
||||
#define BATTERY_MAX_ADC VOLTAGE_TO_ADC(VOLTAGE_OUT(VOLTAGE_MAX))
|
||||
#define BATTERY_MIN_ADC VOLTAGE_TO_ADC(VOLTAGE_OUT(VOLTAGE_MIN))
|
||||
#define ADC_PIN 34
|
||||
#define CONV_FACTOR 2.92
|
||||
#define READS 20
|
||||
|
||||
void setupMQTT(const char *adresse, int port);
|
||||
void setupWIFI(const char *wifiName, const char *password);
|
||||
void reconnect(void);
|
||||
void initCapteurs(DHT *capteurs, int L);
|
||||
void lireCapteurs(DHT capteurs[], float temp[], float hum[], int L);
|
||||
void ecrireMessage(char *txt, float *temp, float *hum, int L);
|
||||
|
||||
//timeClient.getEpochTime().toCharArray(date, 50); = convertir un string en char
|
||||
|
||||
#endif
|
5
include/secret.h
Normal file
5
include/secret.h
Normal file
|
@ -0,0 +1,5 @@
|
|||
#define MQTT_USER "NomUtilisateurMQTT"
|
||||
#define MQTT_MDP "MotDePasseMQTT"
|
||||
#define SSID "NomDuWifi"
|
||||
#define PWD "MotDePasseWifi"
|
||||
|
10
lib/NTPClient-master/.travis.yml
Normal file
10
lib/NTPClient-master/.travis.yml
Normal file
|
@ -0,0 +1,10 @@
|
|||
language: c
|
||||
sudo: false
|
||||
before_install:
|
||||
- source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/install.sh)
|
||||
script:
|
||||
- build_platform esp8266
|
||||
notifications:
|
||||
email:
|
||||
on_success: change
|
||||
on_failure: change
|
15
lib/NTPClient-master/CHANGELOG
Normal file
15
lib/NTPClient-master/CHANGELOG
Normal file
|
@ -0,0 +1,15 @@
|
|||
NTPClient 3.1.0 - 2016.05.31
|
||||
|
||||
* Added functions for changing the timeOffset and updateInterval later. Thanks @SirUli
|
||||
|
||||
NTPClient 3.0.0 - 2016.04.19
|
||||
|
||||
* Constructors now require UDP instance argument, to add support for non-ESP8266 boards
|
||||
* Added optional begin API to override default local port
|
||||
* Added end API to close UDP socket
|
||||
* Changed return type of update and forceUpdate APIs to bool, and return success or failure
|
||||
* Change return type of getDay, getHours, getMinutes, and getSeconds to int
|
||||
|
||||
Older
|
||||
|
||||
* Changes not recorded
|
234
lib/NTPClient-master/NTPClient.cpp
Normal file
234
lib/NTPClient-master/NTPClient.cpp
Normal file
|
@ -0,0 +1,234 @@
|
|||
/**
|
||||
* The MIT License (MIT)
|
||||
* Copyright (c) 2015 by Fabrice Weinberg
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "NTPClient.h"
|
||||
|
||||
NTPClient::NTPClient(UDP& udp) {
|
||||
this->_udp = &udp;
|
||||
}
|
||||
|
||||
NTPClient::NTPClient(UDP& udp, int timeOffset) {
|
||||
this->_udp = &udp;
|
||||
this->_timeOffset = timeOffset;
|
||||
}
|
||||
|
||||
NTPClient::NTPClient(UDP& udp, const char* poolServerName) {
|
||||
this->_udp = &udp;
|
||||
this->_poolServerName = poolServerName;
|
||||
}
|
||||
|
||||
NTPClient::NTPClient(UDP& udp, const char* poolServerName, int timeOffset) {
|
||||
this->_udp = &udp;
|
||||
this->_timeOffset = timeOffset;
|
||||
this->_poolServerName = poolServerName;
|
||||
}
|
||||
|
||||
NTPClient::NTPClient(UDP& udp, const char* poolServerName, int timeOffset, unsigned long updateInterval) {
|
||||
this->_udp = &udp;
|
||||
this->_timeOffset = timeOffset;
|
||||
this->_poolServerName = poolServerName;
|
||||
this->_updateInterval = updateInterval;
|
||||
}
|
||||
|
||||
void NTPClient::begin() {
|
||||
this->begin(NTP_DEFAULT_LOCAL_PORT);
|
||||
}
|
||||
|
||||
void NTPClient::begin(int port) {
|
||||
this->_port = port;
|
||||
|
||||
this->_udp->begin(this->_port);
|
||||
|
||||
this->_udpSetup = true;
|
||||
}
|
||||
|
||||
bool NTPClient::isValid(byte * ntpPacket)
|
||||
{
|
||||
//Perform a few validity checks on the packet
|
||||
if((ntpPacket[0] & 0b11000000) == 0b11000000) //Check for LI=UNSYNC
|
||||
return false;
|
||||
|
||||
if((ntpPacket[0] & 0b00111000) >> 3 < 0b100) //Check for Version >= 4
|
||||
return false;
|
||||
|
||||
if((ntpPacket[0] & 0b00000111) != 0b100) //Check for Mode == Server
|
||||
return false;
|
||||
|
||||
if((ntpPacket[1] < 1) || (ntpPacket[1] > 15)) //Check for valid Stratum
|
||||
return false;
|
||||
|
||||
if( ntpPacket[16] == 0 && ntpPacket[17] == 0 &&
|
||||
ntpPacket[18] == 0 && ntpPacket[19] == 0 &&
|
||||
ntpPacket[20] == 0 && ntpPacket[21] == 0 &&
|
||||
ntpPacket[22] == 0 && ntpPacket[22] == 0) //Check for ReferenceTimestamp != 0
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool NTPClient::forceUpdate() {
|
||||
#ifdef DEBUG_NTPClient
|
||||
Serial.println("Update from NTP Server");
|
||||
#endif
|
||||
// flush any existing packets
|
||||
while(this->_udp->parsePacket() != 0)
|
||||
this->_udp->flush();
|
||||
this->sendNTPPacket();
|
||||
|
||||
// Wait till data is there or timeout...
|
||||
byte timeout = 0;
|
||||
int cb = 0;
|
||||
do {
|
||||
delay ( 10 );
|
||||
cb = this->_udp->parsePacket();
|
||||
|
||||
if(cb > 0)
|
||||
{
|
||||
this->_udp->read(this->_packetBuffer, NTP_PACKET_SIZE);
|
||||
if(!this->isValid(this->_packetBuffer))
|
||||
cb = 0;
|
||||
}
|
||||
|
||||
if (timeout > 100) return false; // timeout after 1000 ms
|
||||
timeout++;
|
||||
} while (cb == 0);
|
||||
|
||||
this->_lastUpdate = millis() - (10 * (timeout + 1)); // Account for delay in reading the time
|
||||
|
||||
unsigned long highWord = word(this->_packetBuffer[40], this->_packetBuffer[41]);
|
||||
unsigned long lowWord = word(this->_packetBuffer[42], this->_packetBuffer[43]);
|
||||
// combine the four bytes (two words) into a long integer
|
||||
// this is NTP time (seconds since Jan 1 1900):
|
||||
unsigned long secsSince1900 = highWord << 16 | lowWord;
|
||||
|
||||
this->_currentEpoc = secsSince1900 - SEVENZYYEARS;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool NTPClient::update() {
|
||||
if ((millis() - this->_lastUpdate >= this->_updateInterval) // Update after _updateInterval
|
||||
|| this->_lastUpdate == 0) { // Update if there was no update yet.
|
||||
if (!this->_udpSetup) this->begin(); // setup the UDP client if needed
|
||||
return this->forceUpdate();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
unsigned long NTPClient::getEpochTime() {
|
||||
return this->_timeOffset + // User offset
|
||||
this->_currentEpoc + // Epoc returned by the NTP server
|
||||
((millis() - this->_lastUpdate) / 1000); // Time since last update
|
||||
}
|
||||
|
||||
int NTPClient::getDay() {
|
||||
return (((this->getEpochTime() / 86400L) + 4 ) % 7); //0 is Sunday
|
||||
}
|
||||
int NTPClient::getHours() {
|
||||
return ((this->getEpochTime() % 86400L) / 3600);
|
||||
}
|
||||
int NTPClient::getMinutes() {
|
||||
return ((this->getEpochTime() % 3600) / 60);
|
||||
}
|
||||
int NTPClient::getSeconds() {
|
||||
return (this->getEpochTime() % 60);
|
||||
}
|
||||
|
||||
String NTPClient::getFormattedTime(unsigned long secs) {
|
||||
unsigned long rawTime = secs ? secs : this->getEpochTime();
|
||||
unsigned long hours = (rawTime % 86400L) / 3600;
|
||||
String hoursStr = hours < 10 ? "0" + String(hours) : String(hours);
|
||||
|
||||
unsigned long minutes = (rawTime % 3600) / 60;
|
||||
String minuteStr = minutes < 10 ? "0" + String(minutes) : String(minutes);
|
||||
|
||||
unsigned long seconds = rawTime % 60;
|
||||
String secondStr = seconds < 10 ? "0" + String(seconds) : String(seconds);
|
||||
|
||||
return hoursStr + ":" + minuteStr + ":" + secondStr;
|
||||
}
|
||||
|
||||
// Based on https://github.com/PaulStoffregen/Time/blob/master/Time.cpp
|
||||
// currently assumes UTC timezone, instead of using this->_timeOffset
|
||||
String NTPClient::getFormattedDate(unsigned long secs) {
|
||||
unsigned long rawTime = (secs ? secs : this->getEpochTime()) / 86400L; // in days
|
||||
unsigned long days = 0, year = 1970;
|
||||
uint8_t month;
|
||||
static const uint8_t monthDays[]={31,28,31,30,31,30,31,31,30,31,30,31};
|
||||
|
||||
while((days += (LEAP_YEAR(year) ? 366 : 365)) <= rawTime)
|
||||
year++;
|
||||
rawTime -= days - (LEAP_YEAR(year) ? 366 : 365); // now it is days in this year, starting at 0
|
||||
days=0;
|
||||
for (month=0; month<12; month++) {
|
||||
uint8_t monthLength;
|
||||
if (month==1) { // february
|
||||
monthLength = LEAP_YEAR(year) ? 29 : 28;
|
||||
} else {
|
||||
monthLength = monthDays[month];
|
||||
}
|
||||
if (rawTime < monthLength) break;
|
||||
rawTime -= monthLength;
|
||||
}
|
||||
String monthStr = ++month < 10 ? "0" + String(month) : String(month); // jan is month 1
|
||||
String dayStr = ++rawTime < 10 ? "0" + String(rawTime) : String(rawTime); // day of month
|
||||
return String(year) + "-" + monthStr + "-" + dayStr + "T" + this->getFormattedTime(secs ? secs : 0) + "Z";
|
||||
}
|
||||
|
||||
void NTPClient::end() {
|
||||
this->_udp->stop();
|
||||
|
||||
this->_udpSetup = false;
|
||||
}
|
||||
|
||||
void NTPClient::setTimeOffset(int timeOffset) {
|
||||
this->_timeOffset = timeOffset;
|
||||
}
|
||||
|
||||
void NTPClient::setUpdateInterval(unsigned long updateInterval) {
|
||||
this->_updateInterval = updateInterval;
|
||||
}
|
||||
|
||||
void NTPClient::sendNTPPacket() {
|
||||
// set all bytes in the buffer to 0
|
||||
memset(this->_packetBuffer, 0, NTP_PACKET_SIZE);
|
||||
// Initialize values needed to form NTP request
|
||||
// (see URL above for details on the packets)
|
||||
this->_packetBuffer[0] = 0b11100011; // LI, Version, Mode
|
||||
this->_packetBuffer[1] = 0; // Stratum, or type of clock
|
||||
this->_packetBuffer[2] = 6; // Polling Interval
|
||||
this->_packetBuffer[3] = 0xEC; // Peer Clock Precision
|
||||
// 8 bytes of zero for Root Delay & Root Dispersion
|
||||
this->_packetBuffer[12] = 0x49;
|
||||
this->_packetBuffer[13] = 0x4E;
|
||||
this->_packetBuffer[14] = 0x49;
|
||||
this->_packetBuffer[15] = 0x52;
|
||||
|
||||
// all NTP fields have been given values, now
|
||||
// you can send a packet requesting a timestamp:
|
||||
this->_udp->beginPacket(this->_poolServerName, 123); //NTP requests are to port 123
|
||||
this->_udp->write(this->_packetBuffer, NTP_PACKET_SIZE);
|
||||
this->_udp->endPacket();
|
||||
}
|
||||
|
||||
void NTPClient::setEpochTime(unsigned long secs) {
|
||||
this->_currentEpoc = secs;
|
||||
}
|
105
lib/NTPClient-master/NTPClient.h
Normal file
105
lib/NTPClient-master/NTPClient.h
Normal file
|
@ -0,0 +1,105 @@
|
|||
#pragma once
|
||||
|
||||
#include "Arduino.h"
|
||||
|
||||
#include <Udp.h>
|
||||
|
||||
#define SEVENZYYEARS 2208988800UL
|
||||
#define NTP_PACKET_SIZE 48
|
||||
#define NTP_DEFAULT_LOCAL_PORT 1337
|
||||
#define LEAP_YEAR(Y) ( (Y>0) && !(Y%4) && ( (Y%100) || !(Y%400) ) )
|
||||
|
||||
|
||||
class NTPClient {
|
||||
private:
|
||||
UDP* _udp;
|
||||
bool _udpSetup = false;
|
||||
|
||||
const char* _poolServerName = "pool.ntp.org"; // Default time server
|
||||
int _port = NTP_DEFAULT_LOCAL_PORT;
|
||||
int _timeOffset = 0;
|
||||
|
||||
unsigned long _updateInterval = 60000; // In ms
|
||||
|
||||
unsigned long _currentEpoc = 0; // In s
|
||||
unsigned long _lastUpdate = 0; // In ms
|
||||
|
||||
byte _packetBuffer[NTP_PACKET_SIZE];
|
||||
|
||||
void sendNTPPacket();
|
||||
bool isValid(byte * ntpPacket);
|
||||
|
||||
public:
|
||||
NTPClient(UDP& udp);
|
||||
NTPClient(UDP& udp, int timeOffset);
|
||||
NTPClient(UDP& udp, const char* poolServerName);
|
||||
NTPClient(UDP& udp, const char* poolServerName, int timeOffset);
|
||||
NTPClient(UDP& udp, const char* poolServerName, int timeOffset, unsigned long updateInterval);
|
||||
|
||||
/**
|
||||
* Starts the underlying UDP client with the default local port
|
||||
*/
|
||||
void begin();
|
||||
|
||||
/**
|
||||
* Starts the underlying UDP client with the specified local port
|
||||
*/
|
||||
void begin(int port);
|
||||
|
||||
/**
|
||||
* This should be called in the main loop of your application. By default an update from the NTP Server is only
|
||||
* made every 60 seconds. This can be configured in the NTPClient constructor.
|
||||
*
|
||||
* @return true on success, false on failure
|
||||
*/
|
||||
bool update();
|
||||
|
||||
/**
|
||||
* This will force the update from the NTP Server.
|
||||
*
|
||||
* @return true on success, false on failure
|
||||
*/
|
||||
bool forceUpdate();
|
||||
|
||||
int getDay();
|
||||
int getHours();
|
||||
int getMinutes();
|
||||
int getSeconds();
|
||||
|
||||
/**
|
||||
* Changes the time offset. Useful for changing timezones dynamically
|
||||
*/
|
||||
void setTimeOffset(int timeOffset);
|
||||
|
||||
/**
|
||||
* Set the update interval to another frequency. E.g. useful when the
|
||||
* timeOffset should not be set in the constructor
|
||||
*/
|
||||
void setUpdateInterval(unsigned long updateInterval);
|
||||
|
||||
/**
|
||||
* @return secs argument (or 0 for current time) formatted like `hh:mm:ss`
|
||||
*/
|
||||
String getFormattedTime(unsigned long secs = 0);
|
||||
|
||||
/**
|
||||
* @return time in seconds since Jan. 1, 1970
|
||||
*/
|
||||
unsigned long getEpochTime();
|
||||
|
||||
/**
|
||||
* @return secs argument (or 0 for current date) formatted to ISO 8601
|
||||
* like `2004-02-12T15:19:21+00:00`
|
||||
*/
|
||||
String getFormattedDate(unsigned long secs = 0);
|
||||
|
||||
/**
|
||||
* Stops the underlying UDP client
|
||||
*/
|
||||
void end();
|
||||
|
||||
/**
|
||||
* Replace the NTP-fetched time with seconds since Jan. 1, 1970
|
||||
*/
|
||||
void setEpochTime(unsigned long secs);
|
||||
};
|
47
lib/NTPClient-master/README.md
Normal file
47
lib/NTPClient-master/README.md
Normal file
|
@ -0,0 +1,47 @@
|
|||
# NTPClient
|
||||
|
||||
[![Build Status](https://travis-ci.org/arduino-libraries/NTPClient.svg?branch=master)](https://travis-ci.org/arduino-libraries/NTPClient)
|
||||
|
||||
Connect to a NTP server, here is how:
|
||||
|
||||
```cpp
|
||||
#include <NTPClient.h>
|
||||
// change next line to use with another board/shield
|
||||
#include <ESP8266WiFi.h>
|
||||
//#include <WiFi.h> // for WiFi shield
|
||||
//#include <WiFi101.h> // for WiFi 101 shield or MKR1000
|
||||
#include <WiFiUdp.h>
|
||||
|
||||
const char *ssid = "<SSID>";
|
||||
const char *password = "<PASSWORD>";
|
||||
|
||||
WiFiUDP ntpUDP;
|
||||
|
||||
// By default 'pool.ntp.org' is used with 60 seconds update interval and
|
||||
// no offset
|
||||
NTPClient timeClient(ntpUDP);
|
||||
|
||||
// You can specify the time server pool and the offset, (in seconds)
|
||||
// additionaly you can specify the update interval (in milliseconds).
|
||||
// NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 3600, 60000);
|
||||
|
||||
void setup(){
|
||||
Serial.begin(115200);
|
||||
WiFi.begin(ssid, password);
|
||||
|
||||
while ( WiFi.status() != WL_CONNECTED ) {
|
||||
delay ( 500 );
|
||||
Serial.print ( "." );
|
||||
}
|
||||
|
||||
timeClient.begin();
|
||||
}
|
||||
|
||||
void loop() {
|
||||
timeClient.update();
|
||||
|
||||
Serial.println(timeClient.getFormattedTime());
|
||||
|
||||
delay(1000);
|
||||
}
|
||||
```
|
37
lib/NTPClient-master/examples/Advanced/Advanced.ino
Normal file
37
lib/NTPClient-master/examples/Advanced/Advanced.ino
Normal file
|
@ -0,0 +1,37 @@
|
|||
#include <NTPClient.h>
|
||||
// change next line to use with another board/shield
|
||||
#include <ESP8266WiFi.h>
|
||||
//#include <WiFi.h> // for WiFi shield
|
||||
//#include <WiFi101.h> // for WiFi 101 shield or MKR1000
|
||||
#include <WiFiUdp.h>
|
||||
|
||||
const char *ssid = "<SSID>";
|
||||
const char *password = "<PASSWORD>";
|
||||
|
||||
WiFiUDP ntpUDP;
|
||||
|
||||
// You can specify the time server pool and the offset (in seconds, can be
|
||||
// changed later with setTimeOffset() ). Additionaly you can specify the
|
||||
// update interval (in milliseconds, can be changed using setUpdateInterval() ).
|
||||
NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 3600, 60000);
|
||||
|
||||
void setup(){
|
||||
Serial.begin(115200);
|
||||
|
||||
WiFi.begin(ssid, password);
|
||||
|
||||
while ( WiFi.status() != WL_CONNECTED ) {
|
||||
delay ( 500 );
|
||||
Serial.print ( "." );
|
||||
}
|
||||
|
||||
timeClient.begin();
|
||||
}
|
||||
|
||||
void loop() {
|
||||
timeClient.update();
|
||||
|
||||
Serial.println(timeClient.getFormattedTime());
|
||||
|
||||
delay(1000);
|
||||
}
|
33
lib/NTPClient-master/examples/Basic/Basic.ino
Normal file
33
lib/NTPClient-master/examples/Basic/Basic.ino
Normal file
|
@ -0,0 +1,33 @@
|
|||
#include <NTPClient.h>
|
||||
// change next line to use with another board/shield
|
||||
#include <ESP8266WiFi.h>
|
||||
//#include <WiFi.h> // for WiFi shield
|
||||
//#include <WiFi101.h> // for WiFi 101 shield or MKR1000
|
||||
#include <WiFiUdp.h>
|
||||
|
||||
const char *ssid = "<SSID>";
|
||||
const char *password = "<PASSWORD>";
|
||||
|
||||
WiFiUDP ntpUDP;
|
||||
NTPClient timeClient(ntpUDP);
|
||||
|
||||
void setup(){
|
||||
Serial.begin(115200);
|
||||
|
||||
WiFi.begin(ssid, password);
|
||||
|
||||
while ( WiFi.status() != WL_CONNECTED ) {
|
||||
delay ( 500 );
|
||||
Serial.print ( "." );
|
||||
}
|
||||
|
||||
timeClient.begin();
|
||||
}
|
||||
|
||||
void loop() {
|
||||
timeClient.update();
|
||||
|
||||
Serial.println(timeClient.getFormattedTime());
|
||||
|
||||
delay(1000);
|
||||
}
|
20
lib/NTPClient-master/keywords.txt
Normal file
20
lib/NTPClient-master/keywords.txt
Normal file
|
@ -0,0 +1,20 @@
|
|||
#######################################
|
||||
# Datatypes (KEYWORD1)
|
||||
#######################################
|
||||
|
||||
NTPClient KEYWORD1
|
||||
|
||||
#######################################
|
||||
# Methods and Functions (KEYWORD2)
|
||||
#######################################
|
||||
|
||||
begin KEYWORD2
|
||||
end KEYWORD2
|
||||
update KEYWORD2
|
||||
forceUpdate KEYWORD2
|
||||
getDay KEYWORD2
|
||||
getHours KEYWORD2
|
||||
getMinutes KEYWORD2
|
||||
getSeconds KEYWORD2
|
||||
getFormattedTime KEYWORD2
|
||||
getEpochTime KEYWORD2
|
24
lib/NTPClient-master/library.json
Normal file
24
lib/NTPClient-master/library.json
Normal file
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"name": "NTPClient",
|
||||
"keywords": "ntp, client, time",
|
||||
"description": "A NTPClient to connect to a time server",
|
||||
"authors":
|
||||
[
|
||||
{
|
||||
"name": "Fabrice Weinberg",
|
||||
"email": "fabrice@weinberg.me"
|
||||
},
|
||||
{
|
||||
"name": "Sandeep Mistry",
|
||||
"email": "s.mistry@arduino.cc"
|
||||
}
|
||||
],
|
||||
"repository":
|
||||
{
|
||||
"type": "git",
|
||||
"url": "https://github.com/arduino-libraries/NTPClient.git"
|
||||
},
|
||||
"version": "3.1.0",
|
||||
"frameworks": "arduino",
|
||||
"platforms": "espressif"
|
||||
}
|
9
lib/NTPClient-master/library.properties
Normal file
9
lib/NTPClient-master/library.properties
Normal file
|
@ -0,0 +1,9 @@
|
|||
name=NTPClient
|
||||
version=3.1.0
|
||||
author=Fabrice Weinberg
|
||||
maintainer=Fabrice Weinberg <fabrice@weinberg.me>
|
||||
sentence=An NTPClient to connect to a time server
|
||||
paragraph=Get time from a NTP server and keep it in sync.
|
||||
category=Timing
|
||||
url=https://github.com/arduino-libraries/NTPClient
|
||||
architectures=*
|
46
lib/README
Normal file
46
lib/README
Normal file
|
@ -0,0 +1,46 @@
|
|||
|
||||
This directory is intended for project specific (private) libraries.
|
||||
PlatformIO will compile them to static libraries and link into executable file.
|
||||
|
||||
The source code of each library should be placed in a an own separate directory
|
||||
("lib/your_library_name/[here are source files]").
|
||||
|
||||
For example, see a structure of the following two libraries `Foo` and `Bar`:
|
||||
|
||||
|--lib
|
||||
| |
|
||||
| |--Bar
|
||||
| | |--docs
|
||||
| | |--examples
|
||||
| | |--src
|
||||
| | |- Bar.c
|
||||
| | |- Bar.h
|
||||
| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
|
||||
| |
|
||||
| |--Foo
|
||||
| | |- Foo.c
|
||||
| | |- Foo.h
|
||||
| |
|
||||
| |- README --> THIS FILE
|
||||
|
|
||||
|- platformio.ini
|
||||
|--src
|
||||
|- main.c
|
||||
|
||||
and a contents of `src/main.c`:
|
||||
```
|
||||
#include <Foo.h>
|
||||
#include <Bar.h>
|
||||
|
||||
int main (void)
|
||||
{
|
||||
...
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
PlatformIO Library Dependency Finder will find automatically dependent
|
||||
libraries scanning project source files.
|
||||
|
||||
More information about PlatformIO Library Dependency Finder
|
||||
- https://docs.platformio.org/page/librarymanager/ldf.html
|
55
mqtt-python
Normal file
55
mqtt-python
Normal file
|
@ -0,0 +1,55 @@
|
|||
import paho.mqtt.client as mqttClient
|
||||
from influxdb import InfluxDBClient
|
||||
import time
|
||||
|
||||
TOPIC = "test1"
|
||||
broker_address= "localhost"
|
||||
port = 1883
|
||||
database = "thermo-bibli"
|
||||
nom_client = "capteurs1"
|
||||
|
||||
def on_connect(client, userdata, flags, rc):
|
||||
print("Connected with result code "+str(rc))
|
||||
client.subscribe(TOPIC, 2)
|
||||
|
||||
def addData(database, time, numero_grappe, numero_capteur, temp, hum, batterie): # ajoute donnée à base de donnée influxDB
|
||||
client = InfluxDBClient(host='localhost', port=8086)
|
||||
client.create_database(database)
|
||||
client.switch_database(database)
|
||||
data = [
|
||||
{
|
||||
"measurement": numero_grappe,
|
||||
"tags": {"numero_capteur": numero_capteur},
|
||||
"time": time,
|
||||
"fields": {"temperature": temp, "humidite": hum, "batterie": batterie}
|
||||
|
||||
}
|
||||
]
|
||||
client.write_points(data)
|
||||
|
||||
def on_message(client, userdata, message):
|
||||
message = (message.payload).decode("utf-8") # convertit type bytes en string
|
||||
print("Message reçu")
|
||||
tab = message.split("|")
|
||||
temp = tab[2].split()
|
||||
hum = tab[3].split()
|
||||
batterie = tab[4]
|
||||
L = len(temp)
|
||||
for i in range(L):
|
||||
addData(database, tab[0], tab[1], "capteur" + str(i+1), temp[i], hum[i], batterie)
|
||||
|
||||
client = mqttClient.Client(nom_client, False)
|
||||
client.username_pw_set(username="capteurs",password="Fablab")
|
||||
client.on_connect= on_connect #callback
|
||||
client.on_message= on_message #callback
|
||||
client.connect(broker_address, port, 65535)
|
||||
client.loop_start()
|
||||
|
||||
try:
|
||||
while True:
|
||||
time.sleep(0.1)
|
||||
|
||||
except KeyboardInterrupt:
|
||||
print ("exiting")
|
||||
client.disconnect()
|
||||
client.loop_stop()
|
21
platformio.ini
Normal file
21
platformio.ini
Normal file
|
@ -0,0 +1,21 @@
|
|||
; PlatformIO Project Configuration File
|
||||
;
|
||||
; Build options: build flags, source filter
|
||||
; Upload options: custom upload port, speed and extra flags
|
||||
; Library options: dependencies, extra library storages
|
||||
; Advanced options: extra scripting
|
||||
;
|
||||
; Please visit documentation for the other options and examples
|
||||
; https://docs.platformio.org/page/projectconf.html
|
||||
|
||||
[env:esp32dev]
|
||||
platform = espressif32
|
||||
board = esp32dev
|
||||
framework = arduino
|
||||
lib_deps =
|
||||
adafruit/DHT sensor library@^1.4.2
|
||||
adafruit/Adafruit Unified Sensor@^1.1.4
|
||||
knolleary/PubSubClient@^2.8
|
||||
ottowinter/ESPAsyncWebServer-esphome@^1.2.7
|
||||
ottowinter/AsyncTCP-esphome@^1.2.1
|
||||
arduino-libraries/NTPClient@^3.1.0
|
159
src/main.cpp
Normal file
159
src/main.cpp
Normal file
|
@ -0,0 +1,159 @@
|
|||
#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);
|
||||
}
|
11
test/README
Normal file
11
test/README
Normal file
|
@ -0,0 +1,11 @@
|
|||
|
||||
This directory is intended for PlatformIO Unit Testing and project tests.
|
||||
|
||||
Unit Testing is a software testing method by which individual units of
|
||||
source code, sets of one or more MCU program modules together with associated
|
||||
control data, usage procedures, and operating procedures, are tested to
|
||||
determine whether they are fit for use. Unit testing finds problems early
|
||||
in the development cycle.
|
||||
|
||||
More information about PlatformIO Unit Testing:
|
||||
- https://docs.platformio.org/page/plus/unit-testing.html
|
Loading…
Reference in a new issue