Tous les capteurs reliés au RPI par Wifi avec module ESP8266

Parce que les applications du Raspberry Pi sont illimités...

Modérateur : Francois

fidoboulettes
Messages : 33
Enregistré le : mar. 26 mai 2015 07:18

Re: Tous les capteurs reliés au RPI par Wifi avec module ESP

Message par fidoboulettes » sam. 30 mai 2015 12:43

Bonjour à tous,
petit nouveau sur le forum, je suis l’heureux possesseur de 2 RPI: Un comme médiacenter, et l'autre pour un "projet" de domotique dans ma maison. Ayant découvert il y a peu, l'existence de ce petit objet qu'est l'ESP, je me suis dit que c'était exactement ce qu'il me fallait pour barder ma maison de capteurs, sans fils et à pas cher... :D (suffit de voir le prix des modules enocean)... Je m'en suis donc procuré un sur la bay et c'est là que les ennui (pour moi commencent)... Je n'ai rien trouvé de mieux que d'acheter un module "pas simple" pour débuter: http://smarpl.com/content/esp8266-esp-2 ... mpressions
Je me suis dit que plein de GPIO ce serait cool... sauf que, après l'avoir reçu, je me suis rendu compte que c'était un brin compliqué, pour un noob comme moi, pour démarrer.

Comme beaucoup de monde, j'ai voulu commencer par quelque chose de "simple" pour me faire les dents, à savoir brancher une DS18B20 dessus et envoyer les données sur Thinkspeak.com. Pour ce faire, il y a plein de tuto sur instuctables.com... Donc après l'avoir flashé (non sans mal) avec NodeMcu 0.9.6, transférer des scripts piochés sur le net, j'arrive à me connecter sur mon wifi local, envoyer en manuel des données sur mon channel thinkspeak... Le seul hic, c'est les données températures du capteur que je n'arrive pas à relever... j'ai systématiquement une donnée farfelue : Temp:-1.0999 C qui apparait sur mon terminal (Lualoader)... cela me fait penser à un mauvais adressage dans mon script.

