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

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 » ven. 24 avr. 2015 19:41

Hello les amis,

Le SDK nouveau est arrivé.

Comme les lessives qui, depuis que je suis petit, lavent toujours plus blanc, le nouveau esp_iot_sdk_v1.0.1_15_04_24 bug toujours moins fort.

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. 25 avr. 2015 19:08

Pour ceux qui, comme moi, ne savent plus exactement comment faire pour flasher la nouvelle version, les explications ont été données par SMBA38 ICI

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. 26 avr. 2015 11:20

Hello Jean-Marie,

Avec une puce ESP avec 1MO de mémoire j’ai téléchargé la dernière version en utilisant AT+CIUPDATE.

Code : Tout sélectionner

AT+CIUPDATE

+CIPUPDATE:1
+CIPUPDATE:2
+CIPUPDATE:3
+CIPUPDATE:4

AT
OK

AT+GMR
AT version:0.23.0.0(Apr 24 2015 21:11:01)
SDK version:1.0.1
compile time:Apr 24 2015 21:19:36

OK
 
Avec la vitesse réglée sur 74880 on peut vérifier qu’au boot c’est l’user2 qui est lancé.

Code : Tout sélectionner

2nd boot version : 1.3(b3)
  SPI Speed      : 40MHz
  SPI Mode       : QIO
  SPI Flash Size : 32Mbit
jump to run user2
Les lignes

Code : Tout sélectionner

ready
WIFI CONNECTED
WIFI GOT IP
Sont affichées automatiquement.
La commande AT+CIUPDATE n’a pas affiché le code retour OK

La façon de numéroter les versions est bizarre, normalement le numéro de version aurait du être (b3).
Mais seule la date de compilation a été changée.

J’ai utilisé AT+CIUPDATE à partir de la version (b1), on peut donc sauter des versions, c’est la dernière version connue qui est utilisée pour la mise à jour.

De nouvelles API permettent d’appeler un serveur NTP pour récupérer la date et l’heure.
Cette possibilité n’est pas encore intégrée dans des commandes AT mais c’est surement pour bientôt.
Par contre je pense que l’on peut appeler des API du SDK avec l’IDE Arduino / ESP8266.

On a donc avec NTP la possibilité de dater les valeurs lues sur les capteurs.
On peut concevoir un montage ou au boot la date est lue via le WIFI et NTP.
La puce DS1337 est initialisée avec cette date et cette puce peut ensuite fournir la date et l'heure des mesures .
On conserve dans un tableau en mémoire les dates et les valeurs lues sur des capteurs.

Le Wifi n’est plus utilisé pour ménager les piles, on peut envoyer les données au serveur par exemple une seule fois par jour.
Si la mémoire vive ne suffit pas on peut conserver ces données en mémoire flash pour vider la mémoire à la demande, la puce ESP peut même être autonome en utilisant l’IDE Arduino /ESP8266.

Ceci me rappelle le iButton de Dallas que j’ai utilisé il y a quelques années.

http://fr.rs-online.com/web/p/capteurs- ... e/2183769/
Certains avait même pensé à des utilisations plus ou moins autorisées.

Code : Tout sélectionner

 http://furrtek.free.fr/?a=ibutton[/url]

L’iButton utilisait le protocole OneWire de Dallas.
On avait la possibilité de configurer le délai entre deux mesures, ensuite on pouvait placer l’iButton dans l’emplacement ou l’on devait effectuer des mesures.

Et au bout d’un certain temps les données étaient récupérées en connectant l’iButton en sur un bus OneWire.

A+
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 » mer. 29 avr. 2015 12:03

Hello SMBA38

Sorry, je me suis absenté quelques jours.

J'ai fait la mise à jour du firmware, non pas par la méthode wifi, mais par le convertisseur USB-Série et en suivant les indications du début du fichier readme.txt du répertoire \bin\AT

Code : Tout sélectionner

