26 Commits

Author SHA1 Message Date
ef9040ffed Merge pull request 'fix: RM-all-todo' (#49) from fix-RM-all-todo into master
Reviewed-on: Epitech-T-DEV-811/T-DEV-811#49
2023-05-14 23:26:53 +02:00
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
16 changed files with 294 additions and 86 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,13 +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
; 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\" -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:
@ -46,6 +47,12 @@ private:
*/ */
Capteur *balance; Capteur *balance;
/**
* @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,16 +38,17 @@ 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:
/** /**
@ -58,7 +59,7 @@ private:
/** /**
* @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

@ -7,59 +7,59 @@ class Capteur{
public: public:
/** /**
* @brief Construct a new Capteur object * @brief Construct a new Capteur object
* *
* @param[in] type type de mesure lue (T/H, W, D,...) * @param[in] type type de mesure lue (T/H, W, D,...)
* @param[in] fullVal valeur a la quel la poubelle est considéré comme pleine * @param[in] fullVal valeur a la quel la poubelle est considéré comme pleine
*/ */
Capteur(String type, String fullVal); Capteur(String type, String fullVal);
/** /**
* @brief tar le capteur si il a besoins d'être tarré * @brief tar le capteur si il a besoins d'être tarré
* *
* @param[in] val *opt* si le capteur a besoins d'une valeur de ref pour être tarré * @param[in] val *opt* si le capteur a besoins d'une valeur de ref pour être tarré
* @return true si la tarre a bien réussi (ou si il n'a pas besoins de tarre) * @return true si la tarre a bien réussi (ou si il n'a pas besoins de tarre)
* @return false erreur durrant la tar * @return false erreur durrant la tar
*/ */
virtual bool tar(int val = 0); virtual bool tar(int val = 0);
/** /**
* @brief lit la valeur du capteur * @brief lit la valeur du capteur
* *
* @return String retour la valeur * @return String retour la valeur
*/ */
virtual String read() = 0; virtual String read() = 0;
/** /**
* @brief revoie la valeur full * @brief revoie la valeur full
* *
* @return true la poubelle est pleine * @return true la poubelle est pleine
* @return false la poubelle n'est pas pleine * @return false la poubelle n'est pas pleine
*/ */
bool isFull(); bool isFull();
String getValType(); String getValType();
protected: protected:
/** /**
* @brief la poubelle est pleinne * @brief la poubelle est pleinne
* est mis a jours par read() * est mis a jours par read()
*/ */
bool full; bool full;
/** /**
* @brief type de mesure lue (T/H, W, D,...) * @brief type de mesure lue (T/H, W, D,...)
* *
*/ */
String type; String type;
/** /**
* @brief valeur a la quel la poubelle est considéré comme pleine * @brief valeur a la quel la poubelle est considéré comme pleine
* *
*/ */
String fullVall; String fullVall;
}; };

View File

@ -41,16 +41,18 @@ boolean Balance::calibration(int poidsRef,int moyenne_calibration) {
} }
String Balance::read() { String Balance::read() {
int sortie = (int)this->capteur->get_units();
this->full = sortie > this->fullVall.toInt();
if (this->initialized == true) { if (this->initialized == true) {
return String(this->capteur->get_units()); return String(sortie);
} else { } else {
return "0"; return "0";
} }
} }
void Balance::setCalibrationFact(int caliFact){ bool Balance::tar(int val){
this->initialized = true; this->initialized = true;
this->calibrationFact = caliFact; this->calibrationFact = val;
this->capteur->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,35 +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,"500");//TODO: mettre la valter en donfig this->balance = new Balance(POID_DOUT,POID_SCK, POID_FULL);
this->balance->tar(1077); this->balance->tar(1077);
this->screen->clear();
} }
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(); String poid = this->balance->read();
this->screen->printVal(distance, poid, humitemp);
//this->api->sendValue(distance, TRASHCAN_ONE, this->ultrasonic->getValType(), this->ultrasonic->isFull()); this->api->sendValue(distance, TRASHCAN_ONE, this->ultrasonic->getValType(), this->ultrasonic->isFull());
Serial.print("Distance in CM = " + distance);
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_TWO, this->balance->getValType(), this->balance->isFull()); this->api->sendValue(poid, TRASHCAN_THREE, this->balance->getValType(), this->balance->isFull());
Serial.print("humiTemp = " + this->dht->read()); Serial.println(this->balance->isFull()?" true":" false");
Serial.println(this->dht->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) |