28 Commits

Author SHA1 Message Date
23651cb6d5 fix diagramme 2023-05-14 23:26:16 +02:00
0037b1831a rm debug 2023-05-14 23:17:05 +02:00
7b21441976 fix some thing 2023-05-14 23:16:16 +02:00
650290ab67 fix readme iot 2023-05-14 22:26:32 +02:00
ef447b2dc7 fix link in readme 2023-05-14 22:25:15 +02:00
830d40a777 fix api 2023-05-14 11:04:47 +02:00
29e1c1b73a Merge pull request 'feat: gestion oled screen' (#48) from feat/oled-screen into master
Reviewed-on: Epitech-T-DEV-811/T-DEV-811#48
2023-05-14 09:16:31 +02:00
b9b6d71ba0 feat: commentaire for doc 2023-05-14 09:09:13 +02:00
b0c90360b8 feat: use oled screen lib 2023-05-14 09:06:08 +02:00
f2bd530d4e feat: add config and oled screen lib 2023-05-14 09:05:57 +02:00
d814d16733 feat: add oled screen lib 2023-05-14 09:05:23 +02:00
ddefd7e15f Merge remote-tracking branch 'origin/master' into feat/oled-screen 2023-05-13 13:00:15 +02:00
b62d0d74c6 Merge pull request 'feat: création classe abstraite capteur' (#44) from refactor/class-abstraite-capteur into master
Reviewed-on: Epitech-T-DEV-811/T-DEV-811#44
Reviewed-by: nico <nicolas.sansd@gmail.com>
Reviewed-by: 5OLE1L <mathis.ragot@epitech.eu>
2023-05-13 12:58:50 +02:00
79d5ecde9e docs: update class diagram 2023-05-09 17:06:20 +02:00
e4cf250092 fix typo 2023-05-09 16:58:19 +02:00
fa43f37279 fix typo 2 2023-05-09 16:55:58 +02:00
2708df56a6 fix typo 2023-05-09 16:55:37 +02:00
19b716aaf2 feat: full test ok 2023-05-09 12:01:20 +02:00
95aabd8903 fix: rm todo 2023-05-09 11:48:42 +02:00
a34b4acbc0 add 3eme poubelle id 2023-05-09 11:48:03 +02:00
3a45e8e9b5 feat: config cull to config 2023-05-09 11:32:51 +02:00
107ca935b8 add debug poids 2023-05-09 10:26:50 +02:00
922d6e85f0 change setCalibrationFact to tar 2023-05-02 22:12:28 +02:00
2b4e0fd9ea fix: rm todo 2023-05-02 22:12:06 +02:00
d69dc54f48 fix: indent 2023-05-02 22:11:53 +02:00
36dd744da5 add balance to main program 2023-05-02 22:01:20 +02:00
e939ee757d refactor: balance lib 2023-05-02 22:01:10 +02:00
2b318c00f9 fix: add api adresse 2023-05-02 22:00:51 +02:00
16 changed files with 313 additions and 111 deletions

View File

@ -3,4 +3,6 @@
## setup : ## setup :
rename `secrets.ini.example` to `secrets.ini` renomé `secrets.ini.example` to `secrets.ini` et le remplir
compiler avec Platform.io

View File

@ -14,6 +14,14 @@ build_flags =
-D MONITOR_SPEED=${config.monitor_speed} -D MONITOR_SPEED=${config.monitor_speed}
; DO NOT TOUCH --- END ; DO NOT TOUCH --- END
; taille ecran oled
; 3,3v
-D OLED_WIDTH=128
-D OLED_HEIGHT=64
; pin de reset de l'ecran oled
-D OLED_RESET=-1
; DHT pin and type ; DHT pin and type
; 5v ; 5v
-D DHTTYPE=\"DHT11\" -D DHTTYPE=\"DHT11\"
@ -25,14 +33,21 @@ build_flags =
-D ULTRA_SOUND_ECHO=13 -D ULTRA_SOUND_ECHO=13
; Capteur poids ; Capteur poids
; 3,3v
-D POID_DOUT=14 -D POID_DOUT=14
-D POID_SCK=15 -D POID_SCK=15
-D MOYENNE_CALIBRATION=20
; trash can ID ; trash can ID
-D TRASHCAN_ONE=\"gdnuxl0wlgurtj3\" -D TRASHCAN_ONE=\"gdnuxl0wlgurtj3\"
-D TRASHCAN_TWO=\"4brip5fwm001bs9\" -D TRASHCAN_TWO=\"4brip5fwm001bs9\"
-D TRASHCAN_THREE=\"n4il9ckl5016aqi\"
-D API_HOST=\"iot.epi.cb85.software\"
;---CAPTEUR FULL CONFIG---
;valFull/valReset
-D ULTRA_SOUND_FULL=\"5/10\"
;tempmin:tempmax/hummin:humax
-D DHT_FULL=\"20:30/60:80\"
;poid max
-D POID_FULL=\"100\"

View File

@ -18,7 +18,61 @@ Class Program {
+ setup() + setup()
} }
abstract Class Capteur {
# full: bool
# type: String
# fullVall: String
+ Capteur(type: String, fullVal: String)
+ {abstract} tar(val: int): bool
+ {abstract} read(): String = 0
+ isFull(): bool
+ getValType(): String
}
class Balance{
- capteur: HX711*
- initialized: bool
- calibrationFact: int
- initialVal: long
+ Balance(doutPin: int, sck: int, fullVal:String)
+ read(): String
+ initCalibration(): bool
+ calibration(poidsRef: int, moyenneCalibration: int): bool
+ tar(val: int = 0): bool
}
class HumiTemp{
- capteur: DHT*
+ HumiTemp(pin: int, type: String, fullVal: String)
+ read(): String
}
class Ultrason{
- capteur: Ultrasonic*
+ Ultrason(triguer: int, echo: int, fullVal: String)
+ read(): String
}
class OledScreen{
- display: Adafruit_SSD1306*
+ OledScreen(screenWidth: int, screenHeight: int, oledResetPin: int = -1)
+ welcome(): void
+ clear(): void
+ wifiWaiting(): void
+ printVal(distance: String, poid: String, humitemp: String): void
}
Balance --|> Capteur
Ultrason --|> Capteur
HumiTemp --|> Capteur
Program <-- Balance
Program <-- Ultrason
Program <-- HumiTemp
Program <- API
OledScreen -> Program
@enduml @enduml

View File

@ -10,6 +10,7 @@
#include "Ultrason.h" #include "Ultrason.h"
#include "HumiTemp.h" #include "HumiTemp.h"
#include "Balance.h" #include "Balance.h"
#include "OledScreen.h"
class Program{ class Program{
public: public:
@ -44,9 +45,13 @@ private:
* @brief capteur poid pour le niveau de remplissage de la poubelle * @brief capteur poid pour le niveau de remplissage de la poubelle
* *
*/ */
Balance *balance; Capteur *balance;
//TODO chagé type to capteur /**
* @brief OledScreen
*
*/
OledScreen* screen;
/** /**
* @brief Réference de l'API pour les calls * @brief Réference de l'API pour les calls

View File

@ -49,8 +49,6 @@ public:
*/ */
bool connect(); bool connect();
//TODO :: Check wifibegin avant
private: private:
@ -89,7 +87,11 @@ private:
*/ */
String token; String token;
/**
* @brief wifi démmaré
*
*/
bool init;
}; };

View File

@ -8,15 +8,16 @@ API::API(String user, String password, String host, bool https){
this->https = https; this->https = https;
this->token = ""; this->token = "";
this->client = new WiFiEspClient(); this->client = new WiFiEspClient();
this->init = false;
} }
bool API::wifiBegin(String wifiId, String wifiPass, Stream* espSerial){ bool API::wifiBegin(String wifiId, String wifiPass, Stream* espSerial){
WiFi.init(espSerial); WiFi.init(espSerial);
this->init = true;
// check for the presence of the shield // check for the presence of the shield
if (WiFi.status() == WL_NO_SHIELD) { if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi shield not present"); // FIXME: rm debug
return false; return false;
} }
@ -28,6 +29,7 @@ bool API::wifiBegin(String wifiId, String wifiPass, Stream* espSerial){
return true; return true;
} }
bool API::connect(){ bool API::connect(){
if(!this->init)return false;
this->client->stop(); this->client->stop();
bool sortie = false; bool sortie = false;
@ -119,6 +121,5 @@ bool API::sendValue(String val, String poubelleID, String valUnit, bool full){
this->client->println("Connection: close"); this->client->println("Connection: close");
this->client->println(); this->client->println();
this->token = "";//XXX: on rm le token a chaque fois car on sais pas si la requet a bien aboutie et donc si il y est encore bon
return true; return true;
} }

View File

@ -28,7 +28,7 @@ public:
/** /**
* @brief tare et scale a 0, et recuperation de la valeur brut du plateau * @brief tare et scale a 0, et recuperation de la valeur brut du plateau
*/ */
boolean initCalibration(); bool initCalibration();
/** /**
* @brief initialisation du calibrage * @brief initialisation du calibrage
@ -38,27 +38,28 @@ public:
* *
* @return renvoi un true si calibration bien effectue * @return renvoi un true si calibration bien effectue
*/ */
boolean calibration(int poidsRef,int moyenne_calibration); bool calibration(int poidsRef,int moyenne_calibration);
/** /**
* @brief Set the Calibration Fact object * @brief tar le capteur de poids
* *
* @param caliFact facteur de calibration calculer par calibration * @param[in] val valeur de référence du capteur
* @return true si la tarre a bien réussi (ou si il n'a pas besoins de tarre)
* @return false erreur durrant la tar
*/ */
void setCalibrationFact(int caliFact); bool tar(int val = 0);
//XXX: finir implémentation classe capteur
private: private:
/** /**
* @brief Variable issue de la librairie HX711 qui permet d'utiliser les fonctions de celle-ci * @brief Variable issue de la librairie HX711 qui permet d'utiliser les fonctions de celle-ci
*/ */
HX711 scale; HX711* capteur;
/** /**
* @brief true = calibration et false = erreur * @brief true = calibration et false = erreur
*/ */
boolean initialized; bool initialized;
/** /**
* @brief Facteur de calibration obtenu par : (val brute poids ref - val brute poids plexiglas)/ poids ref * @brief Facteur de calibration obtenu par : (val brute poids ref - val brute poids plexiglas)/ poids ref

View File

@ -1,20 +1,23 @@
#include "../include/Balance.h" #include "../include/Balance.h"
Balance::Balance(int doutPin, int sckPin) { Balance::Balance(int doutPin, int sckPin, String fullVall):
Capteur("W", fullVall){
scale.begin(doutPin, sckPin); this->capteur = new HX711();
this->capteur->begin(doutPin, sckPin);
this->initialized = false; this->initialized = false;
scale.set_scale(); this->capteur->set_scale();
scale.tare(); this->capteur->tare();
this->initialVal = 0; this->initialVal = 0;
this->calibrationFact = 0; this->calibrationFact = 0;
this->initCalibration();
} }
boolean Balance::initCalibration() { boolean Balance::initCalibration() {
scale.set_scale(); this->capteur->set_scale();
scale.tare(); this->capteur->tare();
this->initialVal = scale.read_average(20); this->initialVal = this->capteur->read_average(20);
return true; return true;
} }
@ -23,11 +26,11 @@ boolean Balance::calibration(int poidsRef,int moyenne_calibration) {
int rawValref = 0; // Valeur brute de plexiglas et poids réf int rawValref = 0; // Valeur brute de plexiglas et poids réf
int tempPoids = 0; // C'est la valeur du poids en grammes calculée grâce au facteur de calibration int tempPoids = 0; // C'est la valeur du poids en grammes calculée grâce au facteur de calibration
rawValref = scale.read_average(moyenne_calibration); rawValref = this->capteur->read_average(moyenne_calibration);
this->calibrationFact = (rawValref - this->initialVal) / poidsRef; this->calibrationFact = (rawValref - this->initialVal) / poidsRef;
do { do {
scale.set_scale(calibrationFact); this->capteur->set_scale(calibrationFact);
tempPoids = scale.get_units(5); tempPoids = this->capteur->get_units(5);
if (tempPoids < poidsRef) { if (tempPoids < poidsRef) {
calibrationFact -= 1; calibrationFact -= 1;
} else if (tempPoids > poidsRef) { } else if (tempPoids > poidsRef) {
@ -37,26 +40,19 @@ boolean Balance::calibration(int poidsRef,int moyenne_calibration) {
return initialized = true; return initialized = true;
} }
double Balance::getAverage(int nbMesure) { String Balance::read() {
int sortie = (int)this->capteur->get_units();
if (initialized == true) { this->full = sortie > this->fullVall.toInt();
return scale.get_units(nbMesure); if (this->initialized == true) {
return String(sortie);
} else { } else {
return 0; return "0";
} }
} }
double Balance::getValue() { bool Balance::tar(int val){
if (initialized == true) {
return scale.get_units();
} else {
return 0;
}
}
void Balance::setCalibrationFact(int caliFact){
this->initialized = true; this->initialized = true;
this->calibrationFact = caliFact; this->calibrationFact = val;
scale.set_scale(caliFact); this->capteur->set_scale(val);
return this->initialized;
} }

View File

@ -11,8 +11,16 @@ String HumiTemp::read(){
int hum = this->capteur->readHumidity(true); int hum = this->capteur->readHumidity(true);
int temp = this->capteur->readTemperature(false,true); int temp = this->capteur->readTemperature(false,true);
String stemp = this->fullVall.substring(0, this->fullVall.indexOf("/"));
String shum = this->fullVall.substring(this->fullVall.indexOf("/")+1, this->fullVall.length());
int mintemp = stemp.substring(0, stemp.indexOf(":")).toInt();
int maxtemp = stemp.substring(stemp.indexOf(":")+1, stemp.length()).toInt();
int minhum = shum.substring(0, shum.indexOf(":")).toInt();
int maxhum = shum.substring(shum.indexOf(":")+1, shum.length()).toInt();
//valeur pour un élevage d'astico de pèche selon chatGPT //valeur pour un élevage d'astico de pèche selon chatGPT
if((temp > 20 && temp < 30) && (hum > 60 && hum < 80)){//TODO: passer les valeurs en config if((temp > mintemp && temp < maxtemp) && (hum > minhum && hum < maxhum)){
this->full = true; this->full = true;
}else{ }else{
this->full = false; this->full = false;

View File

@ -9,11 +9,11 @@ Ultrason::Ultrason(int trigeur, int echo, String fullVall):
String Ultrason::read(){ String Ultrason::read(){
int sortie = this->capteur->read(); int sortie = this->capteur->read();
if (sortie < this->fullVall.toInt()) if (sortie < this->fullVall.substring(0, this->fullVall.indexOf("/")).toInt())
{ {
this->full = true; this->full = true;
}else{ }else if (sortie > this->fullVall.substring(this->fullVall.indexOf("/")+1, this->fullVall.length()).toInt()){
this->full = false; this->full = false;
} }
return String(sortie); return String(sortie);
}//TODO: faire en sorte que full se reset avec une autre val }

View File

@ -0,0 +1,52 @@
#ifndef OLED_SCREEN_H
#define OLED_SCREEN_H
#include <Adafruit_SSD1306.h>
class OledScreen {
public:
/**
* @brief Construct a new Oled Screen object
*
* @param screenWidth The width of the screen
* @param screenHeight The height of the screen
* @param oledResetPin The pin used to reset the screen (default: -1)
*/
OledScreen(int screenWidth, int screenHeight, int oledResetPin = -1);
/**
* @brief display welcome screen
*/
void welcome();
/**
* @brief Clear the screen
*/
void clear();
/**
* @brief messsage for wifi waiting
*
*/
void wifiWaiting();
/**
* @brief show the sensor value
*
* @param distance length value
* @param poid weith value
* @param humitemp humidity and temperature value
*/
void printVal(String distance, String poid, String humitemp);
private:
Adafruit_SSD1306* display;
};
#endif

