Ligne 64 : | Ligne 64 : | ||
'''Composants:''' | '''Composants:''' | ||
+ | |||
+ | - arduino UNO | ||
- 20 cables M/M | - 20 cables M/M | ||
- 10 cables M/F | - 10 cables M/F | ||
+ | |||
+ | - 2 [https://www.gotronic.fr/art-servomoteur-df9gms-19377.htm servomoteur DF9GMS] | ||
- 1 plaque de prototypage | - 1 plaque de prototypage | ||
Ligne 100 : | Ligne 104 : | ||
{{Tuto Step | {{Tuto Step | ||
|Step_Title=<translate>Cablage</translate> | |Step_Title=<translate>Cablage</translate> | ||
+ | |Step_Content=<translate>A partir du plan de cablage fourni à l'étape 1, il nous faut rajouter | ||
+ | |||
+ | - relier 1 Wago 5 entrée au premier Wago ou se rejoignent les alimentations des composants | ||
+ | |||
+ | - relier 1 Wago 5 entrées au premier Wago ou se rejoignent les GND des differents composants. | ||
+ | |||
+ | - relier 1 Wago 3 entrées à la broche SDL de la carte Arduino | ||
+ | |||
+ | - relier 1 Wago 3 entrées à la broche SDA de la carte Arduino | ||
+ | |||
+ | |||
+ | - Sur les Wago 5 entrées, brancher les VCC et GND des servomoteurs et du CSS811. | ||
+ | |||
+ | - Sur les bornes restantes des Wago 3 entrées, brancher les SDA et SCL du CSS811 et du BME 280. | ||
+ | |||
+ | |||
+ | |||
+ | <br /></translate> | ||
+ | }} | ||
+ | {{Tuto Step | ||
+ | |Step_Title=<translate>Code</translate> | ||
+ | |Step_Content=<translate><syntaxhighlight lang="arduino" line="1"> | ||
+ | // librairies pour le BME | ||
+ | #include <BME280I2C.h> | ||
+ | #include "DFRobot_CCS811.h" | ||
+ | #include <Wire.h> | ||
+ | #include "ssd1306.h" | ||
+ | #include "FastLED.h" | ||
+ | #include "DFRobot_CCS811.h" | ||
+ | #include <Servo.h> | ||
+ | //ici le nombre total de leds | ||
+ | #define NUM_LEDS 12 | ||
+ | // ici la pin pour les leds | ||
+ | #define DATA_PIN 6 | ||
+ | // déclaration d'un tableau pour les leds | ||
+ | CRGB leds[NUM_LEDS]; | ||
+ | DFRobot_CCS811 CCS811; | ||
+ | Servo ServoCO2; | ||
+ | Servo ServoTVOC; | ||
+ | |||
+ | const int POTAR = A0; // broche du potar | ||
+ | const int LED = 9; // broche de la LED | ||
+ | int valPOTAR = 0; //RAZ valeur | ||
+ | |||
+ | int angle=120; | ||
+ | int angle2=0; | ||
+ | |||
+ | BME280I2C::Settings settings( | ||
+ | BME280::OSR_X1, | ||
+ | BME280::OSR_X1, | ||
+ | BME280::OSR_X1, | ||
+ | BME280::Mode_Forced, | ||
+ | BME280::StandbyTime_1000ms, | ||
+ | BME280::Filter_Off, | ||
+ | BME280::SpiEnable_False, | ||
+ | 0x77 // I2C address. I2C specific. | ||
+ | ); | ||
+ | |||
+ | BME280I2C bme(settings); | ||
+ | |||
+ | /* Ces tableaux de caractères serviront UNIQUEMENT pour l'affichage à l'écran. | ||
+ | * Il faudra afficher ces variables et non les "floats" déclarées pour le capteur, | ||
+ | * l'écran ne reconnaissant que des chaînes de caractère | ||
+ | */ | ||
+ | |||
+ | char tempC[9]; | ||
+ | char humC[10]; | ||
+ | char presC[11]; | ||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | Serial.begin(9600); | ||
+ | ServoCO2.attach(5); | ||
+ | ServoTVOC.attach(3); | ||
+ | |||
+ | // on vérifie que le capteur COE2/TVOC est branché | ||
+ | while(CCS811.begin() != 0){ | ||
+ | Serial.println("failed to init chip, please check if the chip connection is fine"); | ||
+ | delay(1000); | ||
+ | } | ||
+ | |||
+ | // déclaration entrée et sortie de Potar et LED. Lecture en enregistrement dans la variable valPOTAR de la valeur analog du Potar | ||
+ | |||
+ | pinMode(POTAR, INPUT); | ||
+ | pinMode (LED, OUTPUT); | ||
+ | valPOTAR = analogRead (POTAR); | ||
+ | |||
+ | // tout ce blabla sert uniquement à vérifier si un capteur est présent et bien branché | ||
+ | |||
+ | while(!Serial) {} // Wait | ||
+ | |||
+ | Wire.begin(); | ||
+ | |||
+ | while(!bme.begin()) | ||
+ | { | ||
+ | Serial.println("Could not find BME280 sensor!"); | ||
+ | delay(1000); | ||
+ | } | ||
+ | |||
+ | // bme.chipID(); // Deprecated. See chipModel(). | ||
+ | switch(bme.chipModel()) | ||
+ | { | ||
+ | case BME280::ChipModel_BME280: | ||
+ | Serial.println("Found BME280 sensor! Success."); | ||
+ | break; | ||
+ | case BME280::ChipModel_BMP280: | ||
+ | Serial.println("Found BMP280 sensor! No Humidity available."); | ||
+ | break; | ||
+ | default: | ||
+ | Serial.println("Found UNKNOWN sensor! Error!"); | ||
+ | } | ||
+ | |||
+ | // on lance l'écran et on le colore de noir | ||
+ | |||
+ | ssd1306_128x64_i2c_init(); | ||
+ | ssd1306_fillScreen(0x00); | ||
+ | // on lance la typo | ||
+ | ssd1306_setFixedFont(ssd1306xled_font6x8); | ||
+ | |||
+ | FastLED.addLeds<WS2811, DATA_PIN, GRB>(leds, NUM_LEDS); | ||
+ | // on peut régler ici la luminosité : 0-255 | ||
+ | LEDS.setBrightness(50); | ||
+ | |||
+ | } | ||
+ | |||
+ | void loop() | ||
+ | |||
+ | { | ||
+ | |||
+ | analogRead (A0); | ||
+ | valPOTAR = analogRead (POTAR); | ||
+ | analogWrite (9, valPOTAR/4); | ||
+ | // On déclare 3 variables : température, humidité, pression | ||
+ | float temp(NAN), hum(NAN), pres(NAN); | ||
+ | |||
+ | if(CCS811.checkDataReady() == true){ | ||
+ | Serial.print("CO2: "); | ||
+ | Serial.print(CCS811.getCO2PPM()); | ||
+ | Serial.print("ppm, TVOC: "); | ||
+ | Serial.print(CCS811.getTVOCPPB()); | ||
+ | Serial.println("ppb"); | ||
+ | delay(1000); | ||
+ | |||
+ | } else { | ||
+ | Serial.println("Data is not ready!"); | ||
+ | } | ||
+ | |||
+ | |||
+ | // Déclenchement du capteur | ||
+ | BME280::TempUnit tempUnit(BME280::TempUnit_Celsius); | ||
+ | BME280::PresUnit presUnit(BME280::PresUnit_hPa); | ||
+ | bme.read(pres, temp, hum, tempUnit, presUnit); | ||
+ | |||
+ | // ces lignes servent à convertir les valeurs "float" du capteur en "char" destinées à l'écran | ||
+ | // (utile uniquement pour votre code final) | ||
+ | dtostrf (temp,5,1,tempC); | ||
+ | dtostrf (hum,5,1,humC); | ||
+ | dtostrf (pres,5,2,presC); | ||
+ | |||
+ | // on imprime les valeurs sur le moniteur série | ||
+ | |||
+ | if(CCS811.checkDataReady() == true){ | ||
+ | Serial.print("CO2: "); | ||
+ | Serial.print(CCS811.getCO2PPM()); | ||
+ | Serial.print("ppm, TVOC: "); | ||
+ | Serial.print(CCS811.getTVOCPPB()); | ||
+ | Serial.println("ppb"); | ||
+ | |||
+ | } else { | ||
+ | Serial.println("Data is not ready!"); | ||
+ | } | ||
+ | /*! | ||
+ | * @brief Set baseline | ||
+ | * @param get from getBaseline.ino | ||
+ | */ | ||
+ | CCS811.writeBaseLine(0x447B); | ||
+ | //delay cannot be less than measurement cycle | ||
+ | delay(1000); | ||
+ | |||
+ | // Première ligne, normal | ||
+ | |||
+ | ssd1306_printFixed (0, 8, "Temp:", STYLE_NORMAL); | ||
+ | ssd1306_printFixed(56, 8, tempC , STYLE_BOLD); | ||
+ | ssd1306_printFixed (96, 8, "C", STYLE_NORMAL); | ||
+ | ssd1306_printFixed(0, 16,"RH: ", STYLE_NORMAL); | ||
+ | ssd1306_printFixed(56, 16, humC , STYLE_BOLD); | ||
+ | ssd1306_printFixed(96, 16,"%", STYLE_NORMAL); | ||
+ | ssd1306_printFixed(0, 24, "Pres: ", STYLE_NORMAL); | ||
+ | ssd1306_printFixed(56, 24, presC , STYLE_BOLD); | ||
+ | ssd1306_printFixed(96, 24, "hPa" , STYLE_NORMAL); | ||
+ | |||
+ | |||
+ | |||
+ | int CO2; | ||
+ | CO2 = map (CCS811.getCO2PPM(),400,6000,0, 120); | ||
+ | |||
+ | for (int position=angle; position < CO2 ; position++) { | ||
+ | ServoCO2.write(position); | ||
+ | Serial.println(position); | ||
+ | angle = position; | ||
+ | delay(20); | ||
+ | } | ||
+ | for (int position=angle ; position > CO2 ; position--) { | ||
+ | ServoCO2.write(position); | ||
+ | Serial.println(position); | ||
+ | angle = position; | ||
+ | delay(20); | ||
+ | } | ||
+ | |||
+ | int TVOC; | ||
+ | TVOC = map (CCS811.getTVOCPPB(),8000,0,0, 120); | ||
+ | |||
+ | for (int position=angle2; position < TVOC ; position++) { | ||
+ | ServoTVOC.write(position); | ||
+ | Serial.println(position); | ||
+ | angle2 = position; | ||
+ | delay(20); | ||
+ | } | ||
+ | for (int position=angle2 ; position > TVOC ; position--) { | ||
+ | ServoTVOC.write(position); | ||
+ | Serial.println(position); | ||
+ | angle2 = position; | ||
+ | delay(20); | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | if (hum > 40 && hum <50) | ||
+ | { | ||
+ | //Allumage rotatif des Leds 0 à 5 en bleu suivant valeur de délais | ||
+ | |||
+ | for( int i = 0; i < 12; i++){ | ||
+ | leds[i] = CRGB::Green; | ||
+ | FastLED.show(); | ||
+ | delay (60); | ||
+ | } | ||
+ | for( int i = 0; i < 12; i++){ | ||
+ | leds[i] = CRGB::Black; | ||
+ | FastLED.show(); | ||
+ | delay (20); | ||
+ | } | ||
+ | } | ||
+ | else { | ||
+ | //Allumage rotatif des Leds 6 à 11 en rouge suivant valeur de délais | ||
+ | for( int i = 0; i < 12; i++){ | ||
+ | leds[i] = CRGB::Red; | ||
+ | FastLED.show(); | ||
+ | delay (20); | ||
+ | } | ||
+ | } | ||
+ | // Extinction rotative des 12 Led suivant valeur de délais | ||
+ | for( int i = 0; i < 12; i++){ | ||
+ | leds[i] = CRGB::Black; | ||
+ | FastLED.show(); | ||
+ | delay (10); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | </syntaxhighlight></translate> | ||
+ | }} | ||
+ | {{Tuto Step | ||
+ | |Step_Title=<translate>Support décoratif en bois</translate> | ||
|Step_Content=<translate></translate> | |Step_Content=<translate></translate> | ||
}} | }} | ||
{{Tuto Step | {{Tuto Step | ||
− | |Step_Title=<translate></translate> | + | |Step_Title=<translate>Impression 3D</translate> |
− | |Step_Content=<translate></translate> | + | |Step_Content=<translate>-Impression 3D de supports de servomoteur. STL récupéré sur Thingiverse. |
+ | |||
+ | - Impression 3D d'un dessin perso de bouton de potentiometre</translate> | ||
}} | }} | ||
{{Notes | {{Notes |
Auteur Hank | Dernière modification 16/06/2022 par Hank
Bentolux_-_Module_qualit_de_l_air_ambiant_286847934_3101104260128966_13912533824333898_n.jpg Fabrication
Mp4
Outils
- Fer à souder
- Pince coupante
- Pince à dénuder
- Multimètre
- Colle cyanoacrylate
- Cintreuse
- Scie japonaise
- Ciseaux
Matériaux:
- Etain
- Un carrelet de méranti blanc
- Un carrelet d'acajou
- Une plaque d'isorel
Composants:
- arduino UNO
- 20 cables M/M
- 10 cables M/F
- 1 plaque de prototypage
- 1 potentionmetre
- 1 Led Blanche
- 1 Afficheur OLED 0,96'' I2C TF052
- 1 Anneau NeoPixel 12 leds RGB ADA1643
- 1 capteur pression/temp/hum BME280
- 1 Capteur de qualité d'air CCS811 SEN0339
- 4 Wago 5 entrées
- 2 Wago 3 entrées
A partir du plan de cablage fourni à l'étape 1, il nous faut rajouter
- relier 1 Wago 5 entrée au premier Wago ou se rejoignent les alimentations des composants
- relier 1 Wago 5 entrées au premier Wago ou se rejoignent les GND des differents composants.
- relier 1 Wago 3 entrées à la broche SDL de la carte Arduino
- relier 1 Wago 3 entrées à la broche SDA de la carte Arduino
- Sur les Wago 5 entrées, brancher les VCC et GND des servomoteurs et du CSS811.
- Sur les bornes restantes des Wago 3 entrées, brancher les SDA et SCL du CSS811 et du BME 280.
1 // librairies pour le BME
2 #include <BME280I2C.h>
3 #include "DFRobot_CCS811.h"
4 #include <Wire.h>
5 #include "ssd1306.h"
6 #include "FastLED.h"
7 #include "DFRobot_CCS811.h"
8 #include <Servo.h>
9 //ici le nombre total de leds
10 #define NUM_LEDS 12
11 // ici la pin pour les leds
12 #define DATA_PIN 6
13 // déclaration d'un tableau pour les leds
14 CRGB leds[NUM_LEDS];
15 DFRobot_CCS811 CCS811;
16 Servo ServoCO2;
17 Servo ServoTVOC;
18
19 const int POTAR = A0; // broche du potar
20 const int LED = 9; // broche de la LED
21 int valPOTAR = 0; //RAZ valeur
22
23 int angle=120;
24 int angle2=0;
25
26 BME280I2C::Settings settings(
27 BME280::OSR_X1,
28 BME280::OSR_X1,
29 BME280::OSR_X1,
30 BME280::Mode_Forced,
31 BME280::StandbyTime_1000ms,
32 BME280::Filter_Off,
33 BME280::SpiEnable_False,
34 0x77 // I2C address. I2C specific.
35 );
36
37 BME280I2C bme(settings);
38
39 /* Ces tableaux de caractères serviront UNIQUEMENT pour l'affichage à l'écran.
40 * Il faudra afficher ces variables et non les "floats" déclarées pour le capteur,
41 * l'écran ne reconnaissant que des chaînes de caractère
42 */
43
44 char tempC[9];
45 char humC[10];
46 char presC[11];
47
48 void setup()
49 {
50 Serial.begin(9600);
51 ServoCO2.attach(5);
52 ServoTVOC.attach(3);
53
54 // on vérifie que le capteur COE2/TVOC est branché
55 while(CCS811.begin() != 0){
56 Serial.println("failed to init chip, please check if the chip connection is fine");
57 delay(1000);
58 }
59
60 // déclaration entrée et sortie de Potar et LED. Lecture en enregistrement dans la variable valPOTAR de la valeur analog du Potar
61
62 pinMode(POTAR, INPUT);
63 pinMode (LED, OUTPUT);
64 valPOTAR = analogRead (POTAR);
65
66 // tout ce blabla sert uniquement à vérifier si un capteur est présent et bien branché
67
68 while(!Serial) {} // Wait
69
70 Wire.begin();
71
72 while(!bme.begin())
73 {
74 Serial.println("Could not find BME280 sensor!");
75 delay(1000);
76 }
77
78 // bme.chipID(); // Deprecated. See chipModel().
79 switch(bme.chipModel())
80 {
81 case BME280::ChipModel_BME280:
82 Serial.println("Found BME280 sensor! Success.");
83 break;
84 case BME280::ChipModel_BMP280:
85 Serial.println("Found BMP280 sensor! No Humidity available.");
86 break;
87 default:
88 Serial.println("Found UNKNOWN sensor! Error!");
89 }
90
91 // on lance l'écran et on le colore de noir
92
93 ssd1306_128x64_i2c_init();
94 ssd1306_fillScreen(0x00);
95 // on lance la typo
96 ssd1306_setFixedFont(ssd1306xled_font6x8);
97
98 FastLED.addLeds<WS2811, DATA_PIN, GRB>(leds, NUM_LEDS);
99 // on peut régler ici la luminosité : 0-255
100 LEDS.setBrightness(50);
101
102 }
103
104 void loop()
105
106 {
107
108 analogRead (A0);
109 valPOTAR = analogRead (POTAR);
110 analogWrite (9, valPOTAR/4);
111 // On déclare 3 variables : température, humidité, pression
112 float temp(NAN), hum(NAN), pres(NAN);
113
114 if(CCS811.checkDataReady() == true){
115 Serial.print("CO2: ");
116 Serial.print(CCS811.getCO2PPM());
117 Serial.print("ppm, TVOC: ");
118 Serial.print(CCS811.getTVOCPPB());
119 Serial.println("ppb");
120 delay(1000);
121
122 } else {
123 Serial.println("Data is not ready!");
124 }
125
126
127 // Déclenchement du capteur
128 BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
129 BME280::PresUnit presUnit(BME280::PresUnit_hPa);
130 bme.read(pres, temp, hum, tempUnit, presUnit);
131
132 // ces lignes servent à convertir les valeurs "float" du capteur en "char" destinées à l'écran
133 // (utile uniquement pour votre code final)
134 dtostrf (temp,5,1,tempC);
135 dtostrf (hum,5,1,humC);
136 dtostrf (pres,5,2,presC);
137
138 // on imprime les valeurs sur le moniteur série
139
140 if(CCS811.checkDataReady() == true){
141 Serial.print("CO2: ");
142 Serial.print(CCS811.getCO2PPM());
143 Serial.print("ppm, TVOC: ");
144 Serial.print(CCS811.getTVOCPPB());
145 Serial.println("ppb");
146
147 } else {
148 Serial.println("Data is not ready!");
149 }
150 /*!
151 * @brief Set baseline
152 * @param get from getBaseline.ino
153 */
154 CCS811.writeBaseLine(0x447B);
155 //delay cannot be less than measurement cycle
156 delay(1000);
157
158 // Première ligne, normal
159
160 ssd1306_printFixed (0, 8, "Temp:", STYLE_NORMAL);
161 ssd1306_printFixed(56, 8, tempC , STYLE_BOLD);
162 ssd1306_printFixed (96, 8, "C", STYLE_NORMAL);
163 ssd1306_printFixed(0, 16,"RH: ", STYLE_NORMAL);
164 ssd1306_printFixed(56, 16, humC , STYLE_BOLD);
165 ssd1306_printFixed(96, 16,"%", STYLE_NORMAL);
166 ssd1306_printFixed(0, 24, "Pres: ", STYLE_NORMAL);
167 ssd1306_printFixed(56, 24, presC , STYLE_BOLD);
168 ssd1306_printFixed(96, 24, "hPa" , STYLE_NORMAL);
169
170
171
172 int CO2;
173 CO2 = map (CCS811.getCO2PPM(),400,6000,0, 120);
174
175 for (int position=angle; position < CO2 ; position++) {
176 ServoCO2.write(position);
177 Serial.println(position);
178 angle = position;
179 delay(20);
180 }
181 for (int position=angle ; position > CO2 ; position--) {
182 ServoCO2.write(position);
183 Serial.println(position);
184 angle = position;
185 delay(20);
186 }
187
188 int TVOC;
189 TVOC = map (CCS811.getTVOCPPB(),8000,0,0, 120);
190
191 for (int position=angle2; position < TVOC ; position++) {
192 ServoTVOC.write(position);
193 Serial.println(position);
194 angle2 = position;
195 delay(20);
196 }
197 for (int position=angle2 ; position > TVOC ; position--) {
198 ServoTVOC.write(position);
199 Serial.println(position);
200 angle2 = position;
201 delay(20);
202 }
203
204
205
206 if (hum > 40 && hum <50)
207 {
208 //Allumage rotatif des Leds 0 à 5 en bleu suivant valeur de délais
209
210 for( int i = 0; i < 12; i++){
211 leds[i] = CRGB::Green;
212 FastLED.show();
213 delay (60);
214 }
215 for( int i = 0; i < 12; i++){
216 leds[i] = CRGB::Black;
217 FastLED.show();
218 delay (20);
219 }
220 }
221 else {
222 //Allumage rotatif des Leds 6 à 11 en rouge suivant valeur de délais
223 for( int i = 0; i < 12; i++){
224 leds[i] = CRGB::Red;
225 FastLED.show();
226 delay (20);
227 }
228 }
229 // Extinction rotative des 12 Led suivant valeur de délais
230 for( int i = 0; i < 12; i++){
231 leds[i] = CRGB::Black;
232 FastLED.show();
233 delay (10);
234 }
235 }
-Impression 3D de supports de servomoteur. STL récupéré sur Thingiverse.
- Impression 3D d'un dessin perso de bouton de potentiometre
fr none 0 Published
Vous avez entré un nom de page invalide, avec un ou plusieurs caractères suivants :
< > @ ~ : * € £ ` + = / \ | [ ] { } ; ? #