download:
boot_v1.2+.bin      0x00000
user1.1024.new.bin  0x01000
blank.bin           0x7e000 & 0xfe000
Tout s'est passé sans encombre.
Après flashage et coupure de l'alimentation, j'ai déconnecté les pins GPIO0 et GPIO2 spécifiques du flashage et j'ai rebooté l'ESP-12
Voici le message qui apparaît au moniteur avec un Baud rate de 74880:
49.jpg
49.jpg (104.67 Kio) Vu 8040 fois
Avec un Baud Rate de 115200, le boot suivi de la commande AT+GMR donne ceci:
50.jpg
50.jpg (115.16 Kio) Vu 8040 fois
En comparant avec SMBA38, sa version est plus récente de 5 secondes ! ;)


Du côté de ma commande de DS1337 (datant du 27 mars), mauvaise nouvelle. AliExpress m'a informé que le vendeur fait l'objet d'une enquête pour suspicion de pratique frauduleuse. Le vendeur a 5 jours pour apporter les preuves de l'envoi du matériel. Si la suspicion est confirmée, je serai remboursé, avec mille excuses. Je pourrai alors commander autre part, ce qui retarde l'avancement des expériences.
Patience et longueur de temps font plus que force ni que rage [Jean de la Fontaine. Le Lion et le Rat].

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 » mer. 29 avr. 2015 12:31

Coucou Jean-Marie,

Pour conserver les configurations User et Wifi on peut ne pas flasher les plages avec blank.bin.
Dans ce cas il n'est pas nécessaire de reconfigurer le Wifi.

J'utilise la version 1.3 du boot.

Ta commande par la Chine des DS1337 n'a pas l'air très rapide, ils arrivent peut-être à pieds ?.

J'ai commandé un DS1337 en Allemagne, c'est un peu plus cher mais je l'ai déjà reçu.

par contre j'attends les transistors.

A+
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 » mer. 29 avr. 2015 16:36

Fausse alerte pour les DS1337. Je viens de les reçevoir par recommandé. Il suffisait de parler du loup !
Ils ont dû venir à pieds, mais quand même chaussés de bottes de 7 lieues.
L'Allemagne est certainement plus rapide, mais j'ai eu 10 pièces pour 8,82 €.

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 » mer. 29 avr. 2015 18:46

SMBA38 a écrit :par contre j'attends les transistors
Parles-tu des transistors qui doivent couper l'alimentation de l'ESP (+ éventuellement le µC) ?
Quel transistor as-tu choisi ?
La pin INTA de la DS1337 est une pin open-drain. Donc elle nécessite une résistance de pull-up. Lorsque l'alarme est déclenchée, la pin passe à l'état bas, ce qui doit déclencher l'alimentation de l'ESP par l'intermédiaire d'un transistor MOSFET de type P-channel (un transistor bipolaire ordinaire fonctionnerait mais consommerait trop de courant). Comme ce transistor doit gérer une alimentation de 3.3V, il faut un modèle capable de fonctionner a une tension aussi basse.

Pour ma part, j'ai des IRF7317. Le boîtier contient en fait 2 transistors complémentaires : un N-Channel et un P-Channel. Ce double transistor est nécessaire si le signal de commande était actif à l'état haut. Ici, comme il est actif à l'état bas, je n'utilise que le transistor P-Channel.

J'ai soudé la DS1337 sur une petite platine d'adaptation pour qu'elle soit breadboard frendly pour les tests. J'ai utilisé la méthode de tirage de la soudure vue il y a un petit temps. Ça marche super bien. En un rien de temps, toutes les pattes étaient soudées.
Il ne reste plus qu'à faire les essais de programmation. Pour moi, c'est le plus gros morceau. Je vous tiens au courant.

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. 3 mai 2015 10:33

Coucou Jean-Marie.

J’ai testé le DS1337 avec l’IDE Arduino / ESP8266.
J’ai juste mis une led sur la sortie Alarme2 (INTB) du ds1337.
J’ai un problème car le registre des statuts m’indique que le l’oscillator est arrêté (OSF=Bit 7 du registre Status en 0x0F).
Je n’ai pas de quartz à 32.768KHZ, j’ai mis un quartz de 31.400KHZ.
Les secondes ne sont pas incrémentées (ou très lentement).