View File

@ -0,0 +1,56 @@
#include "../include/OledScreen.h"
OledScreen::OledScreen(int screenWidth, int screenHeight, int oledResetPin) {
this->display = new Adafruit_SSD1306(screenWidth, screenHeight, &Wire, oledResetPin);
if (!display->begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;); // Don't proceed, loop forever
}
this->display->clearDisplay();
}
void OledScreen::welcome() {
this->display->clearDisplay();
this->display->setCursor(0, 0);
this->display->setTextSize(2);
this->display->setTextColor(WHITE);
this->display->println(F("\nBienvenue!"));
this->display->display();
}
void OledScreen::printVal(String distance, String poid, String humitemp){
this->display->clearDisplay();
this->display->setCursor(0, 0);
this->display->setTextSize(2);
this->display->setTextColor(WHITE);
this->display->print(F("Dist:"));
this->display->print(distance);
this->display->println();
this->display->print(F("Poids:"));
this->display->print(poid);
this->display->println();
this->display->print(F("humi:"));
this->display->print(humitemp.substring(0,humitemp.indexOf("/")));
this->display->println();
this->display->print(F("temp:"));
this->display->print(humitemp.substring(humitemp.indexOf("/")+1,humitemp.length()));
this->display->println();
this->display->display();
}
void OledScreen::wifiWaiting() {
this->clear();
this->display->setCursor(0, 0);
this->display->setTextSize(2);
this->display->setTextColor(WHITE);
this->display->println(F("Connection\n"));
this->display->println(F(" WiFi...\n"));
this->display->println();
this->display->display();
}
void OledScreen::clear() {
this->display->clearDisplay();
}

