---
# System prepended metadata

title: FabLab ressource
tags: [arduino, ' fablab']

---

---
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);
  }
}
```