Hack Chirp! mais non c'est pas du vrai hack. :)

Bonjour,
J'ai acheté le fameux "Chirp!" pour éviter d'oublier d'arroser mes plantes : Site officiel.

Au début c'était bien, mes plantes étaient ravis de cet achat puis je me suis rendu compte d'un gros défaut : "Les piles". Les piles se vident en 6 mois, et pas d'information sur l'état des piles, donc je croyais que ça fonctionnait mais non et ça c'est encore pire pour les plantes.

Je me suis dit que j'allais mettre ça sur un arduino, suivi d'un Esp_01 en série avec easy esp et le tout dans Domoticz via le protocol "Mysensors Serial", pour ceux que ça intéressent : Cliquez ici.

D'après le site de l'auteur de "Chirp!" c'est totalement utilisable comme périphérique I2C sur un arduino via des scripts qu'il fournis. Déjà, la grosse galère, l'auteur finit avec une tempo qui devrait être en cours de code, ce qui fait qu'on se retrouve avec des valeurs qui changent sans cesse de façon aléatoire. Il inverse l'humidité et la luminosité, bref pas cool ses fameux tutos.

Pour la luminosité et l'humidité, c'est ok, j'ai trouvé.
Normalement on devrait pouvoir avoir la température aussi, mais là je bloque, si quelqu'un voit d'où ça vient, je ne suis pas contre un peu d'aide.

Voici déjà ce qui fonctionne :

#include <Wire.h>
int show = 0; //0: ne pas tester i2c   1: tester si il y a un périphérique i2c
int Heure = 10;//Réglage heure pour tester...
int Minutes = 52;//Réglage minutes pour tester...

void writeI2CRegister8bit(int addr, int value) {
  Wire.beginTransmission(addr);
  Wire.write(value);
  Wire.endTransmission();
}

unsigned int readI2CRegister16bit(int addr, int reg) {
  Wire.beginTransmission(addr);
  Wire.write(reg);
  Wire.endTransmission();
  delay(20);
  Wire.requestFrom(addr, 2);
  unsigned int t = Wire.read() << 8;
  t = t | Wire.read();
  return t;
}

void setup() {
  Wire.begin();
  Serial.begin(9600);
  writeI2CRegister8bit(0x20, 6); //reset
}

void loop() 
{
  if (show == 1)
  {
    byte error, address;
    int nDevices;
    Serial.println("Recherche en cours...");
    nDevices = 0;
    for(address = 1; address < 127; address++ ) 
    {
      Wire.beginTransmission(address);
      error = Wire.endTransmission();

      if (error == 0)
      {
        Serial.print("Equiment I2C trouve a l'addresse 0x");
        if (address<16) 
          Serial.print("0");
          Serial.print(address,HEX);
          Serial.println("  !");
          nDevices++;
      }
      else if (error==4)
      {
        Serial.print("Erreur inconnue a l'address 0x");
        if (address<16) 
          Serial.print("0");
          Serial.println(address,HEX);
      }    
    }
    if (nDevices == 0) Serial.println("Aucun Equipement I2C trouve\n");
    else Serial.println("Pause de 1minute...");
  }
  
  Serial.print("Heure : ");
  Serial.print(Heure);
  Serial.print("H");
  Serial.print(Minutes);
  Serial.print("mn, Humidité : ");
  writeI2CRegister8bit(0x20, 3); //request light measurement (si ça sert bien à ça???)
  delay(9000);
  Serial.print(readI2CRegister16bit(0x20, 4)); //read capacitance register
  Serial.print(", Luminosité : ");
  delay(500);//La fameuse tempo qui change tout.
  Serial.print(readI2CRegister16bit(0x20, 0)); //read light register
//C'est ici que ça devrait fonctionner pour la température
//  Serial.print(readI2CRegister16bit(0x20, 5)); //temperature register
  Minutes = Minutes + 1;
  if (Minutes > 59)
  {
    Minutes = Minutes - 60;
    Heure = Heure + 1;
  }
  if (Heure>24) Heure = Heure - 24;
  Serial.print(", Prochaine lecture à : ");
  Serial.print(Heure);
  Serial.print("H");
  Serial.print(Minutes);
  Serial.println("mn ...");
  delay(50000);

}

Voici le résultat :