View File

@ -42,6 +42,7 @@ lib_deps =
adafruit/Adafruit Unified Sensor@^1.1.9 ; adafruit sensor lib (required by DHT11) adafruit/Adafruit Unified Sensor@^1.1.9 ; adafruit sensor lib (required by DHT11)
ericksimoes/Ultrasonic@^3.0.0 ; lib capteur ultra son ericksimoes/Ultrasonic@^3.0.0 ; lib capteur ultra son
bogde/HX711@0.7.5 ; lib pour la balance bogde/HX711@0.7.5 ; lib pour la balance
adafruit/Adafruit SSD1306@^2.5.7 ; librairie pour l'ecran oled
; example: ; example:
; erropix/ESP32 AnalogWrite@^0.2 ; erropix/ESP32 AnalogWrite@^0.2

View File

@ -6,32 +6,43 @@ Program::Program(){
Serial1.begin(MONITOR_SPEED); Serial1.begin(MONITOR_SPEED);
Serial.begin(MONITOR_SPEED); Serial.begin(MONITOR_SPEED);
//////Oled Screen/////
this->screen = new OledScreen(OLED_WIDTH, OLED_HEIGHT, OLED_RESET);
this->screen->wifiWaiting();
////////API/////// ////////API///////
this->api = new API(USER_NAME, USER_PASSWORD, API_HOST); this->api = new API(USER_NAME, USER_PASSWORD, API_HOST);
//this->api->wifiBegin(WIFI_SSID, WIFI_PASSWORD, &Serial1); this->api->wifiBegin(WIFI_SSID, WIFI_PASSWORD, &Serial1);
//////CAPTEUR///// //////CAPTEUR/////
this->ultrasonic = new Ultrason(ULTRA_SOUND_TRIGD, ULTRA_SOUND_ECHO, "10");//TODO: mettre la valeur en config this->ultrasonic = new Ultrason(ULTRA_SOUND_TRIGD, ULTRA_SOUND_ECHO, ULTRA_SOUND_FULL);
this->dht = new HumiTemp(DHTPIN, DHTTYPE, "20:30/60:80");//TODO: mettre la valeur en config this->dht = new HumiTemp(DHTPIN, DHTTYPE, DHT_FULL);
this->balance = new Balance(POID_DOUT,POID_SCK, POID_FULL);
this->balance->tar(1077);
//TODO: init balance this->screen->clear();
//calibration factor : 1077
} }
void Program::loop(){ void Program::loop(){
String distance = this->ultrasonic->read(); String distance = this->ultrasonic->read();
String humitemp = this->dht->read(); String humitemp = this->dht->read();
String poid = this->balance->read();
//this->api->sendValue(distance, TRASHCAN_ONE, this->ultrasonic->getValType(), this->ultrasonic->isFull());
Serial.print("Distance in CM = " + distance); this->screen->printVal(distance, poid, humitemp);
this->api->sendValue(distance, TRASHCAN_ONE, this->ultrasonic->getValType(), this->ultrasonic->isFull());
Serial.println(this->ultrasonic->isFull()?" true":" false"); Serial.println(this->ultrasonic->isFull()?" true":" false");
//this->api->sendValue(humitemp, TRASHCAN_TWO, this->dht->getValType(), this->dht->isFull()); Serial.println("humiTemp = " + humitemp);
Serial.print("humiTemp = " + this->dht->read()); this->api->sendValue(humitemp, TRASHCAN_TWO, this->dht->getValType(), this->dht->isFull());
Serial.println(this->dht->isFull()?" true":" false"); Serial.println(this->dht->isFull()?" true":" false");
//TODO: Lire balance Serial.println("poid = " + poid);
this->api->sendValue(poid, TRASHCAN_THREE, this->balance->getValType(), this->balance->isFull());
Serial.println(this->balance->isFull()?" true":" false");
Serial.println();
delay(1000);
} }