J'ai parcouru l'ensemble de ce post pour tenter d'y voire plus clair, d'autres sur des sites anglais (qui n'est pas mon fort) mais rien à faire, je bloque dessus depuis une semaine.
Je me tourne donc vers vous, et plus particulièrement SMB38 qui à l'air de maitriser ce langage pour m'aider à débloquer la situation.

Concernant l'ESP, de ce que j'ai compris, possède 10 GPIO (numériques????), d'après la dernière nomenclature de NodeMCU, le GPIO 14 correspond à la broche 5, mon script est donc le suivant (le début):

"-- Measure temperature and post data to thingspeak.com
-- 2014 OK1CDJ
--- Tem sensor DS18B20 is connected to GPIO14
--- 2015.01.21 sza2 temperature value concatenation bug correction

pin = 5
ow.setup(pin)

counter=0
lasttemp=-999
...."

Au besoin, je peux envoyer le script complet
Merci à vous de votre aide

PS: Mon DS18B20 est validé (par moi même) sur un arduino

Avatar du membre
Jean-Marie
Raspinaute
Messages : 240
Enregistré le : sam. 24 janv. 2015 18:01
Localisation : Arlon, Belgique
Contact :

Re: Tous les capteurs reliés au RPI par Wifi avec module ESP

Message par Jean-Marie » sam. 30 mai 2015 15:08

Hello Fidoboulettes

Pour LUA, je ne peux guère t'aider.
Par contre, il y a des années, j'ai cherché pas mal de temps à faire fonctionner une sonde DS18B20, jusqu'à ce que je me rende compte que j'avais oublié la résistance de pull-up de 4,7k.
Malheureusement, il semble que ce ne soit pas cela puisque ta sonde fonctionne bien avec Arduino.

fidoboulettes
Messages : 33
Enregistré le : mar. 26 mai 2015 07:18

Re: Tous les capteurs reliés au RPI par Wifi avec module ESP

Message par fidoboulettes » sam. 30 mai 2015 16:39

Hello Jean-Marie,
hé oui, la résistance est présente... j'ai même essayé la version sans résistance avec les 2 broches branchée au GND (fonctionnement en tension résiduelle?) mais rien à faire.... bon, j'vas continuer à fouiner...

smba38
Modérateur
Messages : 193
Enregistré le : mar. 24 févr. 2015 09:28
Localisation : Bourgoin

Re: Tous les capteurs reliés au RPI par Wifi avec module ESP

Message par smba38 » sam. 30 mai 2015 19:14

Bonsoir Fidoboulettes

Jai essayé le script de https://github.com/ok1cdj/ESP8266-LUA/b ... ds1820.lua

ça semble être le même script que celui que tu as utilisé

J'ai un peu modifié le script pour mettre des commentaires devant l'envoi des données à thingspeak.com
trois tirets --- devant les lignes à commenter
J'ai également modifié la dernière ligne pour avoir une mesure toutes les 10 secondes
Dans la version originale, la première mesure intervenait après une minute.

Code : Tout sélectionner

-- Measure temperature and post data to thingspeak.com
-- 2014 OK1CDJ
--- Tem sensor DS18B20 is conntected to GPIO14=PIN=5
--- 2015.01.21 sza2 temperature value concatenation bug correction

pin = 5
ow.setup(pin)

counter=0
lasttemp=-999

function bxor(a,b)
   local r = 0
   for i = 0, 31 do
      if ( a % 2 + b % 2 == 1 ) then
         r = r + 2^i
      end
      a = a / 2
      b = b / 2
   end
   return r
end

--- Get temperature from DS18B20 
function getTemp()
      addr = ow.reset_search(pin)
      repeat
        tmr.wdclr()
      
      if (addr ~= nil) then
        crc = ow.crc8(string.sub(addr,1,7))
        if (crc == addr:byte(8)) then
          if ((addr:byte(1) == 0x10) or (addr:byte(1) == 0x28)) then
                ow.reset(pin)
                ow.select(pin, addr)
                ow.write(pin, 0x44, 1)
                tmr.delay(1000000)
                present = ow.reset(pin)
                ow.select(pin, addr)
                ow.write(pin,0xBE, 1)
                data = nil
                data = string.char(ow.read(pin))
                for i = 1, 8 do
                  data = data .. string.char(ow.read(pin))
                end
                crc = ow.crc8(string.sub(data,1,8))
                if (crc == data:byte(9)) then
                   t = (data:byte(1) + data:byte(2) * 256)
         if (t > 32768) then
                    t = (bxor(t, 0xffff)) + 1
                    t = (-1) * t
                   end
         t = t * 625
                   lasttemp = t
         print("Last temp: " .. lasttemp)
                end                   
                tmr.wdclr()
          end
        end
      end
      addr = ow.search(pin)
      until(addr == nil)
end

--- Get temp and send data to thingspeak.com
function sendData()

getTemp()
t1 = lasttemp / 10000
t2 = (lasttemp >= 0 and lasttemp % 10000) or (10000 - lasttemp % 10000)
print("Temp:"..t1 .. "."..string.format("%04d", t2).." C\n")
-- conection to thingspeak.com
---print("Sending data to thingspeak.com")
---conn=net.createConnection(net.TCP, 0) 
---conn:on("receive", function(conn, payload) print(payload) end)
-- api.thingspeak.com 184.106.153.149
---conn:connect(80,'184.106.153.149') 
---conn:send("GET /update?key=YOURKEY&field1="..t1.."."..string.format("%04d", t2).." HTTP/1.1\r\n") 
---conn:send("Host: api.thingspeak.com\r\n") 
---conn:send("Accept: */*\r\n") 
---conn:send("User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n")
---conn:send("\r\n")
---conn:on("sent",function(conn)
---                      print("Closing connection")
---                      conn:close()
---                  end)
---conn:on("disconnection", function(conn)
---                                print("Got disconnection...")
---  end)
end

-- send data every X ms to thing speak
tmr.alarm(0, 10000, 1, function() sendData() end )

Voici les résultats dans la console Lua

Code : Tout sélectionner

dofile("ds18b20_inter.lua")
> Last temp: 231875
Last temp: 265000
Temp:26.5000 C

Last temp: 231875
Last temp: 264375
Temp:26.4375 C

Last temp: 231875
Last temp: 308125
Temp:30.8125 C
Il y a un piège sur la numérotation des GPIO, il faut aller voir dans la doc des API
En plus il y a deux tables pour deux générations de puces
Pour ma part j'ai utilisé la pin 5 = GPIO14
Essaye avec pin=2 tu as peut être une vieille génération de puce.
Et sur l'ESP-201 c'est peut-être encore différent
http://smarpl.com/sites/default/files/d ... ce-v01.pdf
Essaye avec pin=9

Code : Tout sélectionner

Nouvelle table 
0 [*] GPIO16
1 GPIO5
2 GPIO4
3 GPIO0
4 GPIO2
5 GPIO14
6 GPIO12
7 GPIO13
8 GPIO15
9 GPIO3
10 GPIO1
11 GPIO9
12 GPIO10


Ancienne table

0 GPIO12
1 GPIO13
2 GPIO14
3 GPIO15
4 GPIO3
5 GPIO1
6 GPIO9
7 GPIO10   
8 GPIO0
9 GPIO2
10 GPIO4
11 GPIO5 
 
SMBA38

fidoboulettes
Messages : 33
Enregistré le : mar. 26 mai 2015 07:18

Re: Tous les capteurs reliés au RPI par Wifi avec module ESP

Message par fidoboulettes » dim. 31 mai 2015 07:26

Bonjour SMBA38,
merci de te pencher sur mon cas... Alors tout d'abord, j'ai bien revérifié que ma sonde fonctionnait toujours en la repassant sur mon arduino uno --> ok.

J'ai ensuite re-branché le tout sur Mon ESP... GPIO 14... j'ai essayé dans ton programme (qui au passage était exactement celui que j'avais pris sur instructables) l'ancienne et nouvelle nomenclature... mais normalement ça devrait être la nouvelle vu que je suis en NodeMCU 0.9.6 si j'ai bien tout compris... mais rien à faire... toujours cette satané température de -1.09°C...
Par acquis de conscience, au cas ou j'ai un soucis de GPIO, j'ai pluggé la sonde sur le GPIO2, l'ai déclaré comme PIN = 4 (Nouvelle nomenclature) --> pas ok, puis PIN=14 (ancienne) --> pin n'existe pas!...
C'est vraiment déconcertant.

Je me demande si c'est pas le FW qui déconne... je vais tenter de le reflasher avec l'ancien

Bon, c'est pas grave, je me suis commandé un ESP-01 qui devrait arriver demain ou mardi, je recommencerai à ce moment là....

smba38
Modérateur
Messages : 193
Enregistré le : mar. 24 févr. 2015 09:28
Localisation : Bourgoin

Re: Tous les capteurs reliés au RPI par Wifi avec module ESP

Message par smba38 » dim. 31 mai 2015 10:04

Bonjour Fidoboulettes.

Une question , comment as tu branché le DS18B20: en mode parasite avec deux fils , avec 3 fils, en 3,3V, en 5V?.

Dans mes tests j'ai utilisé 3 fils en 3,3V

http://hacklab.fi/news/esp8266-ds18b20- ... k-nodemcu/
dans le code la recherche du DS18B20 est faite sur le N° de famille = 0x28.
J'ai essayé en changeant dans le code le code de la famille 0x28 en 0x27, et j'ai la même valeur de température que toi ?.
l'ESP8266 ne trouve pas dans ce cas le DS18B20.
si tu as utilisé un branchement en mode parasite, essaye le branchement avec trois fils.

SMBA38.

Avatar du membre
Jean-Marie
Raspinaute
Messages : 240
Enregistré le : sam. 24 janv. 2015 18:01
Localisation : Arlon, Belgique
Contact :

Re: Tous les capteurs reliés au RPI par Wifi avec module ESP

Message par Jean-Marie » dim. 31 mai 2015 10:06

Hello SMBA38

Tu as pris la T° toutes les dix secondes mais tu passes de 26.4375 C à 30.8125 C.
Serais-tu un fumeur de Havane comme Gainsbard ? ;)
Dans ce cas, ne t'approche pas trop de la sonde.

fidoboulettes
Messages : 33
Enregistré le : mar. 26 mai 2015 07:18

Re: Tous les capteurs reliés au RPI par Wifi avec module ESP

Message par fidoboulettes » dim. 31 mai 2015 13:58

Bonjour à tous,
en fait j'ai essayé les deux, parasite et connecté au 3v3... mais rien a faire... tout pareil...
Je n'ai par contre rien compris à ton histoire de code de famille... Et rien vu dans le code traitant de cela... a quelle ligne et comment remplacer cela?

Merci

smba38
Modérateur
Messages : 193
Enregistré le : mar. 24 févr. 2015 09:28
Localisation : Bourgoin

Re: Tous les capteurs reliés au RPI par Wifi avec module ESP

Message par smba38 » dim. 31 mai 2015 14:46

Hello

Jean-Marie a écrit :
Tu as pris la T° toutes les dix secondes mais tu passes de 26.4375 C à 30.8125 C.
Serais-tu un fumeur de Havane comme Gainsbard ? ;)
Dans ce cas, ne t'approche pas trop de la sonde.
Entre temps j'ai soufflé (A jeun ) sur la sonde.
Fidoboulettes a écrit : en fait j'ai essayé les deux, parasite et connecté au 3v3... mais rien a faire... tout pareil...
Je n'ai par contre rien compris à ton histoire de code de famille... Et rien vu dans le code traitant de cela... a quelle ligne et comment remplacer cela?
As tu essayé avec 3 fils?
As tu essayé avec pin=9 ?

