diff --git a/Fritzing/Adafruit ADS1115 16Bit I2C ADC.fzpz b/Fritzing/Adafruit ADS1115 16Bit I2C ADC.fzpz
new file mode 100644
index 0000000..7a2eb52
Binary files /dev/null and b/Fritzing/Adafruit ADS1115 16Bit I2C ADC.fzpz differ
diff --git a/Fritzing/README.md b/Fritzing/README.md
new file mode 100644
index 0000000..5e89c11
--- /dev/null
+++ b/Fritzing/README.md
@@ -0,0 +1,66 @@
+# Fritzing, super petit logiciel pour faire sa documentation électronique
+zf200126.1137
+
+
+## Fritzing
+
+Quand on travail avec un NodeMCU on doit quasiment systématiquement ajouter des composants à notre NodeMCU. Le problème, c'est la documentation !
+Car c'est tellement facile d'ajouter juste une petite résistance de pull-up ou un petit switch, qu'après quelques semaines on ne se souvient plus comment on l'a fait. C'est là que Fritzing intervient, hyper simple à utiliser, on a très rapidement notre breadboard avec le NodeMCU et ses petits composants qui vont bien. Après hop, un sauvetage du schéma et notre documentation est faite sans s'être rendu compte ;-)
+
+
+### Le logiciel
+
+Il se trouve ici:
+
+http://fritzing.org/home/
+
+
+#### Sous MAC
+
+ATTENTION: Sous MAC OS, il faut le *lancer* en ligne de commande si on ne veut pas de problème avec les mise à jour des composants !
+
+```
+/Applications/Fritzing.app/Contents/MacOS/Fritzing
+```
+
+## Les composants qui vont bien
+
+Ce qui est bien avec Fritzing, c'est que l'on peut ajouter facilement des composants et comme Fritzing est le standard des bricoleurs du dimanche, il y a toujours quelqu'un qui a dessiné le composant que l'on recherche.
+
+
+### NodeMCU V3 (le notre à 2 balles)
+
+https://github.com/roman-minyaylov/nodemcu-v3-fritzing/blob/master/NodeMCUv3%20Lolin.fzpz
+
+
+### Le petit PCB ½ breadboard perma-proto d'Adafruit
+
+https://www.distrelec.ch/fr/platine-de-connexion-de-circuit-imprime-perma-proto-demi-taille-simple-adafruit-1609-breadboard-perma-proto/p/30091149?queryFromSuggest=true
+https://github.com/adafruit/Fritzing-Library/blob/master/parts/Adafruit%20PermaProto%20Mint%20Tin%20Size%20Breadboard.fzpz
+
+
+### Le petit amplificateur audio 2.5W d'Adafruit
+
+https://www.distrelec.ch/fr/amplificateur-audio-classe-adafruit-2130-audio-amplifier/p/30091173?q=amplificateur+adafruit&sort=Price:asc&page=1&origPos=6&origPageSize=50&simi=97.36
+https://www.adafruit.com/product/2130
+https://image.easyeda.com/components/540ba5cd627a492b9b03d3385bf39a9b.png
+https://github.com/adafruit/Fritzing-Library/blob/master/parts/Adafruit%20PAM8302.fzpz
+
+
+### Adafruit
+
+https://github.com/adafruit/Fritzing-Library
+https://blog.adafruit.com/category/fritzing-2/
+http://fritzing13.rssing.com/chan-5814158/latest.php
+
+
+
+
+
+
+
+
+
+
+
+.
diff --git a/Mesures/ADC/ADS1115/0_btn_flipflop.lua b/Mesures/ADC/ADS1115/0_btn_flipflop.lua
new file mode 100644
index 0000000..3894bf7
--- /dev/null
+++ b/Mesures/ADC/ADS1115/0_btn_flipflop.lua
@@ -0,0 +1,26 @@
+-- Petit scripts pour faire un flip flop avec le bouton et la led du nodemcu
+-- Très intéressant la techno utilisée ici pour enlever les rebonds du micro switch
+-- dans la variable b se trouve l'heure à laquelle l'interruption est arrivée, il suffit juste alors de lui mettre un petit délai de 300mS
+
+print("\n 0_btn_flipflop.lua zf200119.1527 \n")
+
+gpio.write(zLED,1)
+gpio.mode(zLED,gpio.OUTPUT)
+gpio.mode(zBTN,gpio.INT)
+
+d=tmr.now()
+
+function zled (a,b,c)
+ if verbose then print("a: "..a..",b: "..b..",c: "..c) end
+ if b-d > 300*1000 then
+ if verbose then
+ gpio.write(zLED,1) verbose=false
+ else
+ gpio.write(zLED,0) verbose=true
+ end
+ if verbose then print(gpio.read(zLED)) end
+ d=b
+ end
+end
+
+gpio.trig(zBTN, "down", zled)
diff --git a/Mesures/ADC/ADS1115/0_cron.lua b/Mesures/ADC/ADS1115/0_cron.lua
new file mode 100644
index 0000000..b43d674
--- /dev/null
+++ b/Mesures/ADC/ADS1115/0_cron.lua
@@ -0,0 +1,20 @@
+-- Petit script pour faire office de crontab pour les mesures
+print("\n 0_cron.lua zf200119.1436 \n")
+
+cron1=tmr.create()
+cron1:alarm(20*1000, tmr.ALARM_AUTO, function()
+ if verbose then print("cron1........................") end
+ if verbose then gpio.write(zLED, gpio.LOW) tmr.delay(10000) gpio.write(zLED, gpio.HIGH) end
+
+ f = "0_htu21d.lua" if file.exists(f) then dofile(f) end
+
+ zurl = thingspeak_url.."field1="..tostring(ztemp1).."&field2="..tostring(zhum1)
+
+ f = "0_send_data.lua" if file.exists(f) then dofile(f) end
+
+ ztemp1=nil zhum1=nil
+
+ if verbose then print(node.heap()) end
+ collectgarbage()
+ if verbose then print(node.heap()) end
+end)
diff --git a/Mesures/ADC/ADS1115/0_htu21d.lua b/Mesures/ADC/ADS1115/0_htu21d.lua
new file mode 100644
index 0000000..4eff8ae
--- /dev/null
+++ b/Mesures/ADC/ADS1115/0_htu21d.lua
@@ -0,0 +1,43 @@
+-- Lit le capteur I2C HTU21D de mesure d'humidité et de température
+-- https://github.com/zuzu59/NodeMCU_Lua/tree/master/Mesures/humidity/bolo-thingspeak/docu/HTU21D.txt
+
+function readHTU21D()
+ if verbose then print("\n 0_htu21d.lua zf200119.1517 \n") end
+
+ id = 0 sda = 5 scl = 6 addr = 0x40
+ HUMIDITY = 0xE5 TEMPERATURE = 0xE3
+ i2c.setup(id, sda, scl, i2c.SLOW) sda = nil scl = nil
+
+ function read_HTU21D(zreg, zdelay)
+ i2c.start(id) i2c.address(id, addr, i2c.TRANSMITTER)
+ i2c.write(id, zreg) i2c.stop(id)
+ i2c.start(id) i2c.address(id, addr, i2c.RECEIVER)
+ tmr.delay(zdelay)
+ r = i2c.read(id,3) i2c.stop(id)
+ return r
+ end
+
+ function readTemp()
+ r = read_HTU21D(TEMPERATURE, 50000)
+ r = (bit.band((bit.lshift(string.byte(r,1),8)+string.byte(r,2)),0xfffc)*17572)/65536-4685
+ return tonumber(string.format("%.1f", tostring(r/100)))
+ end
+
+ function readHumi()
+ r = read_HTU21D(HUMIDITY, 16000)
+ r = (bit.band((bit.lshift(string.byte(r,1),8)+string.byte(r,2)),0xfffc)*12500)/65536-600
+ return tonumber(string.format("%.1f", tostring(r/100)))
+ end
+
+ ztemp1=readTemp() zhum1=readHumi()
+ if verbose then print("Temperature: "..ztemp1.." °C") end
+ if verbose then print("Humidity: "..zhum1.." %") end
+
+ id=nil sda=nil scl=nil addr=nil HUMIDITY=nil TEMPERATURE=nil r=nil
+ read_HTU21D=nil readTemp=nil readHumi=nil readHTU21D=nil
+ if verbose then print(node.heap()) end
+ collectgarbage()
+ if verbose then print(node.heap()) end
+end
+
+readHTU21D()
diff --git a/Mesures/ADC/ADS1115/0_send_data.lua b/Mesures/ADC/ADS1115/0_send_data.lua
new file mode 100644
index 0000000..bb5e2fc
--- /dev/null
+++ b/Mesures/ADC/ADS1115/0_send_data.lua
@@ -0,0 +1,24 @@
+-- Petit script pour envoyer les valeurs de température sur un serveur WEB via un HTTP GET
+
+function send_data()
+ if verbose then print("\n 0_send_data.lua zf200119.1518 \n") end
+
+ if verbose then print("send_data_web: ") end
+ if verbose then print(zurl) end
+
+ http.get(zurl, nil, function(code, data)
+ if (code < 0) then
+ if verbose then print("HTTP request failed") end
+ if verbose then print("zuzu", code, data) end
+ else
+ if verbose then print(code, data) end
+ end
+ zurl=nil
+ end)
+ zurl=nil send_data=nil
+ if verbose then print(node.heap()) end
+ collectgarbage()
+ if verbose then print(node.heap()) end
+end
+
+send_data()
diff --git a/Mesures/ADC/ADS1115/README.md b/Mesures/ADC/ADS1115/README.md
new file mode 100644
index 0000000..83646b7
--- /dev/null
+++ b/Mesures/ADC/ADS1115/README.md
@@ -0,0 +1,295 @@
+# Tests et découverte du petit breakout ADS1115, convertisseur analogique digital 16 bits 4x entrées
+
+Petit projet pour tester et découvrir cd petit bijou qu'est le breakout ADS1115, convertisseur analogique digital 16 bits 4x entrées utilisable en I2C.
+
+

+
+Module ADS1115
+
+
+
+## Autres utilisations de ce projet
+
+On peut très bien *enregistrer* d'autres *mesures* comme par exemple, une consommation électrique, production solaire ou débit d'eau d'une douche. Il y a très peu de lignes à modifier pour le faire. C'est donc la base de l'enregistrement pour pleins de mesures en domotique ;-)
+
+
+
+
+## Avantages de travailler avec langage interprété (Lua) VS compilé (Arduino C++)
+
+On peut voir ici, avec ce projet assez complet, toutes les possibilités offertes de la programmation d'un NodeMCU en LUA, en mode événementiel.
+Choses qui ne seraient pas possible si on l'avait fait en C++ (mode Arduino), comme par exemple:
+
+* configuration du WIFI via une page WEB servie par le NodeMCU (pas besoin de brancher un interface USB/TTL)
+* serveur WEB *Active Server Pages ZYX*, permet de faire des pages HTML *dynamiques* avec du code LUA *in line*. Les pages HTML sont *sauvées* dans le système de fichiers de la FLASH du NodeMCU et *interprétées au vol* lors de la *lecture*
+* serveur WEB pour l'affichage de l'humidité et de la température
+* mini WEB IDE, modification du code source en remote directement depuis une page WEB, pas besoin d'IDE
+* serveur TELNET, utilisation de la console en remote pour le dépannage (mise à jour du code centralisée)
+* crontab, horloge pour les mesures
+
+Toutes les fonctions sont bien séparées dans des scripts .lua, cela *complexifie* le projet mais cela facilite la portabilité entre les projets et aussi sa mise au point.
+
+
+## Principes de mesures
+
+On utilise un tout petit capteur low cost, le **xxx**, mesure de xxx sur bus I2C.
+
+

+
+Module ADS1115
+
+

+
+Broches ADS1115
+
+Qui ne coûte que 1.5$
+
+https://www.aliexpress.com/item/32850495005.html
+
+
+Présentation:
+
+https://learn.adafruit.com/adafruit-4-channel-adc-breakouts/downloads
+
+Datasheet:
+
+https://cdn-shop.adafruit.com/datasheets/ads1115.pdf
+
+
+### Schéma
+
+

+
+Schéma de connexion à 4x fils très simple
+
+
+

+
+Et son PCB (breadboard)
+
+
+

+
+Banc test de Mesures
+
+
+
+
+
+# ATTENTION: le reste de ce README n'est pas tout à fait juste, il a été emprunté provisoirement à un autre projet ! zf200126.1124
+
+
+
+
+
+
+
+## Parties principales du code
+Le corps du projet se trouve dans ces 4x fichiers !
+
+* secrets_project.lua
+* 0_htu21d.lua
+* 0_send_data.lua
+* 0_cron.lua
+
+
+### Les secrets du projet
+
+Dans ce fichier se trouvent les *secrets* du projet qui ne doivent pas se retrouver sur GitHub, mais qui peuvent aussi être différents si on *duplique* son projet dans différents *lieux* (mesure à Lausanne et Renens par exemple).
+
+```
+if node.chipid() == 6734851 then node_id = "sonoff_1" zLED=7 end
+if node.chipid() == 16110605 then node_id = "sonoff_2" zLED=7 end
+if node.chipid() == 3049119 then node_id = "adc_1" end
+if node.chipid() == 3048906 then
+ node_id = "bolo_1"
+ thingspeak_url="http://api.thingspeak.com/update?api_key=kkk&"
+end
+if node.chipid() == 3049014 then
+ node_id = "tst_temp_1"
+ thingspeak_url="http://api.thingspeak.com/update?api_key=kkk&"
+end
+```
+
+C'est ici que l'on met l'*url* avec son *token* utilisé par *ThingSpeak*
+ThingSpeak
+
+On met aussi ici l'*identification* du NodeMCU de la mesure afin de pouvoir reconnaitre les différents *points* de mesure dans un même lieu. Chaque NodeMCU à son *propre* numéro de *série* !
+
+
+### La mesure de température et d'humidité
+
+On accède au capteur de mesure de température et d'humidité HTU21D très simplement (pas besoin de lib) au moyen de commandes de base I2C:
+
+i2c.start, i2c.stop, i2c.address, i2c.write, i2c.read
+
+```
+function read_HTU21D(zreg, zdelay)
+ i2c.start(id) i2c.address(id, addr, i2c.TRANSMITTER)
+ i2c.write(id, zreg) i2c.stop(id)
+ i2c.start(id) i2c.address(id, addr, i2c.RECEIVER)
+ tmr.delay(zdelay)
+ r = i2c.read(id,3) i2c.stop(id)
+ return r
+end
+```
+
+
+### L'envoi des mesures dans le Cloud ThingSpeak
+
+Les données de mesures sont simplement envoyées sur ThingSpeak au moyen d'une *requête* HTML de type *GET*:
+
+On peut le faire directement depuis son browser pour des tests par exemple: envoi des valeurs température de 12˚ et humidité 45%:
+
+```
+https://api.thingspeak.com/update?api_key=kkk&field1=12&field1=45
+```
+
+Construction de l'url d'envoi en Lua:
+
+```
+zurl=thingspeak_url.."field1="..tostring(ztemp1).."&field2="..tostring(zhum1)
+send_temp()
+```
+
+
+### L'horloge des mesures
+
+Finalement il faut *envoyer* au moyen d'un *timer* toutes les x secondes les mesures de températures au Cloud ThingSpeak
+
+```
+cron1=tmr.create()
+cron1:alarm(20*1000, tmr.ALARM_AUTO, function()
+ print("cron1........................")
+ ztemp1=readTemp()
+ zhum1=readHumi()
+ print("Temperature: "..ztemp1.." °C")
+ print("Humidity: "..zhum1.." %")
+ zurl=thingspeak_url.."field1="..tostring(ztemp1).."&field2="..tostring(zhum1)
+ send_temp()
+end)
+```
+
+
+
+## Installation
+
+Il faut *flasher* le NodeMCU avec ce firmware:
+
+https://github.com/zuzu59/NodeMCU_Lua/blob/master/Firmware/nodemcu-master-19-modules-2019-12-31-16-40-12-float.bin
+
+Qui contient ces modules:
+```
+adc ads1115 bit enduser_setup file gpio http i2c mqtt net node ow rtctime sjson sntp tmr uart wifi ws2812
+```
+
+C'est un firmware passe partout, il contient trop de modules pour ce projet mais qui est très pratique !
+
+
+
+## Utilisation
+
+
+### Configuration du WIFI du NodeMCU_Lua
+L'accès au NodeMCU se fait via des pages WEB distribuée depuis son petit serveur WEB ASP (Active Server Pages) avec l'interprétation du code Lua inline au vol !
+
+Lors du démarrage du NodeMCU il va chercher à se connecter sur le WIFI qu'il trouve dans sa configuration, fichier *eus_params.lua*. S'il n'y parvient pas au bout de 15 secondes, il va démarrer un petit serveur WIFI, **AP: NodeMCU_node_id**, on peut alors utiliser le NodeMCU sans avoir besoin d'une *connexion* Internet, mais bien entendu sans envoi de données dans le Cloud.
+
+On se connecte alors avec un browser WEB sur l'adresse:
+
+```
+http://192.168.4.1
+```
+
+On choisit *Wifi setup* et enfin, au milieu de la page, on confirme l'action en cliquant sur *Ok* (ceci pour éviter que l'on bascule dans le mode setup WIFI par erreur).
+
+Après quelques secondes un nouveau serveur WIFI va démarrer avec une procédure de configuration du WIFI du NodeMCU, **AP: Setup Gadget** xxx, on se connecte dessus avec son ordinateur pour aller à nouveau *voir* la page:
+
+```
+http://192.168.4.1
+```
+
+Après configuration du WIFI, l'adresse IP allouée au NodeMCU devrait apparaître en haut de la page.
+
+Le NodeMCU redémarre et est prêt à envoyer les mesures sur le Cloud, s'il est configuré correctement pour le bon compte ThingSpeak !
+
+
+
+### Configuration de ThingSpeak
+
+Afin de pouvoir utiliser ThingSpeak, il faut *créé* un *channel*, le configurer pour lui indiquer que nous voulons deux champs (température et humidité) et surtout récupérer le token du channel pour le mettre dans le fichier *secrets_projet.lua*
+
+
+
+### Visualisation des données dans ThingSpeak
+
+On peut voir alors arriver, toutes les 20 secondes, les mesures de température et d'humidité sur ThingSpeak.
+
+

+Exemple de sortie sur ThingSpeak
+
+On peut facilement modifier l'affichage des graphiques au moyen du petit *crayon* en haut à droite de chaque graphique
+
+Très vite on va s'apercevoir qu'il faudra augmenter le temps entre chaque mesures, passer à 300 secondes au lieu de 20 secondes par exemple.
+
+
+
+### Exportation des données en CSV depuis ThingSpeak
+
+On peut très facilement exporter après coup les données du channel de ThingSpeak en CSV pour en faire un rapport dans un tableur par exemple.
+
+
+
+### Distribution des rôles de NodeMCU
+
+Comme on peut avoir plusieurs points de mesures à différents endroit dans le local, il n'y a qu'un seul fichier de *secrets*. C'est dans ce fichier, *secrets_projet.lua*, qu'il y a l'information de l'url de ThingSpeak ains que le token pour le bon channel !
+
+
+
+### Affichage des températures/humidité en local sur le NodeMCU
+
+On peut lire la température et l'humidité directement sur le NodeMCU au moyen de cette url (il faut modifier l'adresse IP du NodeMCU en question):
+
+```
+http://192.168.0.xxx/disp_temp.html
+```
+
+
+### Affichage du petit serveur web du NodeMCU_Lua
+
+Chaque NodeMCU a son propre serveur WEB, on peut l'accéder simplement depuis son adresse IP:
+
+```
+http://192.168.0.xxx
+```
+
+
+### Modification du code source du NodeMCU en remote
+
+On peut directement modifier le code source Lua du NodeMCU en remote avec ce petit WEB IDE (il faut le *lancer* avant depuis la home page du NodeMCU !):
+
+```
+http://192.168.0.xxx:88
+```
+
+
+### Utilisation de la console du NodeMCU en remote
+
+Très pratique pour le debug, on peut accéder à la console du NodeMCU en remote avec telnet:
+
+```
+telnet -r 192.168.0.xxx
+```
+
+ou sur MAC
+
+```
+telnet -rN 192.168.0.xxx
+```
+
+C'est aussi depuis ce moyen que l'on peut mettre, à distance, à jour le code Lua du NodeMCU de manière centralisée et automatique (luatool.py)
+
+
+
+
+zf200126.1127
diff --git a/Mesures/ADC/ADS1115/_secrets_project.lua_ b/Mesures/ADC/ADS1115/_secrets_project.lua_
new file mode 100644
index 0000000..debb4a4
--- /dev/null
+++ b/Mesures/ADC/ADS1115/_secrets_project.lua_
@@ -0,0 +1,33 @@
+-- Petit script pour configurer les secrets dans ce projet
+-- et que l'on n'aimerait pas être exportés sur Internet (github)
+-- Il faut donc modifier le .gitignore avec secrets*.lua
+-- il faut le renommer en 'secrets_project.lua' et sera exécuté
+-- par 'wifi_init.lua' au moment du boot
+
+function secrets_project()
+ print("\n secrets_project.lua zf20018.1503 \n")
+
+ zLED=4 -- NodeMCU
+ --zLED=7 -- SonOff
+ zRELAY=6 -- SonOff
+
+ node_id = "generic"
+ if node.chipid() == 6734851 then node_id = "sonoff_1" zLED=7 end
+ if node.chipid() == 16110605 then node_id = "sonoff_2" zLED=7 end
+ if node.chipid() == 3049119 then node_id = "adc_1" end
+ if node.chipid() == 3048906 then
+ node_id = "bolo_1"
+ thingspeak_url="http://api.thingspeak.com/update?api_key=kkk&"
+ end
+ if node.chipid() == 3049014 then
+ node_id = "tst_temp_1"
+ thingspeak_url="http://api.thingspeak.com/update?api_key=kkk&"
+ end
+ print("node_id: "..node_id)
+end
+secrets_project()
+secrets_project=nil
+
+--[[
+=node.chipid()
+]]
diff --git a/Mesures/ADC/ADS1115/_secrets_wifi.lua_ b/Mesures/ADC/ADS1115/_secrets_wifi.lua_
new file mode 100644
index 0000000..3728ca3
--- /dev/null
+++ b/Mesures/ADC/ADS1115/_secrets_wifi.lua_
@@ -0,0 +1,18 @@
+-- Petit script pour configurer les secrets utilisés pour le wifi
+-- et que l'on n'aimerait pas être exportés sur Internet (github)
+-- Il faut donc modifier le .gitignore avec eus_params* et secret*
+-- il faut le renommer en 'secrets_wifi.lua' et sera exécuté
+-- par 'wifi_init.lua' une fois pour la configuration du WIFI
+
+function secrets_wifi()
+ print("\n secrets_wifi.lua zf191222.2002 \n")
+ f= "eus_params.lua" if file.exists(f) then p = dofile(f) end
+ if p ~= nil then
+ cli_ssid = p.wifi_ssid cli_pwd = p.wifi_password p=nil
+ else
+ cli_ssid = "" cli_pwd = ""
+ end
+ ap_ssid="NodeMCU" ap_pwd="ppp"
+end
+
+secrets_wifi()
diff --git a/Mesures/ADC/ADS1115/_zremote_cmd.txt b/Mesures/ADC/ADS1115/_zremote_cmd.txt
new file mode 100644
index 0000000..a1f0dc0
--- /dev/null
+++ b/Mesures/ADC/ADS1115/_zremote_cmd.txt
@@ -0,0 +1,287 @@
+# Quelques commandes remote (luatool) à envoyer avec le plugin Atom-IDE-terminal de l'éditeur Atom
+# zf200119.1043
+
+
+Todo à faire pour ce projet !
+
+- faire que send_data et read_temp soient lancés à la volée afin d'économiser de la RAM quand ce n'est pas utilisé
+- arrêter de demander de connecter le WIFI automatiquement en mode station juste après le boot dans la config wifiinit (automatic connect)
+- lancement ou arrêt du WEBIDE via la home page
+- le wifi setup ne fonctionne toujours pas quand il y a déjà un ap de connecté (problème du reboot quand adrs ip ok)!
+- trouver un moyen pour configurer la lED dans initz.lua sans le rendre dangereux en cas de problème (éviter le reflashing en cas de reboot loop)
+- utiliser le bouton pour piloter le verbose
+
+v- ajouter fonction restart dans z_index.html (ATTENTION avec un argument restart, pas besoin de faire une page restart.html !)
+v- ajouter l'affichage du node_id dans z_index.html
+v- ajouter le web_srv2 dans boot au lieu de boot2
+v- ajouter un état du RELAY et de la LED dans z_index.html
+v- ajouter une page affichage variables globales
+v- améliorer api_sonoff.html, il faut ajouter 'home' sur la page
+v- améliorer le résultat de api_sonoff.html, il faut sortir l'état des IO lors d'un changement comme confirmation
+v- clignoter la led à chaque mesure en fonction de verbose
+v- copier secrets_project et secrets_wifi dans _secrets_project_ _secrets_wifi_ pour la documentation
+v- déplacer le mode AP dans wifi_init
+v- enlever la ligne wifi init dans z_index.html
+v- faire la page web service pour allumer la LED
+v- faire la page web service pour allumer le relay
+v- garder variable node_id pour identification après poweron général, reattribution adrs ip sur modem 4G
+v- if verbose print partout dans *.lua
+v- passer à 10 secondes la seconde chance
+v- passer à 15x les tentatives de connexions au WIFI
+v- terminer la page .html affichage de la température et de l'humidité
+v- vérifier le fonctionnement d'allumer la LED, car ne marche plus !
+x- mettre ZLED2 et ZRELAY dans secrets_project
+x-ajouter argument ok dans wifi_init.html (sécurité)
+
+
+
+
+
+# si luatool ne marche pas sur le MAC, il faut lire ceci:
+# https://docs.google.com/document/d/1q64uK3IMOgEDdKaIAttbYuFt4GuLQ06k3FLeyfCsWLg/edit#heading=h.bmefcu67uwj0
+
+# raccourcis clavier
+# CTRL+ALT+ENTER envoie au terminal la ligne de l'éditeur
+# SHIT+CTRL+` ouvre le terminal (attention, ne pas oublier de copier le *path* dans le *tree* et le changer)
+# ALT+CMD+F bascule entre le terminal et l'éditeur
+
+# définitions à faire AVANT !
+export luatool_tty="/dev/cu.wchusbserial1410"
+
+export zIP="192.168.0.182"
+export zport="23"
+
+export zIP="localhost"
+export zport="2323"
+ATTENTION: voir les tunnels tout à la fin !
+
+
+# ouvrir et fermer (ALT+N+.) une session telnet sur le NodeMCU avec l'adresse zIP)
+telnet -rN $zIP $zport
+~.
+--node.restart()
+collectgarbage()
+=node.heap()
+for k,v in pairs(_G) do print(k,v) end
+
+
+# commandes lua pour ce projet
+export zIP="192.168.0.152"
+export zport="23"
+./luatool.py --ip $zIP:$zport -f z_index.html
+
+./luatool.py --ip $zIP:$zport -f 0_send_data.lua
+./luatool.py --ip $zIP:$zport -f 0_cron.lua
+./luatool.py --ip $zIP:$zport -f 0_htu21d.lua
+
+./luatool.py --ip $zIP:$zport -f api_sonoff.html
+http://192.168.0.182
+
+
+telnet -rN $zIP $zport
+verbose=false
+~.
+
+=node.heap()
+collectgarbage()
+=node.heap()
+
+
+dofile("dir.lua")
+dir()
+for k,v in pairs(_G) do print(k,v) end
+dofile("wifi_info.lua")
+
+node.restart()
+ping -c 10 $zIP
+
+./luatool.py --ip $zIP:$zport -f dir.lua
+
+
+
+verbose=true
+verbose=false
+zsort_rssi() zshow()
+
+
+#commandes luatool pour ce projet le .137 est à jour avec la nouvelle version du wifi !
+~.
+./luatool.py --ip $zIP:$zport -l
+./luatool.py --ip $zIP:$zport -f wifi_init.lua
+
+
+./luatool.py --ip $zIP:$zport -f secrets_wifi.lua
+./luatool.py --ip $zIP:$zport -f initz.lua -t init.lua
+./luatool.py --ip $zIP:$zport -f boot.lua
+./luatool.py --ip $zIP:$zport -f boot2.lua
+./luatool.py --ip $zIP:$zport -f wifi_init.lua
+./luatool.py --ip $zIP:$zport -f set_time.lua
+./luatool.py --ip $zIP:$zport -f wifi_info.lua
+./luatool.py --ip $zIP:$zport -f c.lua
+./luatool.py --ip $zIP:$zport -f cat.lua
+./luatool.py --ip $zIP:$zport -f flash_led_xfois.lua
+./luatool.py --ip $zIP:$zport -f head.lua
+
+./luatool.py --ip $zIP:$zport -f b.lua
+./luatool.py --ip $zIP:$zport -f web_srv2.lua
+./luatool.py --ip $zIP:$zport -f z_index.html
+
+
+./luatool.py --ip $zIP:$zport -f wifi_get_conf.html
+./luatool.py --ip $zIP:$zport -f wifi_set_conf.html
+
+
+./luatool.py --ip $zIP:$zport -f z_page1.html
+./luatool.py --ip $zIP:$zport -f z_page2.html
+./luatool.py --ip $zIP:$zport -f z_page3.html
+./luatool.py --ip $zIP:$zport -f z_page4.html
+
+./luatool.py --ip $zIP:$zport --delete wifi_ap_start.lua
+./luatool.py --ip $zIP:$zport --delete wifi_cli_conf.lua
+./luatool.py --ip $zIP:$zport --delete wifi_cli_start.lua
+./luatool.py --ip $zIP:$zport --delete dir.lua
+./luatool.py --ip $zIP:$zport --delete initz.lua
+./luatool.py --ip $zIP:$zport --delete wifi_conf.lua
+
+
+
+dofile("wifi_info.lua")
+--node.restart()
+for k,v in pairs(_G) do print(k,v) end
+t=12
+t=nil
+print(pcall(function () print("2"..t) end))
+
+
+
+# ici c'est maintenant ;-)
+~.
+./luatool.py --ip $zIP:$zport -f b.lua
+#./luatool.py --ip $zIP:$zport --zrestart
+telnet -rN $zIP $zport
+zsort_rssi() zshow()
+print(ztrig_rssi)
+ztrig_rssi=-1000
+ztrig_rssi=-90
+
+
+
+# test de la gestion des erreurs
+~.
+./luatool.py --ip $zIP:$zport -f c.lua
+#./luatool.py --ip $zIP:$zport --zrestart
+telnet -rN $zIP $zport
+status, err = pcall(function () dofile("c.lua") end) if status==false then print("Error: ",err) end
+zerr=nil
+zerr=1
+ztmr_tst_err:unregister()
+
+
+
+~.
+./luatool.py --ip $zIP:$zport -f head.lua
+telnet -rN $zIP $zport
+dofile("head.lua")
+zhead("c.lua")
+
+ztmr_tst_err:unregister()
+for k,v in pairs(_G) do print(k,v) end
+
+./luatool.py --ip $zIP --zrestart
+
+
+# faire un cat d'un fichier sur le NodeMCU
+dofile("cat.lua")
+cat("boot2.lua")
+
+
+# commandes luatool
+./luatool.py -h
+./luatool.py --ip $zIP:$zport -i
+./luatool.py --ip $zIP:$zport -l
+./luatool.py --ip $zIP:$zport -f toto.lua -d
+./luatool.py --ip $zIP:$zport --delete toto.lua
+
+
+
+****************************************************************************
+
+
+# création des tunnels ssh
+ATTENTION: dans un premier terminal !
+Pour Bolo à Ruchonnet:
+ssh -t -L 2323:localhost:2323 ubuntu@www.zuzutest.ml ssh -N -L 2323:192.168.8.102:23 ubuntu@localhost -p 20223
+
+Pour le Crêt
+ssh -N -L 2323:192.168.0.137:23 admin@z.zufferey.com -p 1822
+ssh -N -L 2323:192.168.0.122:23 admin@z.zufferey.com -p 1822
+ssh -N -L 2323:192.168.0.118:23 admin@z.zufferey.com -p 1822
+
+ATTENTION: dans un deuxième terminal !
+export zIP="localhost"
+export zport="2323"
+telnet -rN $zIP $zport
+~.
+=node.heap()
+
+verbose=false
+verbose=true
+
+dofile("dir2.lua")
+dir()
+filec("head.lua")
+
+dofile("head.lua")
+zhead("dir2.lua")
+
+dofile("cat.lua")
+cat("head.lua")
+
+~.
+--node.restart()
+=node.heap()
+
+
+status, err = pcall(function () fonction_a_tester() end) if status==false then print("Error: ",err) end
+status, err = pcall(function () toto() end) if status==false then print("Error: ",err) end
+
+
+
+Gestion de la passerelle SSH reverse
+Puis depuis une autre console on peut faire directement pour aller sur l'OpiZ (ici le 20223):
+ssh -t ubuntu@www.zuzutest.ml ssh ubuntu@localhost -p 20223
+
+ou
+
+1ère console
+On établit le tunnel local avec l'OpiZ
+ssh -N -L 20223:localhost:20223 ubuntu@www.zuzutest.ml
+
+
+2ème console, on utilise le tunnel OpiZ en local sur sa machine
+pour aller sur l'OpiZ
+ssh ubuntu@localhost -p 20223
+
+pour copier sa clef SSH depuis un MAC
+./ssh-copy-id -i ~/.ssh/id_rsa.pub 'ubuntu@localhost -p 20223'
+après on devrait pouvoir se connecter sans devoir entrer son password à chaque fois
+ssh ubuntu@localhost -p 20223
+
+ou, on établit un tunnel pour telnet sur un NodeMCU
+ssh -L 2323:192.168.0.137:23 ubuntu@localhost -p 20223
+puis
+telnet -rN localhost 2323
+
+ou, on établit un tunnel pour le rpimonotor sur l'OpiZ
+ssh -N -L 8888:192.168.0.113:8888 ubuntu@localhost -p 20223
+puis
+http://localhost:8888
+
+ou, on établit un tunnel proxy Socket 5 pour le modem 4G HUAWEI sur l'OpiZ
+ssh -N -D 8080 ubuntu@localhost -p 20223
+puis depuis le browser FireFox avec le plugin FoxyProxy Socket 5 sur localhost port 8080
+http://192.168.8.1
+
+
+
+.
diff --git a/Mesures/ADC/ADS1115/api_sonoff.html b/Mesures/ADC/ADS1115/api_sonoff.html
new file mode 100644
index 0000000..969d2f6
--- /dev/null
+++ b/Mesures/ADC/ADS1115/api_sonoff.html
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+ API SonOff
+
+
+ API SonOff zf200118.1812
+ Home...
+<%
+ if _GET.LED == "on" then
+ gpio.write(zLED, gpio.LOW) gpio.mode(zLED, gpio.OUTPUT)
+ zout("LED=".._GET.LED.."
")
+ zout(' Off
')
+
+ end
+ if _GET.LED == "off" then
+ gpio.write(zLED, gpio.HIGH) gpio.mode(zLED, gpio.OUTPUT)
+ zout("LED=".._GET.LED.."
")
+ zout(' On')
+ end
+%>
+<%
+ if _GET.RELAY == "on" then
+ gpio.mode(zRELAY, gpio.OUTPUT) gpio.write(zRELAY, gpio.HIGH)
+ zout("RELAY=".._GET.RELAY.."
")
+ zout(' Off
')
+ end
+ if _GET.RELAY == "off" then
+ gpio.mode(zRELAY, gpio.OUTPUT) gpio.write(zRELAY, gpio.LOW)
+ zout("RELAY=".._GET.RELAY.."
")
+ zout(' On')
+ end
+%>
+
+
diff --git a/Mesures/ADC/ADS1115/boot.lua b/Mesures/ADC/ADS1115/boot.lua
new file mode 100644
index 0000000..6b881d8
--- /dev/null
+++ b/Mesures/ADC/ADS1115/boot.lua
@@ -0,0 +1,20 @@
+-- Scripts à charger après le boot pour démarrer son projet
+
+print("\n boot.lua zf20019.1438 \n")
+
+function boot()
+ verbose = true
+ print("booooooooooot...")
+ print(node.heap()) collectgarbage() print(node.heap())
+
+ f="0_htu21d.lua" if file.exists(f) then dofile(f) end
+ zurl=thingspeak_url.."field1="..tostring(ztemp1).."&field2="..tostring(zhum1)
+ f="0_send_data.lua" if file.exists(f) then dofile(f) end
+ f="0_cron.lua" if file.exists(f) then dofile(f) end
+ f="0_btn_flipflop.lua" if file.exists(f) then dofile(f) end
+
+ --f = "web_ide2.lua" if file.exists(f) then dofile(f) end
+
+ f=nil boot=nil
+end
+boot()
diff --git a/Mesures/ADC/ADS1115/dir.lua b/Mesures/ADC/ADS1115/dir.lua
new file mode 100644
index 0000000..3bef94c
--- /dev/null
+++ b/Mesures/ADC/ADS1115/dir.lua
@@ -0,0 +1,31 @@
+-- fonction dir() pour juste afficher les fichiers avec leur taille
+
+print("\n dir2.lua zf191223.1455 \n")
+
+function dir()
+ local zdir={}
+ local pfile = file.list()
+ for k,v in pairs(pfile) do
+ zdir[#zdir+1] = k..string.rep(" ",24-string.len(k)).." : "..v
+ end
+ table.sort(zdir) for i=1, #zdir do print(zdir[i]) end
+ size_file=nil chksum_file=nil k=nil
+end
+
+dir()
+print("\nusage:")
+print(" dir()")
+
+--[[
+dir()
+dirc()
+filec("dir2.lua")
+
+=node.heap()
+clear_dir()
+=node.heap()
+
+for k,v in pairs(_G) do print(k,v) end
+
+status, err = pcall(function () print(zhash("il était une fois trois petits cochons roses...")) end) if status==false then print("Error: ",err) end
+]]
diff --git a/Mesures/ADC/ADS1115/disp_temp.html b/Mesures/ADC/ADS1115/disp_temp.html
new file mode 100644
index 0000000..87fe6b5
--- /dev/null
+++ b/Mesures/ADC/ADS1115/disp_temp.html
@@ -0,0 +1,23 @@
+
+
+
+
+
+ Affichage de la température et humidité
+
+
+
+ Affichage de la température et humidité 200118.1800
+ Home...
+ <%
+ zout(""..node_id.." 200112.1919
")
+ %>
+
+ <%
+ zout("Température: "..readTemp().." °C
")
+ zout("Humidité: "..readHumi().." %
")
+
+ zout("
RAM: "..node.heap().."
")
+ %>
+
+
diff --git a/Mesures/ADC/ADS1115/docu/ads1115.md b/Mesures/ADC/ADS1115/docu/ads1115.md
new file mode 100644
index 0000000..a4ffdc3
--- /dev/null
+++ b/Mesures/ADC/ADS1115/docu/ads1115.md
@@ -0,0 +1,4 @@
+# Documentation du petit convertisseur ADS1115
+zf200126.1110
+
+https://learn.adafruit.com/adafruit-4-channel-adc-breakouts/downloads
diff --git a/Mesures/ADC/ADS1115/goodies/a.lua b/Mesures/ADC/ADS1115/goodies/a.lua
new file mode 100644
index 0000000..709aa75
--- /dev/null
+++ b/Mesures/ADC/ADS1115/goodies/a.lua
@@ -0,0 +1,49 @@
+print("a start... zf190105.2344")
+
+
+srv:close()
+srv=nil
+
+wifi.setmode(wifi.NULLMODE,true)
+
+print("toto")
+tmr.delay(1*1000*1000)
+print("tutu")
+
+wifi.setmode(wifi.STATIONAP,true)
+
+wifi.sta.config{ssid="", pwd="", auto=true, save=true}
+wifi.sta.autoconnect(1) wifi.sta.connect()
+wifi.ap.config({ ssid = "toto", auth=wifi.OPEN, save=true })
+
+wifi.setmode(wifi.STATION,true)
+
+--wifi.setmode(wifi.STATIONAP)
+--wifi.ap.config({ssid="MyPersonalSSID", auth=wifi.OPEN})
+--enduser_setup.manual(true)
+
+--[[
+srv:close()
+srv=nil
+
+wifi.setmode(wifi.NULLMODE,true)
+
+print("toto")
+a1=tmr.create()
+a1:alarm(10*1000, tmr.ALARM_SINGLE, function()
+ enduser_setup.start(
+ function()
+ print("Connected to WiFi as:" .. wifi.sta.getip())
+ end,
+ function(err, str)
+ print("enduser_setup: Err #" .. err .. ": " .. str)
+ end,
+ print -- Lua print function can serve as the debug callback
+ )
+ print(node.heap()) collectgarbage() print(node.heap())
+ print("tutu")
+end)
+
+]]
+
+
diff --git a/Mesures/ADC/ADS1115/goodies/c.lua b/Mesures/ADC/ADS1115/goodies/c.lua
new file mode 100644
index 0000000..eb2f832
--- /dev/null
+++ b/Mesures/ADC/ADS1115/goodies/c.lua
@@ -0,0 +1,37 @@
+-- Scripts pour tester l'affichage des erreurs quand on se trouve ne remote telnet
+-- source: https://www.lua.org/pil/8.4.html
+-- source: https://riptutorial.com/lua/example/16000/using-pcall
+
+--[[
+Usage:
+après l'avoir lancé on peut faire varier le contenu de la variable zerr pour cérer des erreurs répétitives
+
+Commandes à envoyer via un terminal:
+~.
+./luatool.py --ip $zIP:$zport -f c.lua
+#./luatool.py --ip $zIP:$zport --zrestart
+telnet -rN $zIP $zport
+status, err = pcall(function () dofile("c.lua") end) if status==false then print("Error: ",err) end
+zerr=nil
+zerr=1
+ztmr_tst_err:unregister()
+]]
+
+print("\n c.lua zf191030.1231 \n")
+
+zerr=1
+ztmr_tst_err = tmr.create()
+
+-- le code à tester DOIT être encapsulé dans une fonction
+function zfoo()
+ print("toto: "..zerr)
+end
+
+-- timer pour générer des erreurs répétitives
+ztmr_tst_err:alarm(3*1000, tmr.ALARM_AUTO, function()
+ -- test du code
+ local status, err = pcall(function () zfoo() end) if status==false then print("Error: ",err) end
+end)
+
+
+--
diff --git a/Mesures/ADC/ADS1115/goodies/cat.lua b/Mesures/ADC/ADS1115/goodies/cat.lua
new file mode 100644
index 0000000..8a2e29c
--- /dev/null
+++ b/Mesures/ADC/ADS1115/goodies/cat.lua
@@ -0,0 +1,22 @@
+-- fonction cat() pour afficher le contenu d'un fichier dans la flash
+print("\n cat.lua zf191124.2204 \n")
+
+function zread_line()
+ local zline = ""
+ while true do
+ local t = zf:read(1) if t == nil then return end
+ zline = zline..t
+ if t == "\n" then return string.sub(zline,1,string.len(zline)-1) end
+ end
+end
+
+function cat(zfile)
+ print("\n"..zfile.."\n-------------------------------")
+ zf = file.open(zfile, "r")
+ while true do
+ zline = zread_line() if zline == nil then break end
+ print(zline)
+ end
+ zf:close()
+ print("-------------------------------")
+end
diff --git a/Mesures/ADC/ADS1115/goodies/check_all.sh b/Mesures/ADC/ADS1115/goodies/check_all.sh
new file mode 100644
index 0000000..5bfda14
--- /dev/null
+++ b/Mesures/ADC/ADS1115/goodies/check_all.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+# Petit script pour contrôler en remote les versions d'une grappe de NodeMCU installés
+#zf191226.1241
+
+# crée les tunnels SSH
+source ./make_tunnels.sh go
+
+# On liste les fichiers de chaque nodemcu
+echo -e "th1"
+./luatool.py --ip localhost:$TH1_PORT --list
+
+echo -e "th2"
+./luatool.py --ip localhost:$TH2_PORT --list
+
+echo -e "th3"
+./luatool.py --ip localhost:$TH3_PORT --list
+
+echo -e "th4"
+./luatool.py --ip localhost:$TH4_PORT --list
diff --git a/Mesures/ADC/ADS1115/goodies/dir2.lua b/Mesures/ADC/ADS1115/goodies/dir2.lua
new file mode 100644
index 0000000..bd2fb1a
--- /dev/null
+++ b/Mesures/ADC/ADS1115/goodies/dir2.lua
@@ -0,0 +1,90 @@
+-- fonction dirc() pour calculer le checksum de tous les fichiers sur le NodeMCU !
+-- fonction filec(fichier) pour calculer le checksum d'un seul fichiers sur le NodeMCU !
+
+print("\n dir2.lua zf191124.1602 \n")
+
+function calc_chksum_file()
+ local name_file = list_files[zcmpt1]
+ print(name_file)
+ local size_file = 1 local chksum_file = 0
+ local f = file.open(name_file, "r")
+ while true do
+ local t = f:read(1) if t == nil then break end
+ chksum_file = chksum_file + size_file * string.byte(t)
+ size_file = size_file + 1
+ if size_file%100 == 0 then uart.write(0,".") end
+ end
+ f:close() print("")
+ zdir[#zdir+1]=name_file..string.rep(" ",24-string.len(name_file)).." : "..size_file..", "..chksum_file
+ zcmpt1 = zcmpt1 + 1
+ zrepeat()
+end
+
+function zrepeat()
+ if zcmpt1 <= #list_files then
+-- if zcmpt1 <= 3 then
+ node.task.post(calc_chksum_file)
+ else
+ table.sort(zdir) for i=1, #zdir do print(zdir[i]) end
+ zdir=nil list_files=nil zcmpt1=nil
+ end
+end
+
+function dirc()
+ zdir={} list_files={}
+ local pfile = file.list()
+ for k,v in pairs(pfile) do
+ list_files[#list_files+1]=k
+ end
+ zcmpt1 = 1 zrepeat()
+end
+
+function filec(name_file)
+ print(name_file)
+ local size_file = 1 local chksum_file = 0
+ local f = file.open(name_file, "r")
+ while true do
+ local t = f:read(1) if t == nil then break end
+ chksum_file = chksum_file + size_file * string.byte(t)
+ size_file = size_file + 1
+ if size_file%100 == 0 then uart.write(0,".") end
+ end
+ f:close() print("")
+ print(name_file..string.rep(" ",24-string.len(name_file)).." : "..size_file..", "..chksum_file)
+end
+
+function dir()
+ local zdir={}
+ local pfile = file.list()
+ for k,v in pairs(pfile) do
+ zdir[#zdir+1] = k..string.rep(" ",24-string.len(k)).." : "..v
+ end
+ table.sort(zdir) for i=1, #zdir do print(zdir[i]) end
+ size_file=nil chksum_file=nil k=nil
+end
+
+function clear_dir()
+ dir=nil dir2=nil dirc=nil filec=nil
+ zrepeat=nil calc_chksum_file=nil
+end
+
+dir()
+print("\nusage:")
+print(" dir()")
+print(" dirc()")
+print(" filec('dir2.lua')")
+
+
+--[[
+dir()
+dirc()
+filec("dir2.lua")
+
+=node.heap()
+clear_dir()
+=node.heap()
+
+for k,v in pairs(_G) do print(k,v) end
+
+status, err = pcall(function () print(zhash("il était une fois trois petits cochons roses...")) end) if status==false then print("Error: ",err) end
+]]
diff --git a/Mesures/ADC/ADS1115/goodies/i2c_scanner.lua b/Mesures/ADC/ADS1115/goodies/i2c_scanner.lua
new file mode 100644
index 0000000..6fcfbf4
--- /dev/null
+++ b/Mesures/ADC/ADS1115/goodies/i2c_scanner.lua
@@ -0,0 +1,17 @@
+-- Scanner for I2C devices
+-- http://www.esp8266.com/viewtopic.php?f=19&t=771
+
+print("\n i2c_scanner.lua zf191216.2117 \n")
+
+id=0 sda=5 scl=6
+
+print("start...")
+i2c.setup(id,sda,scl,i2c.SLOW)
+
+for i=0,127 do
+ i2c.start(id)
+ resCode = i2c.address(id, i, i2c.TRANSMITTER)
+ i2c.stop(id)
+ if resCode == true then print("We have a device on address 0x" .. string.format("%02x", i) .. " (" .. i ..")") end
+end
+print("stop...")
diff --git a/Mesures/ADC/ADS1115/goodies/make_tunnels.sh b/Mesures/ADC/ADS1115/goodies/make_tunnels.sh
new file mode 100644
index 0000000..32521b8
--- /dev/null
+++ b/Mesures/ADC/ADS1115/goodies/make_tunnels.sh
@@ -0,0 +1,55 @@
+#!/bin/bash
+# Petit script pour créer tous les tunnels SSH sur les NodeMCU en remote
+# zf191226.1239
+
+#test si l'argument est vide
+if [ -z "$1" ]
+ then
+ echo -e "
+Usage:
+
+source ./make_tunnels.sh go
+
+"
+ read -p "continue ?"
+fi
+
+
+
+
+
+
+# Définition des variables
+export TREMPLIN_SSH=www.zuzutest.ml
+export OPIZ_PORT=20223
+
+export TH1_IP=192.168.8.100
+export TH1_PORT=23001
+export TH2_IP=192.168.8.101
+export TH2_PORT=23002
+export TH3_IP=192.168.8.102
+export TH3_PORT=23003
+export TH4_IP=192.168.8.103
+export TH4_PORT=23004
+
+
+# On tue tous les tunnels ssh
+echo "kill"
+killall -9 ssh
+sleep 3
+
+# On crée le tunnel sur la passerelle ssh 20223
+echo "first"
+ssh -y -y -N -T -L $OPIZ_PORT:localhost:$OPIZ_PORT ubuntu@$TREMPLIN_SSH &
+sleep 3
+
+# On crée tous les tunnels sur les nodemcu
+echo "second"
+ssh -y -y -N -T -L $TH1_PORT:$TH1_IP:23 ubuntu@localhost -p $OPIZ_PORT &
+ssh -y -y -N -T -L $TH2_PORT:$TH2_IP:23 ubuntu@localhost -p $OPIZ_PORT &
+ssh -y -y -N -T -L $TH3_PORT:$TH3_IP:23 ubuntu@localhost -p $OPIZ_PORT &
+ssh -y -y -N -T -L $TH4_PORT:$TH4_IP:23 ubuntu@localhost -p $OPIZ_PORT &
+sleep 3
+
+echo "end"
+ps ax |grep ssh
diff --git a/Mesures/ADC/ADS1115/goodies/set_time.lua b/Mesures/ADC/ADS1115/goodies/set_time.lua
new file mode 100644
index 0000000..8b12174
--- /dev/null
+++ b/Mesures/ADC/ADS1115/goodies/set_time.lua
@@ -0,0 +1,36 @@
+-- Scripts pour régler l'horloge quand on est connecté en WIFI
+-- Permet aussi de 'compresser' le unix time afin de prendre moins de place dans les strings
+
+print("\n set_time.lua zf191030.2026 \n")
+
+--source: https://www.freeformatter.com/epoch-timestamp-to-date-converter.html
+
+ztime2019 = 1546300800 -- Unix time pour le 1.1.2019
+
+function set_time()
+ sntp.sync(nil, nil, nil, 1)
+end
+
+function ztime_compress(ztime_long)
+ return ztime_long - ztime2019
+end
+
+function ztime_uncompress(ztime_short)
+ return ztime_short + ztime2019
+end
+
+function ztime_format(ztime)
+ local tm = rtctime.epoch2cal(ztime + 3600)
+ return(string.format("%04d/%02d/%02d %02d:%02d:%02d", tm["year"], tm["mon"], tm["day"], tm["hour"], tm["min"], tm["sec"]))
+end
+
+set_time()
+
+tmr.create():alarm(2*1000, tmr.ALARM_SINGLE, function()
+ print(ztime_format(rtctime.get()))
+end)
+
+
+
+
+
diff --git a/Mesures/ADC/ADS1115/goodies/up_load_all.sh b/Mesures/ADC/ADS1115/goodies/up_load_all.sh
new file mode 100644
index 0000000..335df7e
--- /dev/null
+++ b/Mesures/ADC/ADS1115/goodies/up_load_all.sh
@@ -0,0 +1,30 @@
+#!/bin/bash
+# Petit script pour télécharger du code en remote sur une grappe de NodeMCU
+#zf191225.1802
+
+# crée les tunnels SSH
+source ./make_tunnels.sh
+
+export ZFILE="0_cron.lua"
+export ZRESTART=""
+#export ZRESTART="--restart"
+
+# On télécharge le fichier sur chaque nodemcu
+echo -e "th1"
+#./luatool.py --ip localhost:$TH1_PORT $ZRESTART -f $ZFILE
+./luatool.py --ip localhost:$TH1_PORT --zrestart
+
+echo -e "th2"
+#./luatool.py --ip localhost:$TH2_PORT $ZRESTART -f $ZFILE
+./luatool.py --ip localhost:$TH2_PORT --zrestart
+
+echo -e "th3"
+#./luatool.py --ip localhost:$TH3_PORT $ZRESTART -f $ZFILE
+./luatool.py --ip localhost:$TH3_PORT --zrestart
+
+echo -e "th4"
+#./luatool.py --ip localhost:$TH4_PORT $ZRESTART -f $ZFILE
+./luatool.py --ip localhost:$TH4_PORT --zrestart
+
+
+#
diff --git a/Mesures/ADC/ADS1115/goodies/upload_t.sh b/Mesures/ADC/ADS1115/goodies/upload_t.sh
new file mode 100644
index 0000000..f379ded
--- /dev/null
+++ b/Mesures/ADC/ADS1115/goodies/upload_t.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+# Petit script pour télécharger facilement tout le binz
+#zf191028.1459
+
+# S'il y a des erreurs lors d'un téléchargement, il faut simplement augmenter un peu le délai !
+# Il est préférable de télécharger en premier les *gros* fichiers .lua !
+
+# ATTENTION: cela efface tout le NodeMCU !
+
+luatool_tty="/dev/cu.wchusbserial1410"
+
+echo ""
+read -p "ATTENTION, cela va effacer tout le NodeMCU !"
+read -p "Etes-vous vraiment certain ?"
+
+chmod +x luatool.py
+
+./luatool.py --port $luatool_tty -w
+./luatool.py --port $luatool_tty -l
+read -p "Est-ce bien vide ?"
+
+./luatool.py --port $luatool_tty --bar --delay 0.06 -f telnet_srv2.lua
+./luatool.py --port $luatool_tty --bar --delay 0.03 -f head.lua
+./luatool.py --port $luatool_tty --bar --delay 0.03 -f flash_led_xfois.lua
+./luatool.py --port $luatool_tty --bar --delay 0.001 -f wifi_info.lua
+./luatool.py --port $luatool_tty --bar --delay 0.001 -f wifi_cli_start.lua
+./luatool.py --port $luatool_tty --bar --delay 0.001 -f wifi_cli_conf.lua
+./luatool.py --port $luatool_tty --bar --delay 0.001 -f wifi_ap_stop.lua
+./luatool.py --port $luatool_tty --bar --delay 0.001 -f secrets_energy.lua
+./luatool.py --port $luatool_tty --bar --delay 0.001 -f dir.lua
+./luatool.py --port $luatool_tty --bar --delay 0.001 -f cat.lua
+./luatool.py --port $luatool_tty --bar --delay 0.001 -f boot2.lua
+./luatool.py --port $luatool_tty --bar --delay 0.001 -f boot.lua
+
+./luatool.py --port $luatool_tty -l
+read -p "Pas eu d'erreur, on part à fond avec le init.lua ?"
+./luatool.py --port $luatool_tty --bar --delay 0.001 -f initz.lua -t init.lua
+echo -e "\nC'est tout bon ;-)"
diff --git a/Mesures/ADC/ADS1115/goodies/wifi_clear.html b/Mesures/ADC/ADS1115/goodies/wifi_clear.html
new file mode 100644
index 0000000..57fb2dd
--- /dev/null
+++ b/Mesures/ADC/ADS1115/goodies/wifi_clear.html
@@ -0,0 +1,63 @@
+
+
+
+
+
+ Wifi clear
+
+
+
+ Wifi clear 191222.2348
+
+ Effacement de la configuration WIFI actuelle !
+ Retour à la home page...
+
+ Test d'un web service qui fonctionne avec l'Active Server Page ZYX.
+
+ Le code Lua pour afficher ce résultat se trouve dans le code HTML de cette page et est exécuté sur
+ le NodeMCU.
+ Les données viennent du NodeMCU !
+
+ <%
+ zout("Il reste: "..node.heap().." de RAM !
\n")
+ %>
+
+ <%
+ zout("Booooooooum dans 5 secondes!
")
+ tmr.create():alarm(5*1000, tmr.ALARM_SINGLE, function()
+ file.remove("eus_params.lua")
+ node.restart()
+ end)
+
+ %>
+
+ Les arguments du web service (GET) sont:
+ <%
+ if (vars ~= nil) then
+ zout("
vars: "..vars.."
")
+ for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
+ _GET[k] = v
+ zout(k..": "..v.."
")
+ if k == "field1" then
+ ztemp1_conc = v
+ elseif k == "field2" then
+ ztemp2_conc = v
+ elseif k == "field3" then
+ ztemp3_conc = v
+ end
+ end
+ end
+ zout("
Les températures récupérées sont: "..ztemp1_conc..", "..ztemp2_conc..", "..ztemp3_conc)
+ %>
+
+
+
+
+
Yeah... cela fonctionne vachement bien !
+
+ <%
+ zout("Il reste: "..node.heap().." de RAM !
\n")
+ %>
+
+
+
diff --git a/Mesures/ADC/ADS1115/goodies/wifi_set_conf.html b/Mesures/ADC/ADS1115/goodies/wifi_set_conf.html
new file mode 100644
index 0000000..2aaee74
--- /dev/null
+++ b/Mesures/ADC/ADS1115/goodies/wifi_set_conf.html
@@ -0,0 +1,48 @@
+
+
+
+
+
+ WIFI set config
+
+
+
+ WIFI set config 191124.2334
+
+ Coucou c'est WIFI set config !
+ Retour à la home page...
+
+
+
+<%
+
+ if (vars ~= nil) then
+ zout("
vars: "..vars.."
")
+ for k, v in string.gmatch(vars, "(%w+)=(%w+%p+%w+)&*") do
+ _GET[k] = v
+ zout(k..": "..v.."
")
+ end
+ end
+
+ zout("
toto
")
+
+--[[
+zout("t1: ",_GET.zssid,"
")
+zout("t2: ",_GET.zpasswd,"
")
+
+if zverif == "YES" then
+ zout("c'est tout bon")
+ zout("Le SSID est: ",zssid)
+ zout("Le PASSWD est: ",zpasswd)
+end
+]]
+
+ztemp=ztemp+1
+zout(ztemp.."°C")
+%>
+
+
Mais il fait encore trop froid !
+
+
+
+
diff --git a/Mesures/ADC/ADS1115/goodies/zz_host_dir.lua b/Mesures/ADC/ADS1115/goodies/zz_host_dir.lua
new file mode 100644
index 0000000..23e75ce
--- /dev/null
+++ b/Mesures/ADC/ADS1115/goodies/zz_host_dir.lua
@@ -0,0 +1,67 @@
+#!/usr/local/bin/lua5.1
+-- script lua à faire tourner sur le host pour la taille de tous les fichiers
+-- du dossier en cours, donc PAS sur le NodeMCU !
+-- source: https://stackoverflow.com/questions/5303174/how-to-get-list-of-directories-in-lua (30%)
+
+-- usage dans la console:
+-- ./zz_host_dir.lua
+--[[
+./zz_host_dir.lua > thost
+]]
+-- usage dans Atom editor
+-- il faut installer ceci: https://atom.io/packages/compare-files
+-- puis sélectionner les deux fichiers dans l'explorateur à gauche puis CTRL+CMD+C
+
+
+print("\n zz_host_dir.lua zf191124.1646 \n")
+
+function calc_chksum_file(name_file)
+ size_file = 0 chksum_file = 0
+ local f = io.open(name_file, "r")
+-- local f = file.open(name_file, "r")
+ while true do
+ local t = f:read(1) if t == nil then break end
+-- chksum_file = chksum_file + size_file * string.byte(t)
+ size_file = size_file + 1
+-- if size_file%100 == 0 then uart.write(0,".") end
+ end
+ f:close()
+-- print(name_file)
+end
+
+function dirfile(k)
+ calc_chksum_file(k)
+ print(k..string.rep(" ",24-string.len(k)).." : "..size_file..", "..chksum_file)
+ size_file=nil chksum_file=nil k=nil
+end
+
+function dir()
+ local zdir={}
+ local pfile = io.popen("ls -1r *.lua *.html")
+ for k in pfile:lines() do
+-- local pfile = file.list()
+-- for k,v in pairs(pfile) do
+ calc_chksum_file(k)
+ if (size_file ~= 1) and (chksum_file ~= 1) then
+ zdir[#zdir+1]=k..string.rep(" ",24-string.len(k)).." : "..size_file
+ end
+ end
+ pfile:close()
+ table.sort(zdir)
+ for i=1, #zdir do
+ print(zdir[i])
+ end
+ size_file=nil chksum_file=nil k=nil
+end
+
+dir()
+print("\n\nRappel, sur Atom, sélectionner les deux fichiers à gauche puis CTRL+CMD+C\n")
+
+--[[
+dir()
+dirfile("dir2.lua")
+
+for k,v in pairs(_G) do print(k,v) end
+
+status, err = pcall(function () print(zhash("il était une fois trois petits cochons roses...")) end) if status==false then print("Error: ",err) end
+]]
diff --git a/Mesures/ADC/ADS1115/goodies/zz_host_dir2.lua b/Mesures/ADC/ADS1115/goodies/zz_host_dir2.lua
new file mode 100644
index 0000000..13cf1bc
--- /dev/null
+++ b/Mesures/ADC/ADS1115/goodies/zz_host_dir2.lua
@@ -0,0 +1,67 @@
+#!/usr/local/bin/lua5.1
+-- script lua à faire tourner sur le host pour calculer le checksum de tous les fichiers
+-- du dossier en cours, donc PAS sur le NodeMCU !
+-- source: https://stackoverflow.com/questions/5303174/how-to-get-list-of-directories-in-lua (30%)
+
+-- usage dans la console:
+-- ./zz_host_dir2.lua
+--[[
+./zz_host_dir2.lua > thost
+]]
+-- usage dans Atom editor
+-- il faut installer ceci: https://atom.io/packages/compare-files
+-- puis sélectionner les deux fichiers dans l'explorateur à gauche puis CTRL+CMD+C
+
+
+print("\n zz_host_dir2.lua zf191124.1634 \n")
+
+function calc_chksum_file(name_file)
+ size_file = 1 chksum_file = 0
+ local f = io.open(name_file, "r")
+-- local f = file.open(name_file, "r")
+ while true do
+ local t = f:read(1) if t == nil then break end
+ chksum_file = chksum_file + size_file * string.byte(t)
+ size_file = size_file + 1
+-- if size_file%100 == 0 then uart.write(0,".") end
+ end
+ f:close()
+-- print(name_file)
+end
+
+function dirfile(k)
+ calc_chksum_file(k)
+ print(k..string.rep(" ",24-string.len(k)).." : "..size_file..", "..chksum_file)
+ size_file=nil chksum_file=nil k=nil
+end
+
+function dir()
+ local zdir={}
+ local pfile = io.popen("ls -1r ")
+ for k in pfile:lines() do
+-- local pfile = file.list()
+-- for k,v in pairs(pfile) do
+ calc_chksum_file(k)
+ if (size_file ~= 1) and (chksum_file ~= 1) then
+ zdir[#zdir+1]=k..string.rep(" ",24-string.len(k)).." : "..size_file..", "..chksum_file
+ end
+ end
+ pfile:close()
+ table.sort(zdir)
+ for i=1, #zdir do
+ print(zdir[i])
+ end
+ size_file=nil chksum_file=nil k=nil
+end
+
+dir()
+print("\n\nRappel, sur Atom, sélectionner les deux fichiers à gauche puis CTRL+CMD+C\n")
+
+--[[
+dir()
+dirfile("dir2.lua")
+
+for k,v in pairs(_G) do print(k,v) end
+
+status, err = pcall(function () print(zhash("il était une fois trois petits cochons roses...")) end) if status==false then print("Error: ",err) end
+]]
diff --git a/Mesures/ADC/ADS1115/head.lua b/Mesures/ADC/ADS1115/head.lua
new file mode 100644
index 0000000..0478b8c
--- /dev/null
+++ b/Mesures/ADC/ADS1115/head.lua
@@ -0,0 +1,19 @@
+-- fonction cat() pour afficher les 10 premières lignes d'un fichier dans la flash
+print("\n head.lua zf192028.1516 \n")
+
+function zhead(zfile)
+ print("\n"..zfile.."\n-------------------------------")
+
+ zfilei = file.open(zfile, "r")
+ i=1
+ zline=file.readline()
+ repeat
+-- print(i..": "..string.sub(zline,1,string.len(zline)-1))
+ print(string.sub(zline,1,string.len(zline)-1))
+ i=i+1 zline=file.readline()
+ if i>10 then break end
+ until zline==nil
+ file.close(zfilei)
+
+ print("-------------------------------")
+end
diff --git a/Mesures/ADC/ADS1115/img/4_Channel_AD_Module_ADS1115.jpg b/Mesures/ADC/ADS1115/img/4_Channel_AD_Module_ADS1115.jpg
new file mode 100644
index 0000000..0a4c6b3
Binary files /dev/null and b/Mesures/ADC/ADS1115/img/4_Channel_AD_Module_ADS1115.jpg differ
diff --git a/Mesures/ADC/ADS1115/img/4_Channel_AD_Module_ADS1115_pinout.jpg b/Mesures/ADC/ADS1115/img/4_Channel_AD_Module_ADS1115_pinout.jpg
new file mode 100644
index 0000000..78b59d2
Binary files /dev/null and b/Mesures/ADC/ADS1115/img/4_Channel_AD_Module_ADS1115_pinout.jpg differ
diff --git a/Mesures/ADC/ADS1115/initz.lua b/Mesures/ADC/ADS1115/initz.lua
new file mode 100644
index 0000000..f41d3c1
--- /dev/null
+++ b/Mesures/ADC/ADS1115/initz.lua
@@ -0,0 +1,79 @@
+--Script de bootstrap, test au moment du boot qui a été la cause de boot.
+-- Si la cause est un power on ou une connexion depuis l'IDE, alors
+-- le script repair.lua pendant xx secondes avant de continuer
+--Source: https://nodemcu.readthedocs.io/en/master/en/modules/node/#nodebootreason
+
+print("\n init.lua zf200118.1507 \n")
+
+function initz()
+
+ function initz_end()
+ print("initz_end...")
+ f= "wifi_init.lua" if file.exists(f) then dofile(f) end
+ f=nil initz=nil second_chance=nil hvbouton=nil initz_end=nil
+ print(node.heap()) collectgarbage() print(node.heap())
+ print("initz_end out...")
+ end
+
+ function hvbouton()
+ gpio.trig(zswitch, "none") zswitch=nil
+ print("hvbouton...")
+ initalarme1:unregister() initalarme1=nil second_chance=nil
+ gpio.write(zLED, gpio.HIGH) zLED=nil
+ reset_reason="hvbouton"
+ initz_end()
+ end
+
+ function second_chance()
+ print("seconde chance...")
+ zLED=4 -- NodeMCU
+ --zLED=7 -- SonOff
+ gpio.write(zLED, gpio.LOW) gpio.mode(zLED, gpio.OUTPUT)
+ initalarme1=tmr.create()
+ initalarme1:alarm(10*1000, tmr.ALARM_SINGLE, function()
+ gpio.write(zLED, gpio.HIGH) zLED=nil
+ gpio.trig(zswitch, "none") zswitch=nil
+ reset_reason="seconde_chance"
+ initz_end()
+ end)
+ zswitch=3 --switch flash ou SonOff
+ gpio.mode(zswitch, gpio.INT, gpio.PULLUP)
+ gpio.trig(zswitch, "both", hvbouton)
+ end
+
+ _, reset_reason = node.bootreason()
+ print("reset_reason: ",reset_reason)
+ if reset_reason == 0 then
+ print("power on")
+ second_chance()
+ elseif reset_reason == 4 then
+ print("node.restart")
+ initz_end()
+ elseif reset_reason == 5 then
+ print("dsleep wake up")
+ initz_end()
+ elseif reset_reason == 6 then
+ print("external reset")
+ second_chance()
+ else
+ print("autre raison")
+ second_chance()
+ end
+end
+initz()
+
+--[[
+zLED=7
+gpio.mode(zLED, gpio.OUTPUT)
+gpio.write(zLED, gpio.LOW) -- actif !
+gpio.write(zLED, gpio.HIGH)
+
+zBTN=3
+gpio.mode(zBTN, gpio.INPUT)
+print(gpio.read(zBTN))
+
+zRELAY=6
+gpio.mode(zRELAY, gpio.OUTPUT)
+gpio.write(zRELAY, gpio.HIGH) -- actif !
+gpio.write(zRELAY, gpio.LOW)
+]]
diff --git a/Mesures/ADC/ADS1115/luatool.py b/Mesures/ADC/ADS1115/luatool.py
new file mode 100755
index 0000000..29e183f
--- /dev/null
+++ b/Mesures/ADC/ADS1115/luatool.py
@@ -0,0 +1,408 @@
+#!/usr/bin/env python2
+# -*- coding: utf-8 -*-
+version = "0.6.8 zf191225.1428"
+
+print("luatool.py ver " + version)
+
+#Améliorations
+# Pour voir les améliorations il faut 'chercher' les zzz
+
+
+#
+# ESP8266 luatool
+# Author e-mail: 4ref0nt@gmail.com
+# Site: http://esp8266.ru
+# Contributions from: https://github.com/sej7278
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
+# Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+import sys
+import serial
+from time import sleep
+import socket
+import argparse
+from os.path import basename
+
+
+tqdm_installed = True
+try:
+ from tqdm import tqdm
+except ImportError, e:
+ if e.message == 'No module named tqdm':
+ tqdm_installed = False
+ else:
+ raise
+
+
+
+class TransportError(Exception):
+ """Custom exception to represent errors with a transport
+ """
+ def __init__(self, message):
+ self.message = message
+
+ def __str__(self):
+ return self.message
+
+class AbstractTransport:
+ def __init__(self):
+ raise NotImplementedError('abstract transports cannot be instantiated.')
+
+ def close(self):
+ raise NotImplementedError('Function not implemented')
+
+ def read(self, length):
+ raise NotImplementedError('Function not implemented')
+
+ def writeln(self, data, check=1):
+ raise NotImplementedError('Function not implemented')
+
+ def writer(self, data):
+ ##zzz191124 enlève la fin de ligne afin de ne pas perturber la vérification finale
+ data = data.rstrip('\r\n')
+ self.writeln("file.writeline([==[" + data + "]==])\r")
+
+ def performcheck(self, expected):
+ line = ''
+ char = ''
+ i = -1
+ while char != chr(62): # '>'
+ char = self.read(1)
+ if char == '':
+ raise Exception('No proper answer from MCU')
+ if char == chr(13) or char == chr(10): # LF or CR
+ if line != '':
+ #zzz191124 line = line.strip()
+ # zzz191021 Affiche ce que l'on a reçu du NodeMCU
+ if args.verbose:
+ print("\n\nzread0957: {" + line + "\n}\n")
+
+ if line+'\r' == expected and not args.bar:
+ sys.stdout.write(" -> ok")
+ elif line+'\r' != expected:
+ if line[:4] == "lua:":
+ sys.stdout.write("\r\n\r\nLua ERROR: %s" % line)
+ raise Exception('ERROR from Lua interpreter\r\n\r\n')
+ else:
+ expected = expected.split("\r")[0]
+ sys.stdout.write("\r\n\r\nERROR")
+ sys.stdout.write("\r\n send string : '%s'" % expected)
+ sys.stdout.write("\r\n expected echo : '%s'" % expected)
+ sys.stdout.write("\r\n but got answer : '%s'" % line)
+ sys.stdout.write("\r\n\r\n")
+ raise Exception('Error sending data to MCU\r\n\r\n')
+ line = ''
+ else:
+ line += char
+ if char == chr(62) and expected[i] == char:
+ char = ''
+ i += 1
+
+
+class SerialTransport(AbstractTransport):
+ def __init__(self, port, baud, delay):
+ self.port = port
+ self.baud = baud
+ self.serial = None
+ self.delay = delay
+
+ try:
+ self.serial = serial.Serial(port, baud)
+ except serial.SerialException as e:
+ raise TransportError(e.strerror)
+
+ self.serial.timeout = 3
+ self.serial.interCharTimeout = 3
+
+ # zzz191021 juste après l'ouverture du port série, on attend le caractère '>'
+ line = ''
+ char = ''
+ i = -1
+ while char != chr(62): # '>'
+ char = self.read(1)
+ if char == '':
+ raise Exception('No proper answer from MCU')
+ line += char
+ i += 1
+ if args.verbose:
+ print("line: ." + line + ".")
+
+
+ def writeln(self, data, check=1):
+ # zzz191020 on fait une petite pause avant l'envoi de chaque ligne
+ sleep(self.delay)
+ if self.serial.inWaiting() > 0:
+ self.serial.flushInput()
+ if len(data) > 0 and not args.bar:
+ sys.stdout.write("\r\n->")
+ sys.stdout.write(data.split("\r")[0])
+ ##zzz191124 attend encore un petit peu avant d'envoyer
+ sleep(self.delay)
+ self.serial.write(data)
+ sleep(self.delay)
+ # zzz191021 Affiche ce que l'on a envoyé au NodeMCU
+ if args.verbose:
+ print("\n\nzwrite0952: {" + data + "\n}\n")
+ if check > 0:
+ self.performcheck(data)
+ elif not args.bar:
+ sys.stdout.write(" -> send without check")
+
+ def read(self, length):
+ return self.serial.read(length)
+
+ def close(self):
+ self.serial.flush()
+ self.serial.close()
+
+
+class TcpSocketTransport(AbstractTransport):
+ def __init__(self, host, port):
+ self.host = host
+ self.port = port
+ self.socket = None
+
+ try:
+ self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ except socket.error as e:
+ raise TransportError(e.strerror)
+
+ try:
+ self.socket.connect((host, port))
+ except socket.error as e:
+ raise TransportError(e.strerror)
+ # read intro from telnet server (see telnet_srv.lua)
+ self.socket.recv(50)
+
+ def writeln(self, data, check=1):
+ if len(data) > 0 and not args.bar:
+ sys.stdout.write("\r\n->")
+ sys.stdout.write(data.split("\r")[0])
+ self.socket.sendall(data)
+ if check > 0:
+ self.performcheck(data)
+ elif not args.bar:
+ sys.stdout.write(" -> send without check")
+
+ def read(self, length):
+ return self.socket.recv(length)
+
+ def close(self):
+ self.socket.close()
+
+
+def decidetransport(cliargs):
+ if cliargs.ip:
+ data = cliargs.ip.split(':')
+ host = data[0]
+ if len(data) == 2:
+ port = int(data[1])
+ else:
+ port = 23
+ return TcpSocketTransport(host, port)
+ else:
+ return SerialTransport(cliargs.port, cliargs.baud, cliargs.delay)
+
+
+if __name__ == '__main__':
+ # parse arguments or use defaults
+ parser = argparse.ArgumentParser(description='ESP8266 Lua script uploader.')
+ parser.add_argument('--bar', action='store_true', help='Show a progress bar for uploads instead of printing each line')
+ parser.add_argument('--delay', default=0.025, help='Delay in seconds between each write, default 0.03 sec.', type=float)
+ parser.add_argument('--delete', default=None, help='Delete a lua/lc file from device.')
+ parser.add_argument('--ip', default=None, help='Connect via telnet server (--ip IP[:port])')
+ parser.add_argument('--zrestart', action='store_true', help='Restart the NodeMCU.')
+ parser.add_argument('-a', '--append', action='store_true', help='Append source file to destination file.')
+ parser.add_argument('-b', '--baud', default=115200, help='Baudrate, default 115200')
+ parser.add_argument('-c', '--compile', action='store_true', help='Compile lua to lc after upload')
+ parser.add_argument('-d', '--dofile', action='store_true', help='Run the Lua script after upload')
+ parser.add_argument('-e', '--echo', action='store_true', help='Echo output of MCU until script is terminated.')
+ parser.add_argument('-f', '--src', default='main.lua', help='Source file on computer, default main.lua')
+ parser.add_argument('-i', '--id', action='store_true', help='Query the modules chip id.')
+ parser.add_argument('-l', '--list', action='store_true', help='List files on device')
+ parser.add_argument('-p', '--port', default='/dev/ttyUSB0', help='Device name, default /dev/ttyUSB0')
+ parser.add_argument('-r', '--restart', action='store_true', help='Restart MCU after upload')
+ parser.add_argument('-t', '--dest', default=None, help='Destination file on MCU, default to source file name')
+ parser.add_argument('-v', '--verbose', action='store_true', help="Show progress messages.")
+ parser.add_argument('-w', '--wipe', action='store_true', help='Delete all lua/lc files on device.')
+ args = parser.parse_args()
+
+ transport = decidetransport(args)
+
+ if args.bar and not tqdm_installed:
+ sys.stdout.write("You must install the tqdm library to use the bar feature\n")
+ sys.stdout.write("To install, at the prompt type: \"pip install tqdm\"\n")
+ sys.exit(0)
+
+
+ if args.list:
+ # zzz191020 Amélioré la sortie du listing des fichiers
+ #transport.writeln("print('\\n-----');local l = file.list();for k,v in pairs(l) do print(k..', size:'..v)end;print('-----\\n')\r", 0)
+ # zzz191225 Amélioré encore la sortie du listing des fichiers (sort file)
+ transport.writeln("zdir={};pfile = file.list();for k,v in pairs(pfile) do zdir[#zdir+1] = k..string.rep(' ',24-string.len(k))..' : '..v end;table.sort(zdir);print('\\n-----');for i=1, #zdir do print(zdir[i]) end;print('-----\\n');zdir=nil;pfile=nil;k=nil;v=nil;i=nil\r", 0)
+
+ while True:
+ char = transport.read(1)
+ if char == '' or char == chr(62): # '' or '>'
+ break
+ sys.stdout.write(char)
+ sys.exit(0)
+
+ if args.id:
+ transport.writeln("=node.chipid()\r", 0)
+ id=""
+ while True:
+ char = transport.read(1)
+ if char == '' or char == chr(62):
+ break
+ if char.isdigit():
+ id += char
+ print("\n"+id)
+ sys.exit(0)
+
+ # zzz191020 Ajouté la fonction restart seule
+ if args.zrestart:
+ transport.writeln("node.restart()\r")
+ sys.exit(0)
+
+ if args.wipe:
+ transport.writeln("local l = file.list();for k,v in pairs(l) do print(k)end\r", 0)
+ file_list = []
+ fn = ""
+ while True:
+ char = transport.read(1)
+ if char == '' or char == chr(62):
+ break
+ if char not in ['\r', '\n']:
+ fn += char
+ else:
+ if fn:
+ file_list.append(fn.strip())
+ fn = ''
+ for fn in file_list[1:]: # first line is the list command sent to device
+ if args.verbose:
+ sys.stderr.write("Delete file {} from device.\r\n".format(fn))
+ transport.writeln("file.remove(\"" + fn + "\")\r")
+ sys.exit(0)
+
+ if args.delete:
+ transport.writeln("file.remove(\"" + args.delete + "\")\r")
+ sys.exit(0)
+
+ if args.dest is None:
+ args.dest = basename(args.src)
+ # zzz191020 Affiche le fichier à envoyer
+ print("File: " + args.src)
+
+ # open source file for reading
+ try:
+ try:
+ f = open(args.src, "rt")
+ except:
+ import os
+ base_dir = os.path.dirname(os.path.realpath(__file__))
+ f = open(os.path.join(base_dir, args.src), "rt")
+ os.chdir(base_dir)
+ except:
+ sys.stderr.write("Could not open input file \"%s\"\n" % args.src)
+ sys.exit(1)
+
+ # Verify the selected file will not exceed the size of the serial buffer.
+ # The size of the buffer is 256. This script does not accept files with
+ # lines longer than 230 characters to have some room for command overhead.
+ num_lines = 0
+ for ln in f:
+ if len(ln) > 230:
+ sys.stderr.write("File \"%s\" contains a line with more than 240 "
+ "characters. This exceeds the size of the serial buffer.\n"
+ % args.src)
+ f.close()
+ sys.exit(1)
+ num_lines += 1
+
+ # Go back to the beginning of the file after verifying it has the correct
+ # line length
+ f.seek(0)
+
+ # set serial timeout
+ if args.verbose:
+ sys.stderr.write("Upload starting\r\n")
+
+ # remove existing file on device
+ if args.append==False:
+ if args.verbose:
+ sys.stderr.write("Stage 1. Deleting old file from flash memory")
+ transport.writeln("file.open(\"" + args.dest + "\", \"w\")\r")
+ transport.writeln("file.close()\r")
+ transport.writeln("file.remove(\"" + args.dest + "\")\r")
+ else:
+ if args.verbose:
+ sys.stderr.write("[SKIPPED] Stage 1. Deleting old file from flash memory [SKIPPED]")
+
+
+ # read source file line by line and write to device
+ if args.verbose:
+ sys.stderr.write("\r\nStage 2. Creating file in flash memory and write first line")
+ if args.append:
+ transport.writeln("file.open(\"" + args.dest + "\", \"a+\")\r")
+ else:
+ transport.writeln("file.open(\"" + args.dest + "\", \"w+\")\r")
+ line = f.readline()
+ if args.verbose:
+ sys.stderr.write("\r\nStage 3. Start writing data to flash memory...")
+ if args.bar:
+ for i in tqdm(range(0, num_lines)):
+ #zzz191124 transport.writer(line.strip())
+ transport.writer(line)
+ line = f.readline()
+ else:
+ while line != '':
+ #zzz191124 transport.writer(line.strip())
+ transport.writer(line)
+ line = f.readline()
+
+ # close both files
+ f.close()
+ if args.verbose:
+ sys.stderr.write("\r\nStage 4. Flush data and closing file")
+ transport.writeln("file.flush()\r")
+ transport.writeln("file.close()\r")
+
+ # compile?
+ if args.compile:
+ if args.verbose:
+ sys.stderr.write("\r\nStage 5. Compiling")
+ transport.writeln("node.compile(\"" + args.dest + "\")\r")
+ transport.writeln("file.remove(\"" + args.dest + "\")\r")
+
+ # restart or dofile
+ if args.restart:
+ transport.writeln("node.restart()\r")
+
+ if args.dofile: # never exec if restart=1
+ transport.writeln("dofile(\"" + args.dest + "\")\r", 0)
+
+ if args.echo:
+ if args.verbose:
+ sys.stderr.write("\r\nEchoing MCU output, press Ctrl-C to exit")
+ while True:
+ sys.stdout.write(transport.read(1))
+
+ # close serial port
+ transport.close()
+
+ # flush screen
+ sys.stdout.flush()
+ sys.stderr.flush()
+ if not args.bar:
+ sys.stderr.write("\r\n--->>> All done <<<---\r\n")
diff --git a/Mesures/ADC/ADS1115/schema/fritzing_part_ads1115.md b/Mesures/ADC/ADS1115/schema/fritzing_part_ads1115.md
new file mode 100644
index 0000000..23bf03b
--- /dev/null
+++ b/Mesures/ADC/ADS1115/schema/fritzing_part_ads1115.md
@@ -0,0 +1 @@
+https://github.com/adafruit/Fritzing-Library/blob/master/parts/Adafruit%20ADS1115%2016Bit%20I2C%20ADC.fzpz
diff --git a/Mesures/ADC/ADS1115/schema/nodemcu_adc_ ADS1115.fzz b/Mesures/ADC/ADS1115/schema/nodemcu_adc_ ADS1115.fzz
new file mode 100644
index 0000000..e7692f9
Binary files /dev/null and b/Mesures/ADC/ADS1115/schema/nodemcu_adc_ ADS1115.fzz differ
diff --git a/Mesures/ADC/ADS1115/schema/pcb.png b/Mesures/ADC/ADS1115/schema/pcb.png
new file mode 100644
index 0000000..f515b7a
Binary files /dev/null and b/Mesures/ADC/ADS1115/schema/pcb.png differ
diff --git a/Mesures/ADC/ADS1115/schema/schema.png b/Mesures/ADC/ADS1115/schema/schema.png
new file mode 100644
index 0000000..d2d987c
Binary files /dev/null and b/Mesures/ADC/ADS1115/schema/schema.png differ
diff --git a/Mesures/ADC/ADS1115/telnet_srv2.lua b/Mesures/ADC/ADS1115/telnet_srv2.lua
new file mode 100644
index 0000000..19920f2
--- /dev/null
+++ b/Mesures/ADC/ADS1115/telnet_srv2.lua
@@ -0,0 +1,93 @@
+-- Serveur telnet pour connexion en remote WIFI, NOUVELLE VERSION !
+-- source: https://github.com/nodemcu/nodemcu-firmware/blob/master/lua_examples/telnet/telnet.lua
+
+print("\n telnet_srv2.lua zf191020.1932 \n")
+
+local node, table, tmr, wifi, uwrite, tostring =
+ node, table, tmr, wifi, uart.write, tostring
+
+local function telnet_listener(socket)
+ local insert, remove, concat, heap, gc =
+ table.insert, table.remove, table.concat, node.heap, collectgarbage
+ local fifo1, fifo1l, fifo2, fifo2l = {}, 0, {}, 0
+ local s -- s is a copy of the TCP socket if and only if sending is in progress
+ local wdclr, cnt = tmr.wdclr, 0
+ local function debug(fmt, ...)
+ if (...) then fmt = fmt:format(...) end
+ uwrite(0, "\r\nDBG: ",fmt,"\r\n" )
+ cnt = cnt + 1
+ if cnt % 10 then wdclr() end
+ end
+
+ local function flushGarbage()
+ if heap() < 13440 then gc() end
+ end
+
+ local function sendLine()
+ if not s then return end
+
+ if fifo2l + fifo1l == 0 then -- both FIFOs empty, so clear down s
+ s = nil
+ return
+ end
+ flushGarbage()
+ if #fifo2 < 4 then -- Flush FIFO1 into FIFO2
+ insert(fifo2,concat(fifo1))
+ fifo2l, fifo1, fifo1l = fifo2l + fifo1l, {}, 0
+ end
+ local rec = remove(fifo2,1) .. (remove(fifo2,1) or '') ..
+ (remove(fifo2,1) or '') .. (remove(fifo2,1) or '')
+ fifo2l = fifo2l - #rec
+ flushGarbage()
+ s:send(rec)
+ end
+
+ local F1_SIZE = 256
+
+ local function queueLine(str)
+ while #str > 0 do -- this is because str might be longer than the packet size!
+ local k, l = F1_SIZE - fifo1l, #str
+ local chunk
+ if #fifo1 >= 32 or (k < l and k < 16) then
+ insert(fifo2, concat(fifo1))
+ fifo2l, fifo1, fifo1l, k = fifo2l + fifo1l, {}, 0, F1_SIZE
+ end
+ if l > k+16 then -- also tolerate a size overrun of 16 bytes to avoid a split
+ chunk, str = str:sub(1,k), str:sub(k+1)
+ else
+ chunk, str = str, ''
+ end
+ insert(fifo1, chunk)
+ fifo1l = fifo1l + #chunk
+ end
+ if not s and socket then
+ s = socket
+ sendLine()
+ else
+ flushGarbage()
+ end
+ end
+
+ local function receiveLine(s, line)
+ node.input(line)
+ end
+
+ local function disconnect(s)
+ fifo1, fifo1l, fifo2, fifo2l, s = {}, 0, {}, 0, nil
+ node.output(nil)
+ end
+
+ --zzz
+ local function zconnection(s)
+ print("Welcome to NodeMCU world.")
+ end
+
+ socket:on("connection", zconnection)
+ socket:on("receive", receiveLine)
+ socket:on("disconnection", disconnect)
+ socket:on("sent", sendLine)
+ node.output(queueLine, 0)
+end
+
+net.createServer(net.TCP, 180):listen(23, telnet_listener)
+print("Telnet server running...\nUsage: telnet -rN ip\n")
diff --git a/Mesures/ADC/ADS1115/upload_s.sh b/Mesures/ADC/ADS1115/upload_s.sh
new file mode 100644
index 0000000..1097e1f
--- /dev/null
+++ b/Mesures/ADC/ADS1115/upload_s.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+# Petit script pour télécharger facilement tout le binz via le port série
+#zf191228.2313
+
+# S'il y a des erreurs lors d'un téléchargement, il faut simplement augmenter un peu le délai !
+# Il est préférable de télécharger en premier les *gros* fichiers .lua !
+
+# ATTENTION: cela efface tout le NodeMCU !
+
+luatool_tty="/dev/cu.wchusbserial1410"
+
+echo ""
+read -p "ATTENTION, cela va effacer tout le NodeMCU !"
+read -p "Etes-vous vraiment certain ?"
+
+chmod +x luatool.py
+
+./luatool.py --port $luatool_tty -w
+./luatool.py --port $luatool_tty -l
+read -p "Est-ce bien vide ?"
+
+./luatool.py --port $luatool_tty --bar -f z_index.html
+./luatool.py --port $luatool_tty --bar -f wifi_init.lua
+./luatool.py --port $luatool_tty --bar -f wifi_info.lua
+./luatool.py --port $luatool_tty --bar -f wifi_clear.html
+./luatool.py --port $luatool_tty --bar -f web_srv2.lua
+./luatool.py --port $luatool_tty --bar -f web_ide2.lua
+./luatool.py --port $luatool_tty --bar -f telnet_srv2.lua
+./luatool.py --port $luatool_tty --bar -f set_time.lua
+./luatool.py --port $luatool_tty --bar -f secrets_wifi.lua
+./luatool.py --port $luatool_tty --bar -f secrets_project.lua
+./luatool.py --port $luatool_tty --bar -f head.lua
+./luatool.py --port $luatool_tty --bar -f eus_params.lua
+./luatool.py --port $luatool_tty --bar -f disp_temp.html
+./luatool.py --port $luatool_tty --bar -f dir2.lua
+./luatool.py --port $luatool_tty --bar -f cat.lua
+./luatool.py --port $luatool_tty --bar -f boot2.lua
+./luatool.py --port $luatool_tty --bar -f boot.lua
+./luatool.py --port $luatool_tty --bar -f 0_send_data.lua
+#./luatool.py --port $luatool_tty --bar -f 0_htu21d.lua
+./luatool.py --port $luatool_tty --bar -f 0_cron.lua
+
+./luatool.py --port $luatool_tty -l
+read -p "Pas eu d'erreur, on part à fond avec le init.lua ?"
+
+./luatool.py --port $luatool_tty --bar -f initz.lua -t init.lua
+./luatool.py --port $luatool_tty -l
+echo -e "\nC'est tout bon ;-)"
diff --git a/Mesures/ADC/ADS1115/web_ide2.lua b/Mesures/ADC/ADS1115/web_ide2.lua
new file mode 100644
index 0000000..fdfbafc
--- /dev/null
+++ b/Mesures/ADC/ADS1115/web_ide2.lua
@@ -0,0 +1,159 @@
+-- Petit WEB IDE tout simple autonome
+-- ATTENTION: tourne sur le port 88 !
+
+print("\n _web_ide2.lua zf181221.1137 \n")
+
+--[[
+XChip's NodeMCU IDE
+
+Create, Edit and run NodeMCU files using your webbrowser.
+Examples:
+http:/// will list all the files in the MCU
+http:///newfile.lua displays the file on your browser
+http:///newfile.lua?edit allows to creates or edits the specified script in your browser
+http:///newfile.lua?run it will run the specified script and will show the returned value
+]]--
+
+srv=net.createServer(net.TCP)
+srv:listen(88,function(conn)
+
+ local rnrn=0
+ local Status = 0
+ local DataToGet = 0
+ local method=""
+ local url=""
+ local vars=""
+
+ conn:on("receive",function(conn,payload)
+
+ if Status==0 then
+ _, _, method, url, vars = string.find(payload, "([A-Z]+) /([^?]*)%??(.*) HTTP")
+ print(method, url, vars)
+ end
+
+ if method=="POST" then
+
+ if Status==0 then
+ --print("status", Status)
+ _,_,DataToGet, payload = string.find(payload, "Content%-Length: (%d+)(.+)")
+ if DataToGet~=nil then
+ DataToGet = tonumber(DataToGet)
+ --print(DataToGet)
+ rnrn=1
+ Status = 1
+ else
+ print("bad length")
+ end
+ end
+
+ -- find /r/n/r/n
+ if Status==1 then
+ --print("status", Status)
+ local payloadlen = string.len(payload)
+ local mark = "\r\n\r\n"
+ local i
+ for i=1, payloadlen do
+ if string.byte(mark, rnrn) == string.byte(payload, i) then
+ rnrn=rnrn+1
+ if rnrn==5 then
+ payload = string.sub(payload, i+1,payloadlen)
+ file.open(url, "w")
+ file.close()
+ Status=2
+ break
+ end
+ else
+ rnrn=1
+ end
+ end
+ if Status==1 then
+ return
+ end
+ end
+
+ if Status==2 then
+ --print("status", Status)
+ if payload~=nil then
+ DataToGet=DataToGet-string.len(payload)
+ --print("DataToGet:", DataToGet, "payload len:", string.len(payload))
+ file.open(url, "a+")
+ file.write(payload)
+ file.close()
+ else
+ conn:send("HTTP/1.1 200 OK\r\n\r\nERROR")
+ Status=0
+ end
+
+ if DataToGet==0 then
+ conn:send("HTTP/1.1 200 OK\r\n\r\nOK")
+ Status=0
+ end
+ end
+
+ return
+ end
+
+ DataToGet = -1
+
+ if url == "favicon.ico" then
+ conn:send("HTTP/1.1 404 file not found")
+ return
+ end
+
+ conn:send("HTTP/1.1 200 OK\r\n\r\n")
+
+ -- it wants a file in particular
+ if url~="" and vars=="" then
+ DataToGet = 0
+ return
+ end
+
+ conn:send("NodeMCU IDE
")
+
+ if vars=="edit" then
+ conn:send("")
+ conn:send("
")
+ end
+
+ if vars=="run" then
+ conn:send("")
+ local st, result=pcall(dofile, url)
+ conn:send(tostring(result))
+ conn:send("")
+ end
+
+ if url=="" then
+ local l = file.list();
+ for k,v in pairs(l) do
+ conn:send(""..k..", size:"..v.."
")
+ end
+ end
+
+ conn:send("")
+
+ end)
+ conn:on("sent",function(conn)
+ if DataToGet>=0 and method=="GET" then
+ if file.open(url, "r") then
+ file.seek("set", DataToGet)
+ local line=file.read(512)
+ file.close()
+ if line then
+ conn:send(line)
+ DataToGet = DataToGet + 512
+
+ if (string.len(line)==512) then
+ return
+ end
+ end
+ end
+ end
+
+ conn:close()
+ end)
+end)
+print("listening, free:", node.heap())
diff --git a/Mesures/ADC/ADS1115/web_srv2.lua b/Mesures/ADC/ADS1115/web_srv2.lua
new file mode 100644
index 0000000..d230751
--- /dev/null
+++ b/Mesures/ADC/ADS1115/web_srv2.lua
@@ -0,0 +1,67 @@
+-- petit script de serveur WEB avec Active Server Page ZYX
+-- permet d'exécuter du code LUA inline dans l'HTML !
+
+print("\n web_srv2.lua zf200112.1926 \n")
+
+-- envoie sur le port ouvert mais depuis l'environnement global !
+function zout(zstring)
+ if string.len(zstring) > 0 then
+ zzclient:send(zstring) -- envoie le résultat du code lua inline
+ end
+end
+
+-- envoie un fichier HTML sur le port. ATTENTION: longueur de la ligne maximale de 1'024 bytes !
+function send_file(zclient, zfilename)
+ print("start send html...")
+ zclient:send("HTTP/1.1 200 OK\n")
+ zclient:send("Content-Type: text/html\n\n")
+ zzclient = zclient -- export le port sur l'environnement global !
+ if zfilename == "" then zfilename = "z_index.html" end
+ file_web = file.open(zfilename, "r")
+ if file_web then
+ repeat
+ local line = file_web:readline()
+ if line then
+ if string.find(line, "<%%") then
+ flag_lua_code = true -- bascule sur le code lua inline
+ lua_code = ""
+ elseif string.find(line, "%%>") then
+ flag_lua_code = false -- revient sur le code HTML
+ loadstring(lua_code)() --on exécute ici le code lua inline !
+ lua_code = nil
+ elseif flag_lua_code then
+ lua_code = lua_code..line -- récupère le code lua inline
+ else
+ zclient:send(line) -- envoie le code HTML
+ end
+ end
+ until not line
+ file_web:close() file_web = nil flag_lua_code=nil zzclient=nil
+ else
+ zclient:send(""..zfilename.." not found - 404 error
Home
")
+ end
+end
+
+srv = net.createServer()
+srv:listen(80, function(conn)
+ conn:on("receive", function(client, request)
+ _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP")
+ if not string.find(request, "/favicon.ico") then
+ print("coucou")
+ if (method == nil) then
+ _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP")
+ end
+ print("method: ", method) print("path: ", path) print("vars: ", vars)
+ _GET = {}
+ if (vars ~= nil) then
+ for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
+ _GET[k] = v
+ print(k..": "..v)
+ end
+ end
+ file_html=string.gsub(path, "/", "")
+ send_file(client, file_html) file_html=nil _GET=nil
+ end
+ end)
+ conn:on("sent", function(c) c:close() end)
+end)
diff --git a/Mesures/ADC/ADS1115/wifi_info.lua b/Mesures/ADC/ADS1115/wifi_info.lua
new file mode 100644
index 0000000..7c0daa7
--- /dev/null
+++ b/Mesures/ADC/ADS1115/wifi_info.lua
@@ -0,0 +1,45 @@
+-- Petit script pour afficher les infos actuel du WIFI
+print("\n wifi_info.lua zf200106.1803 \n")
+
+function wifi_info()
+ local zmodewifi=wifi.getmode()
+
+ --wifi.NULLMODE, wifi.STATION, wifi.SOFTAP, wifi.STATIONAP
+
+ if zmodewifi == wifi.NULLMODE then
+ print("WIFI OFF")
+ elseif zmodewifi == wifi.STATION then
+ print("WIFI mode CLI")
+ print("Connected IP:\n",wifi.sta.getip())
+ local sta_config=wifi.sta.getconfig(true)
+ print("Current client config:")
+ print("\tssid:", sta_config.ssid)
+ print("\tpassword:", sta_config.pwd)
+ print("\tbssid:", sta_config.bssid)
+ elseif zmodewifi == wifi.SOFTAP then
+ print("WIFI mode AP\n")
+ print("AP IP: ", wifi.ap.getip())
+ print("Current AP config:")
+ local ap_config=wifi.ap.getconfig(true)
+ print("\tssid:", ap_config.ssid)
+ print("\tpassword:", ap_config.pwd)
+ print("\tbssid:", wifi.ap.getmac())
+ elseif zmodewifi == wifi.STATIONAP then
+ print("WIFI mode CLI+AP\n")
+ print("CLIENT IP:\n",wifi.sta.getip())
+ local sta_config=wifi.sta.getconfig(true)
+ print("Current CLIENT config:")
+ print("\tssid:", sta_config.ssid)
+ print("\tpassword:", sta_config.pwd)
+ print("\tbssid:", sta_config.bssid.."\n")
+ print("AP IP: ", wifi.ap.getip())
+ print("Current AP config:")
+ local ap_config=wifi.ap.getconfig(true)
+ print("\tssid:", ap_config.ssid)
+ print("\tpassword:", ap_config.pwd)
+ print("\tbssid:", wifi.ap.getmac())
+ end
+ wifi_info=nil
+end
+wifi_info()
+
diff --git a/Mesures/ADC/ADS1115/wifi_init.lua b/Mesures/ADC/ADS1115/wifi_init.lua
new file mode 100644
index 0000000..ffffb05
--- /dev/null
+++ b/Mesures/ADC/ADS1115/wifi_init.lua
@@ -0,0 +1,74 @@
+-- Petit script pour initaliser la couche WIFI
+
+function wifi_init()
+ print("\n wifi_init.lua zf200111.1219 \n")
+
+ function wifi_init_end()
+ wifi_init1:unregister() i=nil
+ f= "wifi_info.lua" if file.exists(f) then dofile(f) end
+ f=nil secrets_wifi=nil cli_pwd=nil cli_ssid=nil
+ wifi_init1=nil wifi_init=nil
+ print(node.heap()) collectgarbage() print(node.heap())
+ f= "telnet_srv2.lua" if file.exists(f) then dofile(f) end
+ f= "web_srv2.lua" if file.exists(f) then dofile(f) end
+ print(node.heap()) collectgarbage() print(node.heap())
+ zdelay=1 if reset_reason=="seconde_chance" then zdelay=20 end
+ wifi_init3=tmr.create()
+ wifi_init3:alarm(zdelay*1000, tmr.ALARM_SINGLE, function()
+ f= "boot.lua" if file.exists(f) then dofile(f) end
+ wifi_init3:unregister() wifi_init3=nil wifi_init_end=nil
+ reset_reason=nil zdelay=nil
+ end)
+ end
+
+ if file.exists("_setup_wifi_") then
+ file.remove("_setup_wifi_")
+ print("setup wifi...")
+ enduser_setup.start(function()
+ print("on est sortit du setup wifi et on restart !")
+ node.restart()
+ end)
+ print("setup wifi out...")
+ else
+ -- charge les secrets pour le wifi
+ f= "secrets_wifi.lua" if file.exists(f) then dofile(f) end
+ f= "secrets_project.lua" if file.exists(f) then dofile(f) end
+ wifi.setmode(wifi.STATIONAP,true)
+ wifi.sta.config{ssid=cli_ssid, pwd=cli_pwd, auto=true, save=true}
+ wifi.sta.autoconnect(1) wifi.sta.connect()
+ if node_id == nil then node_id = "generic" end
+ wifi.ap.config({ ssid = ap_ssid.."_"..node_id, pwd = ap_pwd, save=true })
+ ap_ssid=nil ap_pwd=nil
+ wifi_init2=tmr.create()
+ wifi_init2:alarm(60*1000, tmr.ALARM_SINGLE, function()
+ print("BOOOOUM, y'a plus de AP WIFI !")
+ wifi.setmode(wifi.STATION,true) wifi_init2=nil
+ print(node.heap()) collectgarbage() print(node.heap())
+ end)
+
+ gpio.write(zLED, gpio.HIGH) gpio.mode(zLED, gpio.OUTPUT) i=1
+ wifi_init1=tmr.create()
+ wifi_init1:alarm(1*1000, tmr.ALARM_AUTO , function()
+ gpio.write(zLED, gpio.LOW) tmr.delay(10000) gpio.write(zLED, gpio.HIGH)
+ if wifi.sta.getip() == nil then
+ print("Connecting to AP...")
+ i=i+1
+ if i > 15 then
+ print("pas de wifi :-(")
+ wifi_init2:unregister() wifi_init2=nil
+ wifi.setmode(wifi.SOFTAP,true)
+ wifi_init_end()
+ end
+ else
+ wifi_init_end()
+ end
+ end)
+ end
+end
+
+wifi_init()
+
+--[[
+file.putcontents("_setup_wifi_", "")
+]]
+
diff --git a/Mesures/ADC/ADS1115/z_index.html b/Mesures/ADC/ADS1115/z_index.html
new file mode 100644
index 0000000..724061f
--- /dev/null
+++ b/Mesures/ADC/ADS1115/z_index.html
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+<%
+ zout(""..node_id.."")
+%>
+
+
+<%
+ zout(""..node_id.." 200118.1804
")
+%>
+ Home...
+ Menu:
+
+
+<%
+ if _GET.SetupWIFI == "true" then
+ print("On demande le setup wifi depuis le browser !")
+ wifi_setup_ok=(math.floor(100*node.random()))
+ zout("
Etes-vous vraiment certain ?
Si oui, faites: ")
+ zout(' Ok
')
+ end
+%>
+
+<%
+ if (wifi_setup_ok ~= nil) and (_GET.SetupWIFI == tostring(wifi_setup_ok)) then
+ print("On confirme le setup wifi depuis le browser !")
+ zout("
Choisir comme WIFI AP: setup_gadget puis aller sur: http://192.168.4.1
")
+ file.putcontents("_setup_wifi_", "toto")
+ tmr.create():alarm(5*1000, tmr.ALARM_SINGLE, function()
+ print("on restart pour le setup wifi")
+ wifi.sta.config{ssid="", pwd="", auto=true, save=true}
+ wifi.sta.autoconnect(1) wifi.sta.connect()
+ node.restart()
+ end)
+ end
+%>
+
+<%
+ if _GET.RESTART == "true" then
+ print("oups restart...")
+ zout("
oups restart...
")
+ tmr.create():alarm(5*1000, tmr.ALARM_SINGLE, function()
+ print("on restart...")
+ node.restart()
+ end)
+ end
+%>
+
+<%
+ zout("Etat de la LED:")
+ if gpio.read(zLED) == 1 then zout("OFF") else zout("ON") end
+ zout("
")
+%>
+
+<%
+ if zRELAY ~= nil then
+ zout("Etat du RELAY:")
+ if gpio.read(zRELAY) == 0 then zout("OFF") else zout("ON") end
+ zout("
")
+ end
+%>
+
+<%
+ a,b,c = wifi.sta.getip()
+ if a ~= nil then
+ zout("
IP: "..a.."
\n".."MASK: "..b.."
\n".."GATEWAY: "..c.."
\n")
+ a=nil b=nil c=nil
+ end
+ collectgarbage() zout("RAM: "..node.heap().."
")
+%>
+
+<%
+ zout("
Etat des GLOBALS !
\n")
+ zout("\n")
+ for k,v in pairs(_G) do
+ if k ~= "lua_code" then
+ v = tostring(v)
+ zout("")
+ zout("| "..k.." | ") zout(""..v.." | ")
+ zout("
\n")
+ end
+ end
+ zout("
")
+%>
+
+
Restart !
+
+
+