Categories: All

by michael poncet 5 years ago

402

DTA 2017-2018 (Version nodemcu)

L'exercice porte sur la mise en œuvre d'un site web en utilisant diverses technologies telles que le PHP, un langage de script côté serveur. Le contenu inclut une introduction au PHP, couvrant des concepts de base tels que la récupération de données depuis un formulaire et la manipulation de fichiers texte.

DTA 2017-2018 (Version nodemcu)

DTA 2017-2018

Carte publique

Environnement de travail

Matériel
Occasionnellement

1 kit Raspberry Pi pour 5 personnes

1 thymio par groupe

Permanent

1 tablette par groupe

1 kit "objet connecté" par personne

1 pc par personne

HP ProBook 650 G2

Wifi

Broadcom BCM43228 802.11a/b/g/n

bcmwl-kernel-source 6.30.223.248

SSD 256 Go

RAM 8 Go

Core i5

intel-microde 3.20151106.1

Services en ligne
Thinkspeak
Trello

http://www.blogdumoderateur.com/exemples-trello/

Logiciel
Autres

PureFTPd

PureFTPd est un serveur FTP simple et efficace.

Sshfs

SshFS sert à monter sur son système de fichier, un autre système de fichier distant, à travers une connexion SSH.

Eclipse
Arduino IDE

Comment installer une librairie dans l''IDE Arduino ?

Sélectionner la librairie désirée puis [Installer]

Filtrez votre recherche

Saisissez les premières lettres du nom de la librairie

Gérer les bibliothèque

Inclure un bibliothèque

Menu 'Croquis'

Bug avec la version dispo sur arduino.cc

./arduino
Error: missing `server' JVM at `/opt/arduino/java/lib/amd64/server/libjvm.so'.
Please install or use the JRE or JDK that contains these missing components.

Pas de pb sur Mint 18

Chromium

sudo apt install chromium-browser

Filezilla

sudo apt update ; sudo apt upgrade ; sudo apt install filezilla

Slack

depuis https://slack.com/intl/fr-fr/downloads/linux

Linux Mint 18 'Sarah' Cinnamon 64-bit

Légende de cette carte mentale

Ligne de commande
"Saisir ce texte"
[Cliquer sur]
Concerne l'organisation
Sujet de discussion
speaker
airplane
Culture générale
loudspeaker

bicyclist

Exercice à effectuer

triangular_flag

Tuto à suivre

muscle

Théorie à lire

books

Objectifs
Technologies

green flag

Compétences

star

Sujet

thumbs up

Cycles

9. Frameworks, Introduction au développement mobile
Projet sur 2 semaines

Reprendre le fil rouge (NodeMcu) en développant un clone de Thingspeak de A à Z

8. API, Ajax

Développer une API sur le VPS qui reçoit les données du NodeMCU

7. Environnement de développement, gestion de codes et debug

Restructurer le projet "thinkspeak"

6. Base de données, Introduction à NodeJS
Exercices

Convertir les anciens projets qui utilisent des fichers CSV

Re développer thingspeak.com avec BD

5. POO, PHP, formulaire
Projet

Re développer thingspeak.com

class

interface

Interface d'export des données

Sélection d'une plage de dates

Page web (structure)

graphique

graphique "zoomable"

Générer histogramme

Générer courbe

tableau

Tableau triable

Mise en forme HTML

fichier

Gestion des fichiers par dates

idée : avoir un fichier par jour

Ecriture

Lecture

convertisseur

json 2 array

array 2 json

json 2 csv

csv 2 json

array 2 csv

csv 2 array

capteur

Aller plus loin

générer la moyenne sur plusieurs jours (plage de date)

Validation de la conformité des données

check cohérence des données

plage de donnée

conforme aux capacités du capteur (DHT11)

type de donnée = réel ou entier

check température et humdité

Prise en charge de plusieurs références de capteur

Documentation technique

DHT22

DHT11

Récupération des données avec POST

format JSON

Récupération des données avec GET

?temp=xxxx&humi=xxx

introduction à la modification CSS avec Javascript

restituer les données csv sous forme graphique avec GD

restituer les données csv dans un tableau HTML avec différentes présentations (plusieurs feuilles de style)

Créer une page pour réceptionner les données du capteur et les écrire dans un fichier au format csv

uniquement en POO

Travail en groupe avec répartition en sous-groupe

fusionner les travaux

suivre l'avancement des collègues

coder...

répartir les tâches

créer la liste des tâches

structure le projet

3. Déploiement de site web, Cloud, CMS

Découverte de PHP (1/2j)

1.5 j

Introduction a PHP (1/2j)

Formulaire d'authentification

Tuto se rapprochant de cet exercice

2

1

Suite de l'exercice : conserver l'authentification avec une session

Suite de l'exercice : le fichier texte contient plusieurs lignes avec plusieurs couples d'identifiant et mot de passe

Écrire un script qui propose d'authentifier un internaute grâce à un formulaire (identifiant et mot de passe) et en comparant sa saisie avec le contenu d'un fichier texte. Le fichier texte contient une ligne de texte sous la forme "identifiant motdepasse" > cela nécessite l'utilisation de la fonction "explode" avec le caractère ''espace'' en tant que séparateur.

Fonction explode

Les tableaux

Documentation officielle

Explications

https://openclassrooms.com/courses/concevez-votre-site-web-avec-php-et-mysql/fonctionnement-d-un-site-ecrit-en-php

Récupérer les mesures du NodeMcu

Résultat avec affichage d'un thermomètre

Modification du code du NodeMcu

depuis cette version

