--- title: FabLab ressource tags: arduino, fablab robots: noindex, nofollow author: Julien Noyer --- # Workshop Arduino ![](https://i.imgur.com/u7dIrJu.jpg) "Arduino, et son synonyme Genuino2, est une marque qui couvre des cartes électroniques matériellement libres sur lesquelles se trouve un microcontrôleur (d'architecture Atmel AVR comme l'Atmega328p, et d'architecture ARM comme le Cortex-M3 pour l'Arduino Due). Les schémas de ces cartes électroniques sont publiés en licence libre. Cependant, certaines composantes, comme le microcontrôleur par exemple, ne sont pas sous licence libre." ## Ressource - [Site Arduino](https://www.arduino.cc) - [Arduino The Documentary (2010)](https://www.youtube.com/watch?v=kQXeMCLJtwQ) - [Tinkercad](https://www.tinkercad.com) - [Ampoule centenaire](https://fr.wikipedia.org/wiki/Ampoule_centenaire) - [Johnny Five](http://johnny-five.io) - [Platformio](https://platformio.org) - [Package ESP8266](http://arduino.esp8266.com/stable/package_esp8266com_index.json) ## Montages - [Sans Arduino](https://www.tinkercad.com/things/esQ89yHd6Vp-copy-of-led-flasher-ne555/editel?sharecode=iZEgpDBjYQ8P20pxUGx2l4JRvEz1FRvTpppyQ9R7Qfw=) ## Code ### Led + Button ``` /* This program blinks pin 13 of the Arduino (the built-in LED) */ int redLed = 12; int button = 2; void setup() { pinMode(button, INPUT); pinMode(redLed, OUTPUT); } void loop() { // turn the LED on (HIGH is the voltage level) digitalWrite(redLed, digitalRead(button)); delay(100); // Wait for 100 millisecond(s) } ``` ``` int redLed = 12; int button = 2; bool prevState = false; void setup() { pinMode(button, INPUT); pinMode(redLed, OUTPUT); } void loop() { if( prevState == false && digitalRead(button) == 1 ){ digitalWrite(redLed, HIGH); prevState = true; } else if(prevState == true && digitalRead(button) == 1){ digitalWrite(redLed, LOW); prevState = false; } delay(100); } ``` ## Wemos Web site ```java /* Import des bibliothèques */ #include <ESP8266WiFi.h> #include <ESP8266WebServer.h> /**/ /* Déclaration */ /* Server */ ESP8266WebServer server; /* Réseeau */ char* ssid = "ADE-WIFI-ETUDIANTS"; char* password = "wifi@ade2018"; /* Composant */ int led = D7; bool prevState = false; /**/ /* Routes */ char homePage[] PROGMEM = R"=====( <h1>Hello Wemos</h1> <button id="btn">Toggle LED</button> <script> document.addEventListener("DOMContentLoaded", () => { document.querySelector("#btn").addEventListener("click", () => { fetch("/api/toggle") .then( response => response.json() ) .then( state => console.log(state) ) .catch( err => console.error(err) ); }) }) </script> )====="; /**/ /* Fonction IHM */ void toggleLedState(){ if( prevState == false ){ digitalWrite( led, HIGH ); } else{ digitalWrite( led, LOW ); } /* Inversion de l'état de la LED */ prevState = !prevState; /* Récupération de la valeur */ String led_state = digitalRead(led) ? "on" : "off"; /* Renvoyer la valeur dans la réponse du serveur */ server.send(200, "application/json", "{ \"msg\": \"" + led_state + "\" }"); } /**/ void setup() { /* Composant */ pinMode( led, OUTPUT ); Serial.begin(9600); Serial.println("Setup"); /* Définition de la carte comme client */ WiFi.mode(WIFI_STA); /* Connexion de la carte au WIFI */ WiFi.begin( ssid, password ); while(WiFi.status()!=WL_CONNECTED){ digitalWrite( led, HIGH ); Serial.print("."); delay(500); } digitalWrite( led, LOW ); Serial.println(""); Serial.print("IP Address: "); Serial.println(WiFi.localIP()); /* Autoriser lees connexions externes */ server.sendHeader("Access-Control-Allow-Origin", "*"); /* Définition des routes */ server.on("/",[](){ server.send_P(200,"text/html", homePage); }); server.on("/api/toggle", toggleLedState); /* Lancer le serveur */ server.begin(); } void loop() { server.handleClient(); } ``` ## Wemos MQTT ```c /* Projet d'apprentissage d'un objet connecté (IoT) pour réaliser une sonde de température ESP8266 + DHT22 + LED + MQTT + Home-Assistant Projets DIY (https://www.projetsdiy.fr) - Mai 2016 Licence : MIT */ #include <ESP8266WiFi.h> #include <PubSubClient.h> #define wifi_ssid "ADE-WIFI-ETUDIANTS" #define wifi_password "wifi@ade2018" #define mqtt_server "10.6.72.225" #define mqtt_user "guest" // s'il a été configuré sur Mosquitto #define mqtt_password "guest" // idem #define status_topic "m1dev/julien/etat" //Topic état de la lumière #define switch_topic "m1dev/julien/commande" #define LIGHT_PIN D5t #define NOM_CLIENT "julien" bool debug = true; //Affiche sur la console si True //Buffer qui permet de décoder les messages MQTT reçus char message_buff[100]; long lastMsg = 0; //Horodatage du dernier message publié sur MQTT long lastRecu = 0; bool light_status = false; bool initial = true; WiFiClient espClient; PubSubClient client(espClient); void setup() { pinMode(LIGHT_PIN, OUTPUT); //Pin 2 digitalWrite(LIGHT_PIN, HIGH); if (debug) { Serial.begin(9600); //Facultatif pour le debug } setup_wifi(); //On se connecte au réseau wifi // client.setServer(WiFi.gatewayIP(), 1883); //Configuration de la connexion au serveur MQTT client.setServer(mqtt_server, 1883); //Configuration de la connexion au serveur MQTT client.setCallback(callback); //La fonction de callback qui est executée à chaque réception de message } //Connexion au réseau WiFi void setup_wifi() { delay(10); if (debug) { Serial.println(); Serial.print("Connexion a "); Serial.println(wifi_ssid); Serial.println(WiFi.macAddress()); } WiFi.begin(wifi_ssid, wifi_password); while (WiFi.status() != WL_CONNECTED) { delay(500); if (debug) { Serial.print("."); } } if (debug) { Serial.println(""); Serial.println("Connexion WiFi etablie : " + String(wifi_ssid)); Serial.print("=> Addresse IP : " ); Serial.println(WiFi.localIP()); Serial.print("=> Addresse MAC : "); Serial.println(WiFi.macAddress()); Serial.println("..."); } } //Reconnexion void reconnect() { //Boucle jusqu'à obtenur une reconnexion while (!client.connected()) { if (debug) { Serial.println("Connexion au serveur MQTT..."); } // if (client.connect(String(WiFi.macAddress()).c_str())) { // if (client.connect(String("WeMos:"+WiFi.macAddress()).c_str(), mqtt_user, mqtt_password)) { if (client.connect(NOM_CLIENT, mqtt_user, mqtt_password)) { if (debug) { Serial.println("SUCCESS"); } } else { if (debug) { Serial.println("ERROR : " + String(client.state())); Serial.println("Nouvel essai dans 5 secondes"); Serial.println("..."); } delay(5000); } } } void loop() { if (!client.connected()) { reconnect(); } client.loop(); if (initial) { publish_status(light_status); initial = false; } long now = millis(); //Envoi d'un message par minute if (now - lastMsg > 1000 * 60) { lastMsg = now; if ( debug ) { Serial.print("Commande : "); Serial.println(light_status ? "on" : "off"); } } if (now - lastRecu > 100 ) { lastRecu = now; client.subscribe(switch_topic); } } void publish_status (bool status) { if (status) { client.publish(status_topic, String("on").c_str(), true); //Publie l'état de la lampe ON } else { client.publish(status_topic, String("off").c_str(), true); //Publie l'état de la lampe OFF } if ( debug ) { Serial.print("Commande : "); Serial.println(status ? "on" : "off"); } } // Déclenche les actions à la réception d'un message // D'après http://m2mio.tumblr.com/post/30048662088/a-simple-example-arduino-mqtt-m2mio void callback(char* topic, byte* payload, unsigned int length) { int i = 0; if ( debug ) { Serial.println("Message recu => topic: " + String(topic)); Serial.println(" | longueur: " + String(length,DEC)); } // create character buffer with ending null terminator (string) for(i=0; i<length; i++) { message_buff[i] = payload[i]; } message_buff[i] = '\0'; String msgString = String(message_buff); if ( debug ) { Serial.println("Payload: " + msgString); } if ( msgString == "on" ) { digitalWrite(LIGHT_PIN, HIGH); light_status = true; publish_status(light_status); } else { digitalWrite(LIGHT_PIN, LOW); light_status = false; publish_status(light_status); } } ```