La ligne qui teste le code famille est la suivante (dans le script que j'ai indiqué dans un message précédent).

Code : Tout sélectionner

          if ((addr:byte(1) == 0x10) or (addr:byte(1) == 0x28)) then
0x10 et 0x28 correspondent aux codes familles http://owfs.sourceforge.net/family.html
Mais il y a d'autres familles que 0x10 et 0x28 pour les capteurs de température.

Sur ton script Arduino la recherche s'effectue peut être sur tous les codes familles.

Essaye ce second script qui a l'avantage de sortir une erreur si aucun capteur n'est trouvé.
Sur le bus 1-wire j'ai deux DS18B20 il y a donc deux lignes avec des températures.
J'ai branché le bus 1-Wire après le message No device present on the OneWireBus.

Code : Tout sélectionner

-- Read temperature from all DS18B20 sensors on the OneWireBus
-- Using NodeMCU 0.9.5 build 20150106
function prinTemp ()
 local pin = 5   -- use GPIO-14
 local tempL, tempH, temp = 0
 local power, nopower = 1, 0
 ow.setup(pin)
 if ow.reset(pin) == 1 then
  counter = counter + 1
  print("Start conversion: " .. counter)

 -- Select all devices on the owbus and start conversion on all devices
 -- power the bus during conversion
  ow.skip(pin)
  ow.write(pin, 0x44, power)

  tmr.wdclr() -- keep the watchdog happy
  tmr.delay(750000) -- wait max 750 msec for conversion to complete

-- start searching DS18B20 (0x28) devices only
  ow.reset_search(pin)
  ow.target_search(pin,0x28)
-- search the first device
  local addr = ow.search(pin)
-- and loop through all devices
  while addr do
   tmr.wdclr()
--  print(addr:byte(1,8))
   ow.reset(pin)
   ow.select(pin, addr)   -- select the found sensor
   ow.write(pin, 0xBE, nopower) -- READ_SCRATCHPAD
-- read temperature LSB + MSB bytes from sensor
   temp = ( ow.read(pin) + ow.read(pin) * 256 ) * 625
-- stop reading rest of scratchpad ram after the first 2 bytes
   ow.reset(pin)
-- floating point temperature with 1 decimal
   tempH = temp / 10000
   tempL = ( temp % 10000 ) / 1000
-- round up 1st decimal using second decimal
   round = ( temp % 1000 ) / 100
   if round >= 5 then
    tempL = tempL + 1
   end
--   print("T=" .. tempH .. "." .. tempL .. " C - " .. temp)
   print("T=" .. tempH .. "." .. tempL)

-- search next device
   addr = ow.search(pin)
  end
 else
  print("No device present on the OneWireBus.")
 end
end
-- Main program starts here
 counter = 0
-- set timer to print temperature every 10 seconds
    tmr.alarm(1, 10 * 1000, 1, prinTemp )

Code : Tout sélectionner

No device present on the OneWireBus.
Start conversion: 1
T=24.4
T=26.9
Start conversion: 2
T=24.4
T=26.8
SMBA38

fidoboulettes
Messages : 33
Enregistré le : mar. 26 mai 2015 07:18

Re: Tous les capteurs reliés au RPI par Wifi avec module ESP

Message par fidoboulettes » dim. 31 mai 2015 16:20

Re,

j'avais vu entretemps la ligne contenant les codes de famille... l'ai passé en 0x27 pour voir mais tt pareil.

Alors oui, branchement avec 3 fil + résistance 4.7k entre Vdd et le fil de transmission... essayé aussi le script gpio 14 = 9 ou gpio 14 = 5... mais rien ne bouge....
Je viens de lancer ton test et voici le résultat:

name:ds1820.lua, size:2854
> Start conversion: 1
Start conversion: 2
T=24.8
Start conversion: 3
Start conversion: 4
T=24.9
Start conversion: 5
Start conversion: 6
T=24.9
Start conversion: 7
Start conversion: 8
T=24.8
Start conversion: 9
Start conversion: 10
T=24.9
Start conversion: 11
Start conversion: 12
T=24.9
Start conversion: 13
Start conversion: 14
T=24.9
Start conversion: 15
Start conversion: 16
T=24.8
Start conversion: 17
Start conversion: 18
T=24.8
Start conversion: 19
Start conversion: 20
Start conversion: 21
.
.
.

mais j'avoue que là j'y comprend rien.

Répondre

Retourner vers « Et tout le reste »