/* 

 * *************************

 * Capteur : DHT11

 * 

 * Les broches sont numérotées de la gauche vers la droite lorsque l'on regarde le capteur de face

 * 

 * Broche n°1 connectée au +3.3V

 * Broche n°2 (data) connectée à la broche 'D4' du NodeMcu (Pin 2 pour l'arduino) avec une résistance de 10 K reliée au +3.3v

 * Broche n°3 non connectée

 * Broche n°4 connectée à la masse (GND)

 * 

 * Installer la bibliothèque 'DHT sensor library by Adarftuit'

 * Cette librairie necessite une librairie supplémentaire qui est disponible à l'adresse : https://github.com/adafruit/Adafruit_Sensor

 * et qui doit être installée selon ce tutoriel : https://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use/installing-a-library-on-linux

 *  

 */


// Déclaration des librairies

#include <DHT.h>           // pour communiquer avec le capteur DHT

#include <ESP8266WiFi.h>       // pour le support du wifi

#include <ESP8266WiFiMulti.h>

#include <ESP8266HTTPClient.h>    // pour utliser le wifi


// Préparation du capteur DHT

#define DHTPIN 2           // broche sur laquelle est raccordée la data du capteur (la broche 'D4' du NodeMcu correspond à la broche 2 de l'arduino)

#define DHTTYPE DHT11         // précise la référence du capteur DHT (DHT11 ou DHT21 ou DHT22)

DHT dht(DHTPIN, DHTTYPE);       // Initialisation du capteur DHT


// Initialisation du wifi

ESP8266WiFiMulti WiFiMulti;      


// fonction de démarrage

void setup() {

  

 // Démarrage du bus série

 Serial.begin(115200);        // vitesse

 Serial.println("Bonjour");     // écriture d'un petit message...

 Serial.println("DHT11 + IFTTT + Google spreadsheets");

 Serial.println("");


 dht.begin();            // Démarrage du capteur DHT11


 WiFiMulti.addAP("ssid", "wifikey");   // Connexion au réseau wifi


}


// boucle infinie

void loop() {

  

 delay(10000);            // attendre 10 secondes


 float t = dht.readTemperature();  // mesurer la température (en ° Celsius)

 float h = dht.readHumidity();    // mesurer l'humidité (en %)

  

 if (isnan(h) || isnan(t)) {     // test si des valeurs ont été récupérées

   

  // s'il y a un problème...

   

  Serial.println("Failed to read from DHT sensor!");  // affiche un message d'erreur

  return;              // quitte pour retenter une lecture

   

 } else {


  // si tout va bien...


  // conversion des valeurs en entier

  int temp = int(t);

  int humi = int(h);

  

  // affichage des valeurs dans le bus série

  Serial.print("Temperature : ");

  Serial.print(temp);

  Serial.print(" *C\t");

  Serial.print("Humidité : ");

  Serial.print(humi);

  Serial.println(" %");


  // envoi des données vers internet

  if((WiFiMulti.run() == WL_CONNECTED)) {  // Si le wifi est connecté

    

     HTTPClient http;          // préparation d'une requète HTTP au serveur


     Serial.print("HTTP begin... ");

     http.begin("http://maker.ifttt.com/trigger/temp_request/with/key/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");  // connexion au serveur

      

     http.addHeader("Content-Type", "application/json");  // envoi d'un entête pour préciser notre format de données : json

      

     String value = "{\"value1\":\"" + String(temp) + "\",\"value2\":\"" + String(humi) + "\"}";  // préparation du json {"value1":"22","value2":"55"}

      

     int httpCode = http.POST(value);  // envoi les données et récupère un code de retour

      

     if(httpCode == 200 ) {       // si le code de retour est bon (200)

       Serial.println("POST : ok");

     } else {              // si le code de retour n'est pas bon (différent de 200)

       Serial.print("POST : failed, error : ");

       Serial.println(http.errorToString(httpCode).c_str());

     }

     http.end();          // on ferme la connexion au serveur

  } 

 }

}


Récupérer des données d'un formualaire

$_POST

Récupérer les variables dans l'URL

$_GET

Lire et écrire dans un fichier texte

file_get_contents

file_put_contents

Les bases du PHP

Présentation de PHP

Architecture web

avec langage dynamique

sans langage dynamique

2. Dispositif électronique programmable et objets connectés
Contenus

Mesure température avec NodeMCU AVEC connexion au Web ThingSpeak (1/2j)

ajout de led rouge et verte pour visualiser le dépassement (ou non) d'un seuil > simulation de déclenchement du chauffage

avec ThingSpeak

https://thingspeak.com/channels/178468/private_show

Mesure température avec NodeMCU AVEC connexion au Web IFTTT (1/2j)

Affichage de la température sous forme graphique avec IFTTT et tableur Google

Google spreadsheets

https://docs.google.com/spreadsheets/d/1gEC7ygJCdd5TZQx6emknfBHCgdboL64Ls54EPtYUyrs/

IFTTT

Pour accéder aux paramètres du WebHook, il faut aller dans le menu de l'utilisateur, Services, chercher WebHooks, se connecter, puis aller dans settings.

https://ifttt.com/applets/43361149d-if-maker-event-temp_request-then-add-row-to-spreadsheet-in-david-rechatin-gmail-com-s-google-drive

Reprendre le code DHT11

Connexion du NodeMCU au web

testez le code Exemples / ESP8266HTTPClient / BasicHttpClient

essayez d'obtenir un résultat pertinent...

testez le code Exemples / ESP8266Wifi / WifiScan

comment fonctionne-t-il ?

que fait-il ?

Mesure température avec NodeMCU SANS connexion au Web Afficheur LCD (1/2j)

Exercice : afficher la température et l'humidité sur l'afficheur

