Outils pour utilisateurs

Outils du site


projets:2019:stagefevrierubo

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
Dernière révisionLes deux révisions suivantes
projets:2019:stagefevrierubo [2019/02/13 20:17] christian.jacolotprojets:2019:stagefevrierubo [2019/02/20 14:33] christian.jacolot
Ligne 127: Ligne 127:
 $ ./install.sh  $ ./install.sh 
 $ cd $ cd
 +# démarrer arduino IDE
 +# menu Outils / Gérer les bibliothèques
 +# installer: circuit playground, unified sensor, DHT sensor library
 $ sudo npm install -g --unsafe-perm node-red $ sudo npm install -g --unsafe-perm node-red
 $ node-red $ node-red
Ligne 144: Ligne 147:
 $ sudo apt install fritzing fritzing-parts gimp $ sudo apt install fritzing fritzing-parts gimp
  
 +</code>
 +
 +
 +=== Présentation ===
 +
 +== Documents ==
 +
 +Fichier de présentation
 +{{ :projets:2019:mdl_stage_lph_fevrier_2019.odp |}}
 +
 +
 +=== Code ===
 +
 +Code Arduino pour piloter le relai tout en récupérant la température et l'humidité:
 +<code>
 +
 +int relayPin = 3;                           // relay pin -- Digital 3
 +int relayState = HIGH;                      
 +
 +int incomingByte = 0;   // for incoming serial data
 +
 +unsigned long previousMillis = 0;  
 +
 +long checkDHT = 2000;
 +
 +void setup() {
 +  Serial.begin(9600); 
 +  pinMode(relayPin, OUTPUT);
 +  digitalWrite(relayPin, relayState);
 +  previousMillis = millis();
 +}
 +
 +void loop() {
 +  // send data only when you receive data:
 +  if (Serial.available() > 0) {
 +    // read the incoming byte:
 +    incomingByte = Serial.read();
 +//    Serial.print("I received: ");
 +//    Serial.println(incomingByte, DEC);    
 +    if (incomingByte == 49) { // ASCII: 1 => 49
 +      relayState = HIGH;
 +    } else {
 +      relayState = LOW;
 +    }
 +  }
 +  unsigned long currentMillis = millis();
 +  if (currentMillis - previousMillis >= checkDHT) {
 +    previousMillis = currentMillis;  // Remember the time
 +    Serial.print("{\"hum\":");
 +    Serial.print(random(20,80));
 +    Serial.print(",\"temp\":");
 +    Serial.print(random(0,50));
 +    Serial.println("}");
 +  }
 +  // set the relay: 
 +  digitalWrite(relayPin, relayState);
 +}
 +</code>
 +
 +Nodered flow:
 +{{ :projets:2019:mdl_stage_nodered_capteur_relai.png?400 |}} 
 +
 +
 +Avec servo moteur
 +<code>
 +#include <VarSpeedServo.h> 
 +#include <ArduinoJson.h>
 +
 +VarSpeedServo myservo;    // create servo object to control a servo 
 +// twelve servo objects can be created on most boards
 +
 +int pos = 0;    // variable to store the servo position
 +int positionServo = 0;
 +int speedServo = 100;
 +
 +// Serial reading buffer
 +const byte numChars = 60;
 +char receivedChars[numChars];   // an array to store the received data
 +boolean newData = false;
 +
 +StaticJsonBuffer<120> jsonBuffer;
 +
 +void recvWithEndMarker() {
 +    static byte ndx = 0;
 +    char endMarker = '\n';
 +    char rc;
 +   
 +    while (Serial.available() > 0 && newData == false) {
 +        rc = Serial.read();
 +
 +        if (rc != endMarker) {
 +            receivedChars[ndx] = rc;
 +            ndx++;
 +            if (ndx >= numChars) {
 +                ndx = numChars - 1;
 +            }
 +        }
 +        else {
 +            receivedChars[ndx] = '\0'; // terminate the string
 +            ndx = 0;
 +            newData = true;
 +        }
 +    }
 +}
 +
 +
 +void setup() {
 +  pinMode(9, OUTPUT);
 +  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
 +  Serial.begin(9600);
 +  // myservo.write(positionServo, speedServo, true);
 +  newData = false;
 +}
 +
 +void loop() {
 +  recvWithEndMarker();
 +  if (newData == true) {
 +    JsonObject& root = jsonBuffer.parseObject(receivedChars);
 +
 +    if (!root.success()) {
 +      Serial.println("parseObject() failed");
 +      return;
 +    }
 +
 +    // Fetch values.
 +    //
 +    // Most of the time, you can rely on the implicit casts.
 +    // In other case, you can do root["time"].as<long>();
 +    if(root.containsKey("servo")) {
 +      positionServo = root["servo"][0];
 +      speedServo = root["servo"][1];
 +
 +      // Print values.
 +      Serial.println(positionServo);
 +      Serial.println(speedServo);
 +      // myservo.write(positionServo, speedServo); //, true);        // move to 180 degrees, use a speed of 30, wait until move is complete
 +    } else {
 +      Serial.println("parseObject() servo key not found");      
 +    }
 +  
 +  newData = false;
 +  }  
 +}
 +</code>
 +
 +
 +Arduino: Programme complet (JSON, relai, ventilo, LDR, DHT11, servo-moteur):
 +<code>
 +#include <VarSpeedServo.h> 
 +#include <ArduinoJson.h>
 +#include "DHT.h"
 +
 +#define LDRPIN 0
 +#define DHTPIN 2     // Digital pin connected to the DHT sensor
 +#define VENTILOPIN 7
 +#define RELAIPIN 8
 +#define SERVOPIN 9
 +
 +#define DHTTYPE DHT11   // DHT 11
 +DHT dht(DHTPIN, DHTTYPE);
 +VarSpeedServo myservo;
 +
 +unsigned long time;
 +unsigned long diff;
 +int ldrValue = 0;
 +
 +int relayState = LOW;
 +int ventiloState = LOW;
 +
 +int positionServo = 0;
 +int speedServo = 100;
 +
 +long checkDHT = 2000;
 +
 +// Serial reading buffer
 +const byte numChars = 60;
 +char receivedChars[numChars];   // an array to store the received data
 +boolean newData = false;
 +
 +void recvWithEndMarker() {
 +    static byte ndx = 0;
 +    char endMarker = '\n';
 +    char rc;
 +   
 +    while (Serial.available() > 0 && newData == false) {
 +        rc = Serial.read();
 +
 +        if (rc != endMarker) {
 +            receivedChars[ndx] = rc;
 +            ndx++;
 +            if (ndx >= numChars) {
 +                ndx = numChars - 1;
 +            }
 +        }
 +        else {
 +            receivedChars[ndx] = '\0'; // terminate the string
 +            ndx = 0;
 +            newData = true;
 +        }
 +    }
 +}
 +
 +
 +void setup() {
 +  pinMode(VENTILOPIN, OUTPUT);
 +  pinMode(RELAIPIN, OUTPUT); // relai, broche en mode sortie
 +  pinMode(SERVOPIN, OUTPUT);
 +
 +  time = millis();
 +  dht.begin();
 +  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
 +  Serial.begin(9600);
 +  newData = false;
 +}
 +
 +void loop() {
 +  StaticJsonBuffer<120> jsonBuffer;
 +  recvWithEndMarker();
 +  if (newData == true) {
 +    JsonObject& root = jsonBuffer.parseObject(receivedChars);
 +
 +    if (!root.success()) {
 +      Serial.println("parseObject() failed");
 +      receivedChars[0] = '\0';
 +      return;
 +    }
 +    if(root.containsKey("servo")) {
 +      positionServo = root["servo"][0];
 +      speedServo = root["servo"][1];
 +      myservo.write(positionServo, speedServo, true);
 +    }
 +    
 +    if (root.containsKey("ventilo")) {
 +      int ventiloValue = root["ventilo"];
 +      if (ventiloValue == 1) {
 +        ventiloState = HIGH;
 +      } else {
 +        ventiloState = LOW;
 +      }            
 +    }
 +    
 +    if (root.containsKey("relai")) {
 +      int relaiValue = root["relai"];
 +      if (relaiValue == 1) {
 +        relayState = HIGH;
 +      } else {
 +        relayState = LOW;
 +      }
 +    } else {
 +      Serial.println("parseObject() servo key not found");
 +    }
 +  
 +  newData = false;
 +  }
 +  diff = millis() - time;
 +  if (diff >= checkDHT) {
 +    time = millis();
 +    float h = dht.readHumidity();
 +    float t = dht.readTemperature();
 +    // read the value from the sensor:
 +    ldrValue = analogRead(LDRPIN);
 +
 +    Serial.print("{\"hum\":");
 +    Serial.print(h);
 +    Serial.print(",\"temp\":");
 +    Serial.print(t);
 +    Serial.print(",\"ldr\":");
 +    Serial.print(ldrValue);
 +    Serial.println("}");
 +  } 
 +  // set the relay: 
 +  digitalWrite(RELAIPIN, relayState);
 +
 +  // set the ventilo: 
 +  digitalWrite(VENTILOPIN, ventiloState);
 +}
 +</code>
 +
 +
 +Nodered flow
 +<code>
 +[{"id":"3d2aea77.badaf6","type":"tab","label":"Flow 2","disabled":false,"info":""},{"id":"3f949c8b.e9662c","type":"serial in","z":"3d2aea77.badaf6","name":"Arduino liaison série","serial":"7934b4c5.a4c6ac","x":118.50001525878906,"y":105,"wires":[["58f6c8f2.f84108","ee8168db.c30cd8"]]},{"id":"58f6c8f2.f84108","type":"debug","z":"3d2aea77.badaf6","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":708.5,"y":70,"wires":[]},{"id":"ee8168db.c30cd8","type":"json","z":"3d2aea77.badaf6","name":"","property":"payload","action":"","pretty":false,"x":108.49998474121094,"y":204,"wires":[["47a6359d.a05d6c","ad8bab3b.6151e"]]},{"id":"47a6359d.a05d6c","type":"debug","z":"3d2aea77.badaf6","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":709.5,"y":162,"wires":[]},{"id":"ad8bab3b.6151e","type":"function","z":"3d2aea77.badaf6","name":"Récupérer Humidity","func":"msg.payload = msg.payload.hum;\nreturn msg;","outputs":1,"noerr":0,"x":156.50001525878906,"y":291,"wires":[["49353fa9.b11378","5aa63008.6e225"]]},{"id":"49353fa9.b11378","type":"ui_chart","z":"3d2aea77.badaf6","name":"","group":"6236518f.ee41e8","order":1,"width":0,"height":0,"label":"Humidité","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":"10","removeOlderPoints":"","removeOlderUnit":"60","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":798.5,"y":274.9999694824219,"wires":[[],[]]},{"id":"5aa63008.6e225","type":"switch","z":"3d2aea77.badaf6","name":"Humidité >= 60","property":"payload.state","propertyType":"msg","rules":[{"t":"gte","v":"60","vt":"num"},{"t":"lt","v":"60","vt":"num"}],"checkall":"true","repair":false,"outputs":2,"x":147.83338928222656,"y":384.333251953125,"wires":[["13b76f6c.0304c9"],["2c7f8898.6e7d38"]]},{"id":"3a206f96.153a9","type":"ui_button","z":"3d2aea77.badaf6","name":"","group":"6236518f.ee41e8","order":3,"width":0,"height":0,"passthru":true,"label":"Arrêter le ventilo","tooltip":"","color":"","bgcolor":"","icon":"","payload":"2","payloadType":"str","topic":"","x":512.8333740234375,"y":646.3333740234375,"wires":[[]]},{"id":"902a3c34.bdb6d","type":"serial out","z":"3d2aea77.badaf6","name":"Arduino sortie","serial":"7934b4c5.a4c6ac","x":822.833251953125,"y":400.16668701171875,"wires":[]},{"id":"e06793a6.3b1558","type":"ui_switch","z":"3d2aea77.badaf6","name":"","label":"Automatique","tooltip":"","group":"6236518f.ee41e8","order":4,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","x":328.8333740234375,"y":531.3333740234375,"wires":[["77a8e113.0544f"]]},{"id":"77a8e113.0544f","type":"switch","z":"3d2aea77.badaf6","name":"","property":"payload","propertyType":"msg","rules":[{"t":"true"},{"t":"false"}],"checkall":"true","repair":false,"outputs":2,"x":551.8333740234375,"y":552.3333740234375,"wires":[[],[]]},{"id":"13b76f6c.0304c9","type":"function","z":"3d2aea77.badaf6","name":"Démarrer ventilo","func":"msg.payload = \"{\\\"ventilo\\\":1}\\n\"\nreturn msg;","outputs":1,"noerr":0,"x":371.8333740234375,"y":355.66668701171875,"wires":[["902a3c34.bdb6d"]]},{"id":"2c7f8898.6e7d38","type":"function","z":"3d2aea77.badaf6","name":"Arrêter ventilo","func":"msg.payload = \"{\\\"ventilo\\\":0}\\n\"\nreturn msg;","outputs":1,"noerr":0,"x":347.2833251953125,"y":437.73333740234375,"wires":[["902a3c34.bdb6d"]]},{"id":"7934b4c5.a4c6ac","type":"serial-port","z":"","serialport":"/dev/ttyUSB0","serialbaud":"9600","databits":"8","parity":"none","stopbits":"1","newline":"\\n","bin":"false","out":"char","addchar":true,"responsetimeout":"10000"},{"id":"6236518f.ee41e8","type":"ui_group","z":"","name":"Chambre","tab":"ad170f6e.de74f8","disp":true,"width":"6","collapse":false},{"id":"ad170f6e.de74f8","type":"ui_tab","z":"","name":"Home","icon":"dashboard","disabled":false,"hidden":false}]
 </code> </code>
  
projets/2019/stagefevrierubo.txt · Dernière modification : 2022/09/04 21:04 de 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki