door michael poncet 5 jaren geleden
402
Meer zoals dit
1 kit Raspberry Pi pour 5 personnes
1 thymio par groupe
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
http://www.blogdumoderateur.com/exemples-trello/
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.
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
sudo apt install chromium-browser
sudo apt update ; sudo apt upgrade ; sudo apt install filezilla
depuis https://slack.com/intl/fr-fr/downloads/linux
bicyclist
triangular_flag
muscle
books
green flag
star
thumbs up
Reprendre le fil rouge (NodeMcu) en développant un clone de Thingspeak de A à Z
Développer une API sur le VPS qui reçoit les données du NodeMCU
Restructurer le projet "thinkspeak"
Convertir les anciens projets qui utilisent des fichers CSV
Re développer thingspeak.com avec BD
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
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
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
"
"Click RGB
"
"";
String pageRGB = ""
"
Pilotage de la LED depuis un navigateur web en utilisant un serveur web sur le NodeMCU
#include
"
"";
//////////////////////////////////////////////////////////////////////////////////////////////////
// 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.