/*
* *************************
* Capteur : DHT11
*
* Les broches sont numérotées de la gauche vers la droite lorsque l'on regarde le capteur de face
*
* Broche n°1 connectée au +3.3V
* Broche n°2 (data) connectée à la broche 'D4' du NodeMcu (Pin 2 pour l'arduino) avec une résistance de 10 K reliée au +3.3v
* Broche n°3 non connectée
* Broche n°4 connectée à la masse (GND)
*
* *************************
* Convertisseur de niveau I2C
*
* Le NodeMcu fonctionne sous 3.3V.
* L'afficheur fonctionne sous 5V et avec un bus I2C.
* La connexion ne peut pas être directe sans risquer d'endommager le NodeMcu.
* Un convertisseur de niveau est intercalé entre le NodeMcu et l'afficheur
*
* Broche 'BVCC' connectée au +3.3V : broche '3V' sur le NodeMcu
* Broche 'BSCL' connectée à la broche 'D1' du NodeMcu (Pin 5 pour l'arduino)
* Broche 'BSDA' connectée à la broche 'D2' du NodeMcu (Pin 4 pour l'arduino)
* Broche 'BGND' connectée à la masse : une broche 'G' du NodeMcu (GND)
* Broche 'AVCC' connectée au +5V : broche 'VV' sur le NodeMcu
* Broche 'AGND' connectée à la masse : une broche 'G' du NodeMcu (GND)
* Les broches 'ASCL', 'ASDA' et 'AGND' sont connectées à l'afficheur
*
* *************************
* Afficheur 2 lignes x 16 caractères sur bur I2C
*
* Broche 'GND' connectée à la broche AGND du convertisseur (ou directement à la masse : une broche 'G' du NodeMcu)
* Broche 'VCC' connectée à la broche AVCC du convertisseur (ou directement au +5V : broche 'VV' sur le NodeMcu)
* Broche 'SDA' connectée à la broche ASDA du convertisseur
* Broche 'SCL' connectée à la broche ASCL du convertisseur
*
*
*/

// Déclaration des librairies
#include <DHT.h> // pour communiquer avec le capteur DHT
#include <Wire.h> // pour utiliser le bus I2C
#include <LiquidCrystal_I2C.h> // pour piloter l'afficheur

// Préparation du capteur DHT
#define DHTPIN 2 // broche sur laquelle est raccordée la data du capteur (la broche 'D4' du NodeMcu correspond à la broche 2 de l'arduino)
#define DHTTYPE DHT11 // précise la référence du capteur DHT (DHT11 ou DHT21 ou DHT22)
DHT dht(DHTPIN, DHTTYPE); // Initialisation du capteur DHT

// Préparation de l'afficheur
LiquidCrystal_I2C lcd(0x27,16,2); // Initialisation en présisant l'adresse 0x27 sur le bus I2C et 16 caractères par 2 lignes


// fonction de démarrage
void setup() {
// Démarrage du bus série
Serial.begin(115200); // vitesse
Serial.println("Bonjour"); // écriture d'un petit message...
Serial.println("DHT11 et afficheur");

// Démarrage du capteur DHT11
dht.begin();

// Démarrage de l'afficheur
lcd.init();
lcd.backlight(); // mise en route du rétro éclairage
lcd.setCursor(0,0); // positionne le curseur sur la 1ère ligne et 1ère colonne
lcd.print("Bonjour"); // écriture d'un petit message...
lcd.setCursor(0,1); // positionne le curseur sur la 2ème ligne et 1ère colonne
lcd.print("DHT11 et LCD"); // écriture d'un petit message...
}

// boucle infinie
void loop() {
delay(5000); // attendre 5 seconde


float t = dht.readTemperature(); // mesurer la température (en ° Celsius)
float h = dht.readHumidity(); // mesurer l'humidité (en %)

// test si des valeurs ont été récupérées
if (isnan(h) || isnan(t)) { // si non
Serial.println("Failed to read from DHT sensor!"); // affiche un message d'erreur
return; // quitte pour retenter une lecture
}

// affichage des valeurs dans le bus série
Serial.print("Temperature : ");
Serial.print(t);
Serial.print(" *C\t");
Serial.print("Humidité : ");
Serial.print(h);
Serial.println(" %");

// des valeurs sur l'afficheur
lcd.clear();
lcd.setCursor(0,0); // 1ère colonne, 1ère ligne
lcd.print("Temp. : ");
lcd.setCursor(8,0); // 9ème colonne, 1ère ligne
lcd.print(int(t)); // conversion en entier avant d'afficher
lcd.setCursor(11,0); // 12ème colonne, 1ère ligne
lcd.print("*C");
lcd.setCursor(0,1); // 1ère colonne, 2èmee ligne
lcd.print("Humi. : ");
lcd.setCursor(8,1); // 9ème colonne, 2èmee ligne
lcd.print(int(h));; // conversion en entier avant d'afficher
lcd.setCursor(11,1); // 12ème colonne, 2èmee ligne
lcd.print("%");
}

Faire le montage et executer Afficheur : chronometre

Tuto

La librairie suivante permet de choisir les PIN

Installer la bibliothèque 'LiquidCrystal I2C by Frak de Brabander'

/*
* Convertisseur de niveau I2C
*
* Le NodeMcu fonctionne sous 3.3V.
* L'afficheur fonctionne sous 5V et avec un bus I2C.
* La connexion ne peut pas être directe sans risquer d'endommager le NodeMcu.
* Un convertisseur de niveau est intercalé entre le NodeMcu et l'afficheur
*
* Broche 'BVCC' connectée au +3.3V : broche '3V' sur le NodeMcu
* Broche 'BSCL' connectée à la broche 'D1' du NodeMcu (Pin 5 pour l'arduino)
* Broche 'BSDA' connectée à la broche 'D2' du NodeMcu (Pin 4 pour l'arduino)
* Broche 'BGND' connectée à la masse : une broche 'G' du NodeMcu (GND)
* Broche 'AVCC' connectée au +5V : broche 'VV' sur le NodeMcu
* Broche 'AGND' connectée à la masse : une broche 'G' du NodeMcu (GND)
* Les broches 'ASCL', 'ASDA' et 'AGND' sont connectées à l'afficheur
*
* *************************
* Afficheur 2 lignes x 16 caractères sur bur I2C
*
* Broche 'GND' connectée à la broche AGND du convertisseur (ou directement à la masse : une broche 'G' du NodeMcu)
* Broche 'VCC' connectée à la broche AVCC du convertisseur (ou directement au +5V : broche 'VV' sur le NodeMcu)
* Broche 'SDA' connectée à la broche ASDA du convertisseur
* Broche 'SCL' connectée à la broche ASCL du convertisseur
*
*
*/

// Déclaration des librairies
#include <Wire.h> // pour utiliser le bus I2C
#include <LiquidCrystal_I2C.h> // pour piloter l'afficheur

// Préparation de l'afficheur
LiquidCrystal_I2C lcd(0x27,16,2); // Initialisation en présisant l'adresse 0x27 sur le bus I2C et 16 caractères par 2 lignes


// fonction de démarrage
void setup() {
// Démarrage de l'afficheur
lcd.init();
lcd.backlight(); // mise en route du rétro éclairage
}

int temps = 0;

// boucle infinie
void loop() {
delay(1000); // attendre 1 seconde
temps = int(millis() / 1000);

// des valeurs sur l'afficheur
lcd.clear();
lcd.setCursor(0,0); // 1ère colonne, 1ère ligne
lcd.print("Chronometre");
lcd.setCursor(0,1); // 1ère colonne, 2èmee ligne
lcd.print(temps);
}

Mesure température avec NodeMCU SANS connexion au Web (1/2j)

Exercice : compléter le code pour prendre en charge l'humidité

/*
* *************************
* Capteur : DHT11
*
* Les broches sont numérotées de la gauche vers la droite lorsque l'on regarde le capteur de face
*
* Broche n°1 connectée au +3.3V
* Broche n°2 (data) connectée à la broche 'D4' du NodeMcu (Pin 2 pour l'arduino) avec une résistance de 10 K reliée au +3.3v
* Broche n°3 non connectée
* Broche n°4 connectée à la masse (GND)
*
*/

// Déclaration des librairies
#include <DHT.h> // pour communiquer avec le capteur DHT

// Préparation du capteur DHT
#define DHTPIN 2 // broche sur laquelle est raccordée la data du capteur (la broche 'D4' du NodeMcu correspond à la broche 2 de l'arduino)
#define DHTTYPE DHT11 // précise la référence du capteur DHT (DHT11 ou DHT21 ou DHT22)
DHT dht(DHTPIN, DHTTYPE); // Initialisation du capteur DHT


// fonction de démarrage
void setup() {
// Démarrage du bus série
Serial.begin(115200); // vitesse
Serial.println("Bonjour"); // écriture d'un petit message...
Serial.println("DHT11 et afficheur");

// Démarrage du capteur DHT11
dht.begin();
}

// boucle infinie
void loop() {
delay(5000); // attendre 5 seconde

float t = dht.readTemperature(); // mesurer la température (en ° Celsius)
float h = dht.readHumidity(); // mesurer l'humidité (en %)

// test si des valeurs ont été récupérées
if (isnan(h) || isnan(t)) { // si non
Serial.println("Failed to read from DHT sensor!"); // affiche un message d'erreur
return; // quitte pour retenter une lecture
}

// affichage des valeurs dans le bus série
Serial.print("Temperature : ");
Serial.print(t);
Serial.print(" *C\t");
Serial.print("Humidité : ");
Serial.print(h);
Serial.println(" %");


}

Faire le montage et executer Mesure température

Code source commenté

/*
* *************************
* Capteur : DHT11
*
* Les broches sont numérotées de la gauche vers la droite lorsque l'on regarde le capteur de face
*
* Broche n°1 connectée au +3.3V
* Broche n°2 (data) connectée à la broche 'D4' du NodeMcu (Pin 2 pour l'arduino) avec une résistance de 10 K reliée au +3.3v
* Broche n°3 non connectée
* Broche n°4 connectée à la masse (GND)
*
*/

// Déclaration des librairies
#include <DHT.h> // pour communiquer avec le capteur DHT

// Préparation du capteur DHT
#define DHTPIN 2 // broche sur laquelle est raccordée la data du capteur (la broche 'D4' du NodeMcu correspond à la broche 2 de l'arduino)
#define DHTTYPE DHT11 // précise la référence du capteur DHT (DHT11 ou DHT21 ou DHT22)
DHT dht(DHTPIN, DHTTYPE); // Initialisation du capteur DHT


// fonction de démarrage
void setup() {
// Démarrage du bus série
Serial.begin(115200); // vitesse
Serial.println("Bonjour"); // écriture d'un petit message...
Serial.println("DHT11 et afficheur");

// Démarrage du capteur DHT11
dht.begin();
}

// boucle infinie
void loop() {
delay(5000); // attendre 5 seconde

float t = dht.readTemperature(); // mesurer la température (en ° Celsius)

// test si des valeurs ont été récupérées
if (isnan(t)) { // si non
Serial.println("Failed to read from DHT sensor!"); // affiche un message d'erreur
return; // quitte pour retenter une lecture
}

// affichage des valeurs dans le bus série
Serial.print("Temperature : ");
Serial.print(t);
Serial.println(" *C\t");


}

Installer la bibliothèque 'DHT sensor library by Adarftuit'

et qui doit être installée selon ce tutoriel :

https://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use/installing-a-library-on-linux

La librairie "DHT sensor" necessite une librairie supplémentaire qui est disponible à cette adresse

https://github.com/adafruit/Adafruit_Sensor

Documentation capteur DHT11

Feu tricolore avec NodeMCU

Sans les piétons

// Déinition des pins const int ROUGE1 = 16; const int ORANGE1 = 5; const int VERT1 = 4; const int ROUGE2 = 0; const int ORANGE2 = 2; const int VERT2 = 14; void setup() { // Broches définies en mode Sortie pinMode(ROUGE1, OUTPUT); pinMode(ORANGE1, OUTPUT); pinMode(VERT1, OUTPUT); pinMode(ROUGE2, OUTPUT); pinMode(ORANGE2, OUTPUT); pinMode(VERT2, OUTPUT); // Tout éteindre digitalWrite(ROUGE1, LOW); digitalWrite(ORANGE1, LOW); digitalWrite(VERT1, LOW); digitalWrite(ROUGE2, LOW); digitalWrite(ORANGE2, LOW); digitalWrite(VERT2, LOW); } void loop() { digitalWrite(ROUGE1, LOW); // eteindre led rouge de la route 1 digitalWrite(ORANGE2, LOW); // eteindre led orange de la route 2 digitalWrite(VERT1, HIGH); // allumer led verte de la route 1 digitalWrite(ROUGE2, HIGH); // allumer led rouge de la route 2 delay(2000); // attendre digitalWrite(VERT1, LOW); // eteindre led verte de la route 1 digitalWrite(ORANGE1, HIGH); // allumer led orange de la route 1 delay(500); // attendre digitalWrite(ORANGE1, LOW); // eteindre led orange de la route 1 digitalWrite(ROUGE2, LOW); // eteindre led rouge de la route 2 digitalWrite(ROUGE1, HIGH); // allumer led rouge de la route 1 digitalWrite(VERT2, HIGH); // allumer led verte de la route 2 delay(2000); // attendre digitalWrite(VERT2, LOW); // eteindre led verte de la route 2 digitalWrite(ORANGE2, HIGH); // allumer led orange de la route 2 delay(500); // attendre }

Adapter les exercices déjà effectué sur Raspberry Pi en Python

Installation de l'IDE Ardunio

Découverte avec une LED RVB

Pilotage de la LED depuis un navigateur web avec une palette de couleur

#include #include #include const char* ssid = "openfactory42"; const char* password = "openfactory.42"; const int LED_RED = 5; const int LED_GREEN = 4; const int LED_BLUE = 0; ESP8266WebServer webServer(80); String pageMenu = "" "" "URL parameters (between 0 and 1023)
" "Click RGB
" ""; String pageRGB = "" "RGB control" "" "" ""; ////////////////////////////////////////////////////////////////////////////////////////////////// void handleMenu() { webServer.send(200, "text/html", pageMenu); } void handleUrlColor() { Serial.println("handle root.."); String red = webServer.arg(0); String green = webServer.arg(1); String blue = webServer.arg(2); Serial.print("red : "); Serial.println(red.toInt()); analogWrite(LED_RED, red.toInt()); Serial.print("green : "); analogWrite(LED_GREEN, green.toInt()); Serial.println(green.toInt()); Serial.print("blue : "); Serial.println(blue.toInt()); analogWrite(LED_BLUE, blue.toInt()); webServer.send(200, "text/html", pageMenu); } void handleClickColor() { Serial.println("handle root.."); String red = webServer.arg(0); String green = webServer.arg(1); String blue = webServer.arg(2); Serial.print("red : "); Serial.println(red.toInt()); analogWrite(LED_RED, red.toInt()); Serial.print("green : "); analogWrite(LED_GREEN, green.toInt()); Serial.println(green.toInt()); Serial.print("blue : "); Serial.println(blue.toInt()); analogWrite(LED_BLUE, blue.toInt()); webServer.send(200, "text/html", pageRGB); } ////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////// void setup() { pinMode(LED_RED, OUTPUT); pinMode(LED_GREEN, OUTPUT); pinMode(LED_BLUE, OUTPUT); analogWrite(LED_RED, 0); analogWrite(LED_GREEN, 0); analogWrite(LED_BLUE, 0); delay(1000); Serial.begin(115200); Serial.println(); WiFi.begin(ssid, password); // Wait for connection while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); webServer.on("/", handleMenu); webServer.on("/urlColor", handleUrlColor); webServer.on("/clickColor", handleClickColor); webServer.begin(); Serial.println("HTTP server started"); } ////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////// void loop() { webServer.handleClient(); }

Pilotage de la LED depuis un navigateur web en utilisant un serveur web sur le NodeMCU