Les raison évoquées par la doc du DS1337 sont :

Code : Tout sélectionner

Bit 7: Oscillator Stop Flag (OSF). A logic 1 in this bit indicates that the oscillator either is stopped or was stopped for some period of time and may be used to judge the validity of the clock and calendar data. This bit is set to logic 1 anytime that the oscillator stops. The following are examples of conditions that can cause the OSF bit to be set:

1) The first time power is applied. 
2) The voltage present on VCC is insufficient to support oscillation. 
3) The EOSC bit is turned off. 
4) External influences on the crystal (e.g., noise, leakage, etc.). 
J’ai pensé à un PB de perturbation en WiFI.
Je n’ai pas trouvé de solution pour arrêter l’émission wifi avec l’IDE Arduino /ESP8266.

J’ai essayé avec Lua idem , oscillator à l’arrêt.

Si j’enlève le Quartz j’ai exactement les mêmes résultats.
J’ai commandé un quartz à 32.768KHZ pour voir si le PB vient du Quartz.

Attention, Il faut couper l'alimentation du DS1337 un certain temps pour que celui ci reprenne ses valeurs par défaut.

Voici le code de l’IDE Arduino / ESP8266
.
Il doit fonctionner avec un Arduino en modifiant la vitesse de l’UART et en indiquant correctement les GPIO.
Remplacer Wire.pins(2, 14);
Il faut également supprimer #include <ESP8266WiFi.h>

Code : Tout sélectionner

#include "Wire.h"
#include <ESP8266WiFi.h>
#define DS1337_I2C_ADDRESS 0x68  // the I2C address of  RTC

// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
  return ( (val / 10 * 16) + (val % 10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return ( (val / 16 * 10) + (val % 16) );
}
// Ininialisation registres date= adr  0x-00 -> Ox06, alarme1 = 0x07 -> 0x0a, alarme2= 0x0b -> 0x0d
//                          Contrôles =0x0E 
void setDataDs1337(byte adr, int lg,byte  buff[])
{
  int i;
  Wire.beginTransmission(DS1337_I2C_ADDRESS);
  Wire.write(adr);
  for (i= 0 ;i< lg;i++){Wire.write(buff[i]); }
  Wire.endTransmission();
}

void StatusDs1337()  // lecture controles et status
{
  byte controle,status;
  Wire.beginTransmission(DS1337_I2C_ADDRESS);
  Wire.write(0x0E);
  Wire.endTransmission();
  Wire.requestFrom(DS1337_I2C_ADDRESS, 2);
  controle=Wire.read();
  status=Wire.read();
  Serial.print("Controles=");
  Serial.print(controle, HEX);  // control
  Serial.print(", Status=");
  Serial.print(status, HEX);  // status
  Serial.print(", Date=");

 
}
// lectures registre et affichage en hexa est bcd 
void getDataHexDs1337(const char libelle[],byte adr, int lg)
{
  int i;
  byte oct;
  Serial.print(libelle);
  Serial.print(" adr=");Serial.print(adr, HEX);
  Wire.beginTransmission(DS1337_I2C_ADDRESS);
  Wire.write(adr); Serial.print("->");
  Wire.endTransmission();
  Wire.requestFrom(DS1337_I2C_ADDRESS, lg);

  for (i= 0 ;i< lg;i++)
  {
   oct=Wire.read();
   Serial.print(" (");
   Serial.print(oct, HEX);
   Serial.print("):");
   Serial.print( bcdToDec(oct & 0x7F), DEC);  // 12/24 et AM/PM et DY/DT  (Date of month)  toujours à 0 
   }
  Serial.println(" ");
  Wire.endTransmission();
}

// Lecture et affichage date en cours
void getDateDs1337()
{
  byte second, minute, hour, dayOfWeek,dayOfMonth, month, year;

  // Reset the register pointer
  Wire.beginTransmission(DS1337_I2C_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();
  Wire.requestFrom(DS1337_I2C_ADDRESS, 7);
  second     = bcdToDec(Wire.read() & 0x7f);  // sauf bit 7
  minute     = bcdToDec(Wire.read());
  //hour       = bcdToDec(Wire.read() & 0x3f);  // Need to change this if 12 hour am/pm
  hour       = bcdToDec(Wire.read() );  
  dayOfWeek  = bcdToDec(Wire.read());
  dayOfMonth = bcdToDec(Wire.read());
  month      = bcdToDec(Wire.read());
  year       = bcdToDec(Wire.read());
  Serial.print(hour, DEC);
  Serial.print(":");
  Serial.print(minute, DEC);
  Serial.print(":");
  Serial.print(second, DEC);
  Serial.print("  ");
  Serial.print(month, DEC);
  Serial.print("/");
  Serial.print(dayOfMonth, DEC);
  Serial.print("/");
  Serial.print(year, DEC);
  Serial.print("  ");
  Serial.println();
  //Serial.print("Day of week:");
}

void setup() {
  byte A1M1,A1M2,A1M3,A1M4,DYDT1,A2M1,A2M2,A2M3,A2M4,DYDT2,AMPM1224;
  byte second, minute, hour, dayOfWeek,dayOfMonth, month, year;
  Wire.pins(2, 14);  // sur esp8266= gpio2 et GPIO14
  Wire.begin();
  Serial.begin(115200);
  delay(5000);
  
 // alarmes
 A1M1=0x80;
 A1M2=0x80;
 A1M3=0x80;
 A1M4=0x80;
 DYDT1=0x00;

 A2M2=0x80;
 A2M3=0x80;
 A2M4=0x80;
 DYDT2=0x00;
  
 AMPM1224 = 0x00; // 24H et date  du mois 
 
 second =       decToBcd(0);
 minute =       decToBcd(23);
 hour  =        decToBcd(22);
 dayOfWeek =    decToBcd(7);
 dayOfMonth =   decToBcd(1);
 month =        decToBcd(5);
 year =         decToBcd(15);
 
 Serial.println("valeurs initiales");
 StatusDs1337(); // lecture et affichage valeurs initilales contrôles et status
 Serial.println();

 byte tb_date[]={second,minute,hour,dayOfWeek,dayOfMonth,month,year};
 setDataDs1337(0x00,sizeof(tb_date),tb_date);  // Maj date en 0x00
 getDataHexDs1337("lecture date",0x00,7);
 
 byte tb_alarme1[]={(byte)(second| A1M1),(byte)(minute|A1M2),(byte)(hour| A1M3|AMPM1224),(byte)(dayOfMonth| A1M4 | DYDT1)};
 setDataDs1337(0x07,sizeof(tb_alarme1),tb_alarme1);  // maj alarme1 en 0x07
 getDataHexDs1337("Alarme1",0x07,4);

 byte tb_alarme2[]={(byte)(minute |A1M2),(byte)(hour| A1M3|AMPM1224),byte(dayOfMonth | A1M4 | DYDT1)};
 setDataDs1337(0x0B,sizeof(tb_alarme2),tb_alarme2);  // maj alarme2 en 0xOB
 getDataHexDs1337("Alarme2",0x0B,3);
 
 byte controle[]={(byte)0x00};
 //setDataDs1337(0x0E,1,controle);  // maj byte contrôles en 0x0e

 
}
void loop()
{
  delay(2000);
  StatusDs1337 ();   // lecture controles et status
  getDateDs1337();   //lecture date 
}

Et voici la trace

Code : Tout sélectionner

valeurs initiales
Controles=18, Status=83, Date=
lecture date adr=0-> (0):0 (23):23 (22):22 (7):7 (1):1 (5):5 (15):15 
Alarme1 adr=7-> (80):0 (A3):23 (A2):22 (81):1 
Alarme2 adr=B-> (A3):23 (A2):22 (81):1 
Controles=18, Status=83, Date=22:23:0  5/1/15  
Controles=18, Status=83, Date=22:23:0  5/1/15  
Controles=18, Status=83, Date=22:23:0  5/1/15  
Controles=18, Status=83, Date=22:23:0  5/1/15  
Controles=18, Status=83, Date=22:23:0  5/1/15  
Controles=18, Status=83, Date=22:23:1  5/1/15  
Controles=18, Status=83, Date=22:23:1  5/1/15  
Controles=18, Status=83, Date=22:23:1  5/1/15  
Controles=18, Status=83, Date=22:23:1  5/1/15  
Controles=18, Status=83, Date=22:23:2  5/1/15    

Le programme en Lua

Code : Tout sélectionner

id=0
sda=4
scl=5

function test_i2c()
  for i=0,127 do
    i2c.start(id)
    resCode = i2c.address(id, i, i2c.TRANSMITTER)
    i2c.stop(id)
    if resCode == true then print("adresse trouvée  " .. string.format("%02x", i) .. " (" .. i ..")") end
  end
end

function read_reg(dev_addr, reg_addr) 
   i2c.start(id) 
   i2c.address(id, 0x68 ,i2c.TRANSMITTER) 
   i2c.write(id,reg_addr) 
   i2c.stop(id) 
   i2c.start(id) 
   i2c.address(id, 0x68,i2c.RECEIVER) 
   c=i2c.read(id,1) 
   i2c.stop(id) 
   return c 
end 
function ecr_registres(dev_addr, reg_addr,liste) 
   i2c.start(id) 
   i2c.address(id, dev_addr ,i2c.TRANSMITTER) 
   i2c.write(id,reg_addr) 
   c=i2c.write(id,liste) 
   i2c.stop(id) 
end 

function lect_registres (dev_adr,adr,lg)
   txt=""
   for i =adr,adr+lg-1 do
       txt=txt .. string.format("%02x",string.byte(read_reg(dev_adr,i),1)) .. " "
    end
    print(txt)
end
-- main 
realtype = wifi.sleeptype(wifi.MODEM_SLEEP)      -- arret wifi
node.dsleep(nil, 4) 

i2c.setup(id,sda,scl,i2c.SLOW) -- initialisation i2c
test_i2c() --recherche adresse i2c")
print("valeurs initiales")
print("<-------date----------><--alarm1-><alarm2>C0 ST")
lect_registres(0x68,0x00,16)
ecr_registres(0x68,0x00,{0,1,2,3,4,5,6})              -- ecriture registres date en       0x00
ecr_registres(0x68,0x07,{0x00,0x00,0x00,0x00})  -- raz registres alarme1   en      0x07
ecr_registres(0x68,0x0B,{0x80,0x81,0x83})          -- ecriture registres alarme2 en 0x0B
-- ecr_registres(0x68,0x0E,{0})                            -- ecriture controle en              0x0E
-- ecr_registres(0x68,0x0E,{0x08})                       -- ecriture controle en              0x0E  led clignote

lect_registres(0x68,0x00,16)
print("")
tmr.alarm(0,10000, 1,  function() lect_registres(0x68,0x00,16)  end  ) --lectures registres


Et la trace en Lua

Code : Tout sélectionner

dofile("lectI2C.lua")
adresse trouvée  68 (104)
valeurs initiales
<-------date----------><--alarm1-><alarm2>C0 ST
00 00 00 01 01 01 00 00 00 00 00 00 00 00 18 81
 
00 01 02 03 04 05 06 00 00 00 00 80 81 83 18 83 
00 01 02 03 04 05 06 00 00 00 00 80 81 83 18 83 
00 01 02 03 04 05 06 00 00 00 00 80 81 83 18 83 
00 01 02 03 04 05 06 00 00 00 00 80 81 83 18 83 
00 01 02 03 04 05 06 00 00 00 00 80 81 83 18 83 
00 01 02 03 04 05 06 00 00 00 00 80 81 83 18 83 
00 01 02 03 04 05 06 00 00 00 00 80 81 83 18 83 
00 01 02 03 04 05 06 00 00 00 00 80 81 83 18 83 
00 01 02 03 04 05 06 00 00 00 00 80 81 83 18 83 
00 01 02 03 04 05 06 00 00 00 00 80 81 83 18 83 
00 01 02 03 04 05 06 00 00 00 00 80 81 83 18 83 
01 01 02 03 04 05 06 00 00 00 00 80 81 83 18 83 
01 01 02 03 04 05 06 00 00 00 00 80 81 83 18 83 
01 01 02 03 04 05 06 00 00 00 00 80 81 83 18 83 
01 01 02 03 04 05 06 00 00 00 00 80 81 83 18 83 
01 01 02 03 04 05 06 00 00 00 00 80 81 83 18 83
Pour les transistors, j'ai commandé des 2N7000 , je ne me rappelle plus pourquoi j'ai commandé ce modèle ?.

A+
SMBA38.
Modifié en dernier par smba38 le mer. 6 mai 2015 08:22, modifié 1 fois.

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. 3 mai 2015 12:11

Hello SMBA38

Au moment où j'ai vu que tu avais posté un message, j'étais justement en train de lire le Bit 7: Oscillator Stop Flag (OSF) du Status Register (0Fh) dans la Datasheet.

D'après la trace de ton programme Arduino, ton Status Register reste inexorablement à la valeur 0x83 en hex, ce qui donne 10000011 en binaire. Donc, le bit 7 est toujours à 1 et l'oscillateur est arrêté.
Je n'ai pas l'impression que la situation va fondamentalement changer en passant d'un quartz de 31400 à 32768KHz. Ce qu'il faut, c'est faire passer le bit OSF à zéro.
52.jpg
52.jpg (3.87 Kio) Vu 8006 fois
Parmi les causes d'une mise à 1, on relève entre autres, la mise sous tension du DS1337 et le bit 7 (EOSC) du Control Register mis à 1.
Evidemment, en utilisant la bibliothèque Wire de l'Arduino, on ne peut que très difficilement suivre tout ce qui se fait "sous la table".

C'est pour cette raison que j'essaye de me battre avec l'Atmega nu et une bibliothèque I2C ouverte (celle de Peter Fleury téléchargeable ici) où on peut suivre à la trace ce que chaque fonction fait.
Jusqu'hier, j'essayais d'adapter une autre librairie écrite pour la DS1307 avec affichage sur un petit LCD de manière à la faire marcher avec la DS1337 et affichage sur un terminal mais je n'arrivais à rien. Du coup, ce matin, j'ai décidé de repartir à zéro avec la librairie I2C Master de Peter Fleury.

Cela nécessite de programmer l'Atmega avec un programmateur ISP. J'utilise ma mini-platine de développement pour µC 28 pins avec un quartz de 8MHz et le convertisseur USB-Série pour le moniteur. L'IDE de développement est l'Atmel Studio 6.2 avec AVR-GCC.

Le transistor 2N7000 est un FET N-Channel. Cela signifie que la gate doit avoir une tension supérieure à la source pour qu'il soit passant. Donc, tu ne peux pas l'utiliser comme switch sur le trajet du +3,3V car tu devrais amener la gate à 5.5V pour rendre le transistor passant.
La sortie alarme du DS1337 est "open collector". Il faut maintenir la pin high avec une résistance de pull-up à 3.3V. Lors de l'alarme, la pin est forcée à zéro. Ton transistor de switch doit donc être du type P-Channel et la gate doit être raccordée à la pin alarme. De cette manière, en cas d'alarme, la gate passe à zéro volt et le transistor devient passant.

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 » lun. 4 mai 2015 20:58

Hello,

Voici les traces d'un programme python s'exécutant sur un Raspberry Pi.
Ce programme commande un DS1337 avec des LEDs sur les sorties INTA et INTB ( Résistance de Pull au + LEDs allumées au niveau bas).

Etat initial des registres du DS1337
le bit OSF est à 1 car dans mon cas j'ai un problème sur l'oscillateur.

Code : Tout sélectionner

<--------Date------><--Alarme1--><Alarm2> C  S
00 00 00 01 01 01 00 00 00 00 00 00 00 00 18 80
L'alarme 2 / SQW n'est pas utilisée
L’alarme 1 est configurée avec AM1=0, AM2=1,AM3=1 et AM4=1
Le registre des contrôles est forcé à 0x05 pour actionner l'alarme 1.
A1M1 à A1M4 sont configurés pour provoquer une alarme quand il y a une égalité sur les secondes.
Dans l’exemple quand les secondes passent à 0.
et dans ce cas, Le bit A1F des status passe à 1 et INTA à l’état bas.
On doit forcer A1F à 0 pour faire passer INTA à l’état haut.
Comme dans mon montage l’oscillateur pose un problème ( Bit OSF =1) les secondes s’incrémentent très lentement.
Je force les secondes à 59 pour avoir rapidement un nouveau un changement d’état.

Code : Tout sélectionner

                      A  A  A  A  A  A  A
                      1  1  1  1  2  2  2
                      M  M  M  M  M  M  M
                      1  2  3  4  2  3  4
<S-M--H--D--JS-M--Y><-Alarme1--> <Alarme2> C  S
59 01 02 03 04 05 06 00 81 82 83 00 00 00 05 80
59 01 02 03 04 05 06 00 81 82 83 00 00 00 05 80
00 02 02 03 04 05 06 00 81 82 83 00 00 00 05 81
alarme1  raz dans  10 secondes
59 02 02 03 04 05 06 00 81 82 83 00 00 00 05 80
59 02 02 03 04 05 06 00 81 82 83 00 00 00 05 80

Voici le programme en python que j’utilise sur un le Raspberry

Code : Tout sélectionner

from datetime import datetime, timedelta, time
import smbus
from time import sleep

bus = smbus.SMBus(1)

bus.write_i2c_block_data(0x68, 0x00, [0x59, 0x01 ,0x02, 0x03, 0x04, 0x05,0x06])
bus.write_i2c_block_data(0x68, 0x07, [0x00, 0x81 ,0x82, 0x83])
#bus.write_i2c_block_data(0x68, 0x0B, [0x80, 0x81 ,0x82])
sleep(2)
print ("avant ecr controle")
bus.write_i2c_block_data(0x68, 0x0E, [0x05])
sleep(5)
print ("apres ecr controles et avant ecr status ")
bus.write_i2c_block_data(0x68, 0x0F, [0x00])
sleep(5)
print ("apres ecr status")
sleep(2)
i=0
while 1==1:
        Register = bus.read_i2c_block_data(0x68, 0,16)
        txt=""
        for i in range(0,16):
                txt=txt +("%02x " % (Register[i]))
        print (txt)
        sleep(4)
        status=Register[0x0F]
        #if status & 0x80 >0:
                #print(" OSF mis a 0")
                #bus.write_i2c_block_data(0x68, 0x0F, [status & 0x7F])
        if status & 0x01 >0:
                print ("alarme1  raz dans  10 secondes")
                sleep (10)
                bus.write_i2c_block_data(0x68, 0x00, [0x59])
                bus.write_i2c_block_data(0x68, 0x0F, [status & 0xFE])
J’ai essayé de forcer le bit OSF à zéro mais ce bit est repositionné à 1.
J'ai commandé des quartz à 32.768KHZ et 3 nouveaux DS1337 (Car j'ai peut être maltraité mon unique exemplaire)

La question qui tue :

Comment à la mise sous tension avoir un niveau bas sur INT1 (Ou sur INT2) pour alimenter le montage?

A l'initialisation du DS1337 INTCN semble être positionné à 0 , RS1 et RS2 = 1 ce qui doit en principe émettre un signal carré de 32768KHZ sur la sortie INTB.

Il faudrait peut-être utiliser INTB avec une électronique qui alimente le circuit à partir d'un signal carré ou d'un signal BAS.

Voici la trace avec INTB (INTA n'est pas utilisé).
A2M4, A2M3 et A2M2 sont configurés pour provoquer une alarme au passage des secondes à 0.

Code : Tout sélectionner

pi@raspberrypi ~/rtc $ python  ds1307-lect-ecr-intB.py
Etat Initial
01 00 00 01 01 01 00 00 00 00 00 00 00 00 18 81
avant ecr controle
apres ecr controles et avant ecr status
apres ecr status
59 01 02 03 04 05 06 00 00 00 00 80 81 82 06 80
59 01 02 03 04 05 06 00 00 00 00 80 81 82 06 80
00 02 02 03 04 05 06 00 00 00 00 80 81 82 06 82
alarme2  raz dans  10 secondes
58 02 02 03 04 05 06 00 00 00 00 80 81 82 06 80
58 02 02 03 04 05 06 00 00 00 00 80 81 82 06 80
59 02 02 03 04 05 06 00 00 00 00 80 81 82 06 80
59 02 02 03 04 05 06 00 00 00 00 80 81 82 06 80
59 02 02 03 04 05 06 00 00 00 00 80 81 82 06 80
00 03 02 03 04 05 06 00 00 00 00 80 81 82 06 82
alarme2  raz dans  10 secondes
58 03 02 03 04 05 06 00 00 00 00 80 81 82 06 80
58 03 02 03 04 05 06 00 00 00 00 80 81 82 06 80
Et le programme python associé

Code : Tout sélectionner

from datetime import datetime, timedelta, time
import smbus
from time import sleep

bus = smbus.SMBus(1)
print ("Etat Initial")
Register = bus.read_i2c_block_data(0x68, 0,16)
txt=""
for i in range(0,16):
        txt=txt +("%02x " % (Register[i]))
print (txt)

bus.write_i2c_block_data(0x68, 0x00, [0x59, 0x01 ,0x02, 0x03, 0x04, 0x05,0x06])
#bus.write_i2c_block_data(0x68, 0x07, [0x00, 0x81 ,0x82, 0x83])
bus.write_i2c_block_data(0x68, 0x0B, [0x80, 0x81 ,0x82])
sleep(2)
print ("avant ecr controle")
bus.write_i2c_block_data(0x68, 0x0E, [0x06])
sleep(5)
print ("apres ecr controles et avant ecr status ")
bus.write_i2c_block_data(0x68, 0x0F, [0x00])
sleep(5)
print ("apres ecr status")
sleep(2)
i=0
while 1==1:
        Register = bus.read_i2c_block_data(0x68, 0,16)
        txt=""
        for i in range(0,16):
                txt=txt +("%02x " % (Register[i]))
        print (txt)
        sleep(4)
        status=Register[0x0F]
        #if status & 0x80 >0:
                #print(" OSF mis a 0")
                #bus.write_i2c_block_data(0x68, 0x0F, [status & 0x7F])
        if status & 0x02 >0:
                print ("alarme2  raz dans  10 secondes")
                sleep (10)
                bus.write_i2c_block_data(0x68, 0x00, [0x58])
                bus.write_i2c_block_data(0x68, 0x0F, [status & 0xFD])
A l'initialisation, la LED connectée sur INTB est allumée ( le signal doit être carré).
Après forçage du registre de contrôles 0x0E à 0x06 ( INTCN + A2IE) INTB passe au niveau haut.
INTB repasse au niveau bas (LED Allumée car résistance de Pull sur le + 3.3v) au déclanchement de l'alarme 2.

C'est aux électroniciens de jouer pour trouver le circuit qui va bien car pour tout ce qui est électronique, ce n'est pas ma tasse de thé.

Jean-Marie voici un lien d'un exemple en C de programmation de DS1337
https://www.ccsinfo.com/forum/viewtopic.php?p=69975

A+
SMBA38
Modifié en dernier par smba38 le mer. 6 mai 2015 08:25, modifié 1 fois.

Répondre

Retourner vers « Et tout le reste »