Heure : 10H54mn, Humidité : 439, Luminosité : 108, Prochaine lecture à : 10H55mn ...
Heure : 10H55mn, Humidité : 437, Luminosité : 3784, Prochaine lecture à : 10H56mn ... Volet fermé
Heure : 10H56mn, Humidité : 435, Luminosité : 5706, Prochaine lecture à : 10H57mn ...Et TV fermé
Heure : 10H57mn, Humidité : 434, Luminosité : 111, Prochaine lecture à : 10H58mn ...
Heure : 10H58mn, Humidité : 432, Luminosité : 107, Prochaine lecture à : 10H59mn ...
Heure : 10H59mn, Humidité : 431, Luminosité : 110, Prochaine lecture à : 11H0mn ...
Heure : 11H0mn, Humidité : 430, Luminosité : 107, Prochaine lecture à : 11H1mn ...
Heure : 11H1mn, Humidité : 429, Luminosité : 106, Prochaine lecture à : 11H2mn ...
Heure : 11H2mn, Humidité : 428, Luminosité : 106, Prochaine lecture à : 11H3mn ...

PS : J'ai essayé ce code sur un arduino 2560 officiel, ça ne fonctionne pas et sur un clone en uno, ça fonctionne sauf la température.

Merci d'avance pour ceux qui pourrons m'aider et à bientôt. :wink:

Et le but est de faire tourner une MEGA sur piles ?
C'est une plaisanterie ?

Euh pas du tout, c'est justement pour ne plus utiliser de piles et donc d'enlever ce défaut de conception.

Le but est de faire tourner ça sur un port usb, j'ai un PC, une TV et une barre de son équipée de port USB juste à coté donc ça devrait fonctionner sans rien ajouter à part un câble, un arduino et un Esp_01.

Mais surtout le but est d'envoyer ça dans Domoticz par WIFI et que domoticz m'envoi un SMS directement quand il y a besoin d'aroser, j'ai déjà testé le Rflink en 433mhz, de temps en temps ça passe et souvent ça passe pas chez moi, les placo sur rail ça fait un peu cage de faraday.
J'ai aussi testé le rflink WIFI, mais à quoi bon mettre une passerelle 433mhz vers wifi, autant le faire directement en wifi et j'ai déjà pas mal de trucs sur easy esp. L'avantage du WIFI c'est que j'ai mis des répéteurs partout et je suis sur de cette fréquence jusqu'au bout du (petit) jardin.

Et puis c'est le confinement, je fais aussi avec ce que j'ai d'avance à la maison. :wink:

A bientôt. :grin: :grin: :grin:

Une MEGA + 1 ESP01 = canon pour tuer une mouche.

Autant utiliser l'ESP01 tout seul, si seul l'I2C est utilisé.
Sinon, s'il y a des besoins en entrée / sortie + importants : NodeMCU ou ESP32.

Ouep, mais jamais bossé sur i2c direct de l'esp01.
Et puis je perd l'alim équipé du régulateur sans l'arduino.
Donc Je vais tuer cette mouche comme ça quand même. ;D ;D ;D

Du moment que ça fonctionne, ça me va.

Mais ça ne m'aide pas à avancer quand même. 8)

A bientôt. ;D ;D ;D

Personnellement j'envoie des mesures de températures / humidité à DOMOTICZ avec des requêtes JSON à partir d'un ESP8266, très facilement.
Cet ESP8266 gère un capteur de température I2C et un écran TFT SPI.

Mais si tu tiens absolument à une solution commande AT, lis toujours ceci :
https://forum.arduino.cc/index.php?topic=501923.0

Euh, c'est pas pour t'embêter, mais c'est pas ce que je demande comme aide. :slight_smile:

micmacx:
Pour la luminosité et l'humidité, c'est ok, j'ai trouvé.
Normalement on devrait pouvoir avoir la température aussi, mais là je bloque, si quelqu'un voit d'où ça vient, je ne suis pas contre un peu d'aide.

Donc ce que je demande c'est :
Est-il possible d'avoir cette fameuse température sur ce pseudo-capteur "Chirp!"?
Est-ce que quelqu'un a déjà essayé?
Est-ce que quelqu'un comprend plus de choses que moi sur les fichiers source de ce fameux "Chirp!"?

Pour le reste, je me débrouille, même si ce n'est pas forcément hyper optimisé niveau composant, niveau façon de faire...Même si c'est de ma M...e niveau codage, c'est pas grave, temps que ça fonctionne. :slight_smile:

Mais merci quand même de l'intérêt que tu portes à mon post et aussi de la rapidité à laquelle tu réponds, c'est déjà très sympathique. :slight_smile:

A bientôt. :slight_smile: :slight_smile: :slight_smile: