---
title: FabLab ressource
tags: arduino, fablab
robots: noindex, nofollow
author: Julien Noyer
---
# Workshop Arduino

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