#include #include #include const char* ssid = "openfactory42"; const char* password = "openfactory.42"; const int LED_RED = 5; const int LED_GREEN = 4; const int LED_BLUE = 0; ESP8266WebServer webServer(80); // Contenu de la page web "Menu" String pageMenu = "" "" "Pilotage avec parametre d'URL (entre 0 et 1023)
" ""; ////////////////////////////////////////////////////////////////////////////////////////////////// // Fonction executée quand une requête arrive sur l'url "/" void handleMenu() { webServer.send(200, "text/html", pageMenu); } // Fonction executée quand une requête arrive sur l'url "/urlColor" void handleUrlColor() { Serial.println("Requête UrlColor"); // Récupère les paramêtres de l'URL (page.html?name1=value1&name2=value2...) String red = webServer.arg(0); // 1er paramètre : rouge String green = webServer.arg(1); // 2ème paramètre : vert String blue = webServer.arg(2); // 3ème paramètre : bleu // Affiche le composantes de couleur dans le moniteur série et pilote la LED Serial.print("red : "); Serial.println(red.toInt()); analogWrite(LED_RED, red.toInt()); Serial.print("green : "); analogWrite(LED_GREEN, green.toInt()); Serial.println(green.toInt()); Serial.print("blue : "); Serial.println(blue.toInt()); analogWrite(LED_BLUE, blue.toInt()); // Affiche la page Menu webServer.send(200, "text/html", pageMenu); } /////////////////////////////////////////////////// // Initialisation void setup() { // Configuration des pin en sortie pinMode(LED_RED, OUTPUT); pinMode(LED_GREEN, OUTPUT); pinMode(LED_BLUE, OUTPUT); // Eteindre la LED RGB analogWrite(LED_RED, 0); analogWrite(LED_GREEN, 0); analogWrite(LED_BLUE, 0); // Accepter le moniteur série Serial.begin(115200); Serial.println(); // Démarrer le wifi delay(1000); WiFi.begin(ssid, password); // Attendre la connexion au réseau wifi while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connexion au réseau : "); Serial.println(ssid); Serial.print("Adresse IP : "); Serial.println(WiFi.localIP()); // Définir les fonctions qui doivent être executées en fonction de l'url demandée webServer.on("/", handleMenu); webServer.on("/urlColor", handleUrlColor); // Démarrer le serveur web webServer.begin(); Serial.println("Serveur HTTP démarré !"); } /////////////////////////////////////////////////// // Boucle principale void loop() { // Attendre une requête web cliente webServer.handleClient(); }

voir tuto

1er démarrage / essai

Ouvrir le Moniteur série pour lire le résultat (Dernière icône de la barre d'outils)

La liste des réseaux wifi disponible doit apparaître

Vérifier puis Téléverser (1ère puis 2ème icône de la barre d'outils)

Coller le programme suivant

#include "ESP8266WiFi.h" void setup() { Serial.begin(115200); // Set WiFi to station mode and disconnect from an AP if it was previously connected WiFi.mode(WIFI_STA); WiFi.disconnect(); delay(2000); Serial.println("Setup done"); } void loop() { Serial.println("scan start"); int n = WiFi.scanNetworks();// WiFi.scanNetworks will return the number of networks found Serial.println("scan done"); if (n == 0) Serial.println("no networks found"); else { Serial.print(n); Serial.println(" networks found"); for (int i = 0; i < n; ++i) { // Print SSID and RSSI for each network found Serial.print(i + 1); Serial.print(": "); Serial.print(WiFi.SSID(i)); Serial.print(" ("); Serial.print(WiFi.RSSI(i)); Serial.print(")"); Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE)?" ":"*"); delay(10); } } Serial.println(""); // Wait a bit before scanning again delay(5000); }

Fichier/Nouveau

http://henrysbench.capnfatz.com/henrys-bench/arduino-projects-tips-and-more/arduino-esp8266-lolin-nodemcu-getting-started/

Travailler avec le NodeMCU

Ajouter les droits d'accès à l'utilisateur courant au port USB

sudo usermod -a -G dialout $USER

Sélectionner le port "/dev/ttyUSB0" (Outils/Port)

Brancher le NodeMCU à un port USB de l'ordinateur

Sélectionner le type de carte "NodeMCU 1.0 (ESP-12E module)" (Outils/Type de carte:.../Gestionnaire de cartes)

Accéder au Gestionnaire de carte (Outils/Type de carte:.../Gestionnaire de cartes), rechercher "esp8266", sélectionner "esp8266 by ESP8266 Community", [Installer], [Fermer]

Prise en charge du NodeMcu

Dans le champ "URL de gestionnaire de cartes supplémentaires", ajouter http://arduino.esp8266.com/stable/package_esp8266com_index.json [OK]

Démarrer le logiciel Arduino et accéder aux Préférence (Fichier/Préférences)

Using NodeMCU with Arduino IDE

Tuto installation NodeMCU

Tuto d'installation standard de l'IDE Arduino

Les objets connectés IOT

Jeu de Pong (1/2j) Raspberry Pi + SenseHAT + Python

Feu tricolore (1/2j) Raspberry Pi + cobbler + Python

Exercice : suivre les exercices suivants

Découverte

Faire le test en Python et Rpi.GPIO

Lire le principe de câblage avec le Cobbler

Lire la Base d’expérimentation

Lire l'Introduction

Structurer ses idées en modélisant la logique

Capteur + matrice Led + Python sur Raspberry Pi (1j)

Boussole numérique : une LED s'allume pour pointer le Nord

Correction

#!/usr/bin/python
# coding: utf-8

from sense_hat import SenseHat

# position [ligne, colonne] des leds situées au bord de l'afficheur (matrice 8 x 8)
# dans le sens des aiguilles d'une montre de la led n°0 à la led n°28
led_contour = [[0,0],[1,0],[2,0],[3,0],[4,0],[5,0],[6,0],[7,0],[7,1],[7,2],[7,3],[7,4],[7,5],[7,6],[7,7],[6,7],[5,7],[4,7],[3,7],[2,7],[1,7],[0,7],[0,6],[0,5],[0,4],[0,3],[0,2],[0,1]]


# initialisation du Sense Hat
sense = SenseHat()
sense.clear()
sense.set_rotation(90) # orientation de la matrice de led du Sense Hat pour que la led [0,0] soit au nord

# calcul l'angle entre chaque led sachant qu'un cercle fait 360 °
degree_par_led = 360. / len(led_contour)

# initialisation des variables pour mémoriser la position de la led précédement allumée
prec_ligne = 0
prec_colonne = 0


# boucle principale
while True:
# récupérer la valeur mesurée par le magnétomètre
direction = sense.get_compass() # retourne un angle entre 0 et 360 °
print("Magnétomètre > " + str(direction) + "°")

# pour retrouver la position de la led, on divise la direction mesurée par l'angle d'une led
led_index = int(direction / degree_par_led)

# rechercher les coordonnées (ligne, colonne) de la led depuis le tableau du contour
led = led_contour[led_index]
colonne=led[0] # numéro de ligne
ligne=led[1] # numéro de colonne

# si une autre led était précédement allumée
if ligne != prec_ligne or colonne != prec_colonne:
# alors on l'etteind
sense.set_pixel(prec_ligne, prec_colonne, 0, 0, 0)

# allumée la bonne led
sense.set_pixel(ligne, colonne, 0, 0, 255)

# mémoriser les coordonnées de la led allumée pour la boucle suivante
prec_ligne = ligne
prec_colonne = colonne


Mesure de température : allumer une LED par degré de température au-dessus de 0°C

Correction Optimisé Python

#!/usr/bin/python
# coding: utf-8

from sense_hat import SenseHat

sense = SenseHat()

while True:
temp = sense.get_temperature()
print(temp)
couleur = [(0, 255, 0) if i < temp else (0, 0, 0) for i in range(64)]
sense.set_pixels(couleur)

Correction Facile

#!/usr/bin/python
# coding: utf-8

from sense_hat import SenseHat

sense = SenseHat()
sense.clear()


while True:
temp = sense.get_temperature()
print(temp)
for x in range(0, 8):
for y in range(0, 8):
if temp > (8 * x + y):
sense.set_pixel(x, y, 255, 0, 0)
else:
sense.set_pixel(x, y, 0, 0, 0)

Modéliser l'algorithme avec un diagramme

Allumer les leds les unes après les autres avec changement de couleur à chaque cycle

from sense_hat import SenseHat

import random

import time


sense = SenseHat()


while True:

   

 rouge = random.randrange(0, 255)

 vert = random.randrange(0, 255)

 bleu = random.randrange(0, 255)

   

 for ligne in range(0, 8):

  for colonne in range(0, 8):

   sense.set_pixel(colonne, ligne, rouge, vert, bleu)

   time.sleep(0.1)

   

Le Sense Hat

Test

sense.show_message("Hello world!")

sense = SenseHat()

from sense_hat import SenseHat

Installation des paquets pour Sense Hat

sudo reboot

sudo apt install sense-hat

sudo apt update

Découverte du Sense Hat

doc

Emulateur en ligne

Introduction

-

Découverte du Raspberry Pi (1/2j)

Sense Hat

Premier démarrage sous Raspbian

Découverte de Python (1/2j)

Graphique

exemple

# -*- coding: utf-8 -*-


import matplotlib.pyplot as plt


# simple

liste = [10, 18, 4, 20, 12, 16]

plt.plot(liste)

plt.show()



# complexe

name = ['-18', '18-25', '25-50', '50+']

data = [5000, 26000, 21400, 12000]

explode=(0, 0.15, 0, 0)

plt.pie(data, explode=explode, labels=name, autopct='%1.1f%%', startangle=90, shadow=True)

plt.axis('equal')

plt.show()


Créer des graphiques scientifiques avec python

Exercices corrigés

Tutoriel : Interface graphique Pygame pour Python

Workshop exercices for "Introduction to Programming with Python & Pygame"

mouse_move.py

"""

Sample Python/Pygame Programs
Simpson College Computer Science

"""
 
import pygame
 
# Define some colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
 
 
def draw_stick_figure(screen, x, y):
    # Head
    pygame.draw.ellipse(screen, BLACK, [1 + x, y, 10, 10], 0)
 
    # Legs
    pygame.draw.line(screen, BLACK, [5 + x, 17 + y], [10 + x, 27 + y], 2)
    pygame.draw.line(screen, BLACK, [5 + x, 17 + y], [x, 27 + y], 2)
 
    # Body
    pygame.draw.line(screen, RED, [5 + x, 17 + y], [5 + x, 7 + y], 2)
 
    # Arms
    pygame.draw.line(screen, RED, [5 + x, 7 + y], [9 + x, 17 + y], 2)
    pygame.draw.line(screen, RED, [5 + x, 7 + y], [1 + x, 17 + y], 2)
 
# Setup
pygame.init()
 
# Set the width and height of the screen [width,height]
size = [700, 500]
screen = pygame.display.set_mode(size)
 
pygame.display.set_caption("My Game")
 
# Loop until the user clicks the close button.
done = False
 
# Used to manage how fast the screen updates
clock = pygame.time.Clock()
 
# Hide the mouse cursor
pygame.mouse.set_visible(0)
 
# -------- Main Program Loop -----------
while not done:
    # ALL EVENT PROCESSING SHOULD GO BELOW THIS COMMENT
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
    # ALL EVENT PROCESSING SHOULD GO ABOVE THIS COMMENT
 
    # ALL GAME LOGIC SHOULD GO BELOW THIS COMMENT
 
    # Call draw stick figure function
    pos = pygame.mouse.get_pos()
    x = pos[0]
    y = pos[1]
 
    # ALL GAME LOGIC SHOULD GO ABOVE THIS COMMENT
 
    # ALL CODE TO DRAW SHOULD GO BELOW THIS COMMENT
 
    # First, clear the screen to white. Don't put other drawing commands
    # above this, or they will be erased with this command.
    screen.fill(WHITE)
    draw_stick_figure(screen, x, y)
 
    # ALL CODE TO DRAW SHOULD GO ABOVE THIS COMMENT
 
    # Go ahead and update the screen with what we've drawn.
    pygame.display.flip()
 
    # Limit to 20 frames per second
    clock.tick(60)
 
# Close the window and quit.
# If you forget this line, the program will 'hang'
# on exit if running from IDLE.
pygame.quit()


Gérer les collisions avec Pygame

https://python.developpez.com/cours/apprendre-python-3/?page=exercices-corriges#L14-2-20

Manipulation de liste

#!/usr/bin/env python # coding: utf-8 maliste = [10, 18, 4, 20, 12, 16] def minMaxMoy(liste) : # initialisation mini, maxi, somme = liste[0], liste[0], 0.0 # boucle sur chaque élément de la liste for i in liste: if i < mini : mini = i if i > maxi : maxi = i somme += i # calcul de la moyene moyenne = somme / len(liste) # retourner les résultats return (mini, maxi, moyenne) resultat = minMaxMoy(maliste) print(resultat)

Faire un dé à 5 face

#!/usr/bin/env python # coding: utf-8 import random def de(face): nb_aleatoire = random.randint(1,face) print(nb_aleatoire) de(5)

import random print(random.randint(1,5))

Tutoriel au choix

Débuter avec Python

Cours de Python (developpez.com)

Introduction à Python (openclassrooms.com)

Présentation du langage Python

Domaines d'application

Le prototypage rapide d'applications. L'idée générale est de commencer par écrire une application en Python, de la tester (ou de la faire tester par le client pour d'éventuelles modifications du cahier des charges). Trois cas peuvent alors se présenter:

Sinon, il est toujours possible de réécrire tout le programme, en utilisant la version Python comme un brouillon.

Les performances ne sont pas satifaisantes, mais l'analyse de l'exécution du programme (à l'aide du profiler de Python) montre que l'essentiel du temps d'exécution se passe dans une petite partie du programme. Les fonctions, ou les types de données, correspondants sont alors réécrits en C ou en C++, sans modification du reste du programme.

Les performances sont satisfaisantes, après optimisation éventuelle du code Python. On livre alors le produit tel quel au client.

Le calcul scientifique et l'imagerie. Python ne sert alors pas à écrire les algorithmes, mais à combiner et mettre en oeuvre rapidement des librairies de calcul écrites en langage compilé (C, C++, Fortran, Ada,...).

La réalisation d'interfaces graphiques utilisateurs.

L'accès aux bases de données (relationnelles).

Tous les développement liés à l'Internet et en particulier au Web: scripts CGI, navigateurs Web, moteurs de recherche, agents intelligents, objets distribués...

Les scripts d'administration système ou d'analyse de fichiers textuels.

L'apprentissage de la programmation objet.

Caractéristiques du langage

Python est un langage qui continue à évoluer, soutenu par une communauté d'utilisateurs enthousisates et responsables, dont la plupart sont des supporters du logiciel libre. Parallèlement à l'interpréteur principal, écrit en C et maintenu par le créateur du langage, un deuxième interpréteur, écrit en Java, est en cours de développement.

La librairie standard de Python, et les paquetages contribués, donnent accès à une grande variété de services: chaînes de caractères et expressions régulières, services UNIX standard (fichiers, pipes, signaux, sockets, threads...), protocoles Internet (Web, News, FTP, CGI, HTML...), persistence et bases de données, interfaces graphiques.

Python est extensible: comme Tcl ou Guile, on peut facilement l'interfacer avec des librairies C existantes. On peut aussi s'en servir comme d'un langage d'extension pour des systèmes logiciels complexes.

Comme Scheme ou SmallTalk, Python est dynamiquement typé. Tout objet manipulable par le programmeur possède un type bien définit à l'exécution, qui n'a pas besoin d'être déclaré à l'avance.

Python est dynamique (l'interpréteur peut évaluer des chaînes de caractères représentant des expressions ou des instructions Python), orthogonal (un petit nombre de concepts suffit à engendrer des constructions très riches), reflectif (il supporte la métaprogrammation, par exemple la capacité pour un objet de se rajouter ou de s'enlever des attributs ou des méthodes, ou même de changer de classe en cours d'exécution) et introspectif (un grand nombre d'outils de développement, comme le debugger ou le profiler, sont implantés en Python lui-même).

Python intègre, comme Java ou les versions récentes de C++, un système d'exceptions, qui permettent de simplifier considérablement la gestion des erreurs.

Python est orienté-objet. Il supporte l'héritage multiple et la surcharge des opérateurs. Dans son modèle objets, et en reprenant la terminologie de C++, toutes les méthodes sont virtuelle.

Python est (optionnellement) multi-threadé.

Il n'y a pas de pointeurs explicites en Python.

Python gère ses ressources (mémoire, descripteurs de fichiers...) sans intervention du programmeur, par un mécanisme de comptage de références (proche, mais différent, d'un garbage collector).

La syntaxe de Python est très simple et, combinée à des types de données évolués (listes, dictionnaires,...), conduit à des programmes à la fois très compacts et très lisibles. A fonctionnalités égales, un programme Python (abondament commenté et présenté selon les canons standards) est souvent de 3 à 5 fois plus court qu'un programme C ou C++ (ou même Java) équivalent, ce qui représente en général un temps de développement de 5 à 10 fois plus court et une facilité de maintenance largement accrue.

Python convient aussi bien à des scripts d'une dizaine de lignes qu'à des projets complexes de plusieurs dizaines de milliers de lignes.

Python est gratuit, mais on peut l'utiliser sans restriction dans des projets commerciaux.

Python est portable, non seulement sur les différentes variantes d'UNiX, mais aussi sur les OS propriétaires.

du 16 au 27 octobre 2017

TODO

Voir pour exercice sur Base de données relationnelle