View File

@ -1,12 +1,10 @@
# Depot IOT VR # Depot IOT VR
Lien du Gitea : (depot principale + gestion de projet) Lien du Gitea : (depot principale + gestion de projet)
https://gitea.cb85.software/Epitech-T-DEV-811/T-DEV-811 https://git.lab-ouest.org/Epitech-T-DEV-811/T-DEV-811
Lien de la CAO : https://cad.onshape.com/documents/d370ee863400195afb23d026/w/1a94981b6a6f71d70b075e30/e/d0feb75fc5a122c54598349b?renderMode=0&uiState=6422993bab4d903a51186392 Lien de la CAO : https://cad.onshape.com/documents/d370ee863400195afb23d026/w/1a94981b6a6f71d70b075e30/e/d0feb75fc5a122c54598349b?renderMode=0&uiState=6422993bab4d903a51186392
### Mobile/Unity ### Mobile/Unity
Pour gérer l'AR, nous avons décider d'utiliser Unity et pour résoudre le souci de multi target en AR, nous avons utilisé Vuforia. Pour gérer l'AR, nous avons décider d'utiliser Unity et pour résoudre le souci de multi target en AR, nous avons utilisé Vuforia.
@ -21,7 +19,7 @@ coté IoT, les valeurs de chaque capteurs sont envoyé à l'API puis ensuite, l'
le champ 'unit' dans la collection trash correspond au type de capteur que l'IoT va envoyer a l'api. Le mapping suivant a été conventionner: le champ 'unit' dans la collection trash correspond au type de capteur que l'IoT va envoyer a l'api. Le mapping suivant a été conventionner:
| Capteur | Unit | Valeur | | Capteur | Unit | Valeur |
|----------------------|:----:|--------------------------------------| | -------------------- |:----:| ------------------------------------ |
| Temperature/Humidité | T/H | 10.0;50 (10 degré et 50% d'humidité) | | Temperature/Humidité | T/H | 10.0;50 (10 degré et 50% d'humidité) |
| Poids | W | 200 (200 gram) | | Poids | W | 200 (200 gram) |
| Distance | D | 40 (40 cm) | | Distance | D | 40 (40 cm) |