Go Down

Topic: Arduino Leonardo ETH - Ethernet server/client et sonde 1Wire (Read 356 times) previous topic - next topic

Steven_H

Bonjour à tous,


Tout nouveau ici j'utilise déjà mon Arduino depuis bien 2 ans pour commander mes bandeaux de led via TCP/IP en commande UPD. Couplé avec un petit programme JAVA que j'ai dev sur mon pc.

Démo visible sur mon twitter : https://twitter.com/StevenHenriot/status/699358840953905152


J'ai maintenant d'autres besoins d'évolution et du coup je souhaite changer de techno à savoir passer de l'UDP au requête HTTP (je dispose d'un serveur domotique maison) afin de pouvoir faire des logs de température.


Voici comment je vois les chose (attention, j'ai pas dit réalisable ^^)

Mon arduino connecté à mon réseaux ethernet doit :
  • pouvoir recevoir des requetes HTTP (GET et/ou POST) afin de commander les bandeaux led
  • être interrogé pour la température du 1Wire OU envoyé de lui même la données
  • envoyé la données du capteur de mouvement PIR si détection il y a via HTTP (GET et/ou POST)
  • enfin, recevoir les données via USB pour l'ambilight



Mon problème aujourd'hui est que mon programme actuelle est bloquant quelque part et je ne sais pas où... Je suppose un problème du client HTTP.

Pour le moment il y a les données température qui fonctionne et le capteur PIR. Je reçois aussi bien les requêtes HTTP. Mais les deux combinés ne fonctionnent pas.



Je suis ouvert à toutes propositions, modifications, améliorations.

Voici mon code actuelle.


Code: [Select]

#include <SPI.h>
#include <Ethernet2.h>
#include <String.h>
#include <Adafruit_NeoPixel.h>
#include <OneWire.h>
#define NB_LED 38 // écran
#define NB_DATA 116 // nb led * 3 + 2 = 116
#define DS18B20 0x28     // Adresse 1-Wire du DS18B20

byte mac[] = {0x90, 0xA2, 0xDA, 0x10, 0x3B, 0x07};
IPAddress ip(192, 168, 1, 112);
byte server_ip[] = { 192, 168, 1, 100 };

Adafruit_NeoPixel strip[] = {
  Adafruit_NeoPixel(NB_LED, 3, NEO_GRB + NEO_KHZ800), // ecran
  Adafruit_NeoPixel(35, 5, NEO_GRB + NEO_KHZ800), // sous bureau
};

// server HTTP
EthernetServer server = EthernetServer(80);
// client HTTP
EthernetClient client;
// commande HTTP
String url;

// update 1Wire
const String wire_id = "";
const unsigned long time_update = 5000; // 600000
unsigned long last_update = 0;

// Déclaration de l'objet ds
OneWire ds(10); // pin 10
float temperature;

// sensor PIR
const String pir_id = "";
int pir_state = LOW;
int pir_val = 0;

void setup() {
  // port USB
  Serial.begin(9600);

  while (!Serial) {
    ;
  }

  // démarre la carte ethernet DHCP
  if (Ethernet.begin(mac) == 0) {
    Serial.println("DHCP Fail");
  }
  Ethernet.begin(mac, ip);
  delay(1000);
  Serial.println(Ethernet.localIP());

  // démarre le serveur
  server.begin();

  // input PIR
  pinMode(2, INPUT);

  // init stripled
  /*for (int i = 0; i < 2; i++) {
    strip[i].begin();
    strip[i].show();
  }*/
}

void loop() {

  EthernetClient client = server.available();
  // client HTTP connecté ?
  if (client) {
    Serial.println("Client");
    url = "";
    while (client.connected()) {
      if (client.available()) {
        // traitement des infos du client
        char c = client.read();

        // recéption en cours
        if (c != '\n') {
          url += c;
        }

        // fin de la recéption
        if (c == '\n') {
          url.replace("GET /", "");
          url.replace(" HTTP/1.1", "");

          // traitement de la commande url
          if (url != "") {
            Serial.println(url);
            String act = url.substring(url.indexOf("a=") + 2, url.indexOf("&d="));
            String dev = url.substring(url.indexOf("d=") + 2, url.indexOf("&s="));
            int s = url.substring(url.indexOf("s=") + 2, url.indexOf("&m=")).toInt();
            String msg = url.substring(url.indexOf("m=") + 2);

            // get
            if (act.indexOf("get") != -1) {
              Serial.println("Good url");
            }
            // set
            else if (act.indexOf("set") != -1) {
              if (dev.indexOf("led") != -1) {
                set(s, msg);
              }
              //set(s, msg);
            }

            url = "";
          }

          // réponse au client
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();

          // fermeture connection
          delay(1);
          client.stop();
        }
      }
    }
  }

  // pas de requette HTTP
  else {
    getData();
  }
}

// pour le bandeau de led
void set(int num, String rgb) {
  int r = rgb.substring(0, 3).toInt();
  int g = rgb.substring(4, 6).toInt();
  int b = rgb.substring(7, 9).toInt();
  int leds = strip[num].numPixels();
 
  for(int i = 0; i < leds; i++) {
    strip[num].setPixelColor(i, r, g, b);
  }
  strip[num].show();
}

// update des données
void getData() {
  // envoie données toutes les x min
  if (millis() - last_update >= time_update) {
    getTemperature();
    getPir();

    last_update = millis();
    // conversion
    char temp[10];
    String uri;
    dtostrf(temperature, 1, 2, temp);
    uri = String(temp);
    Serial.println(temperature);

    // lecture des données et envoie
    // forme : postdata/(value|state|mouvement)/id_device/value
    //sendPost("postdata/value/");
    //sendPost(uri);
  }
}

// wait...
void sendPost(String uri) {
  EthernetClient http;
  //Serial.println(http.connect("192.168.1.100", 80));
  if (http.connect("192.168.1.100", 80)) {
    Serial.println("connected");
    http.println("POST " + uri + " HTTP/1.1");
    http.println("Host: 192.168.1.183");
    http.println("Content-Type: application/x-www-form-urlencoded; charset=UTF-8");
    http.println("Connection: close");
    http.println("Content-Length: 0");
    http.println();
  } else {
    Serial.println("error");
  }

  if (http.connected()) {
    http.stop();
  }
}

// update PIR statut
void getPir() {
  pir_val = digitalRead(2);
  Serial.println(pir_val);
  // Mouvement detecté
  if (pir_val == HIGH && pir_state == LOW) {
    Serial.println("Motion detected!");
    pir_state = HIGH;
  } else if (pir_val == LOW && pir_state == HIGH) {
    Serial.println("Motion ended!");
    pir_state = LOW;
  }
}

// update Temp statut
void getTemperature() {
  byte data[9], addr[8];
  // data : Données lues depuis le scratchpad
  // addr : adresse du module 1-Wire détecté

  if (!ds.search(addr)) { // Recherche un module 1-Wire
    ds.reset_search();    // Réinitialise la recherche de module
    return;         // Retourne une erreur
  }

  if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l'adresse a été correctement reçue
    return;                        // Si le message est corrompu on retourne une erreur

  if (addr[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20
    return;         // Si ce n'est pas le cas on retourne une erreur

  ds.reset();             // On reset le bus 1-Wire
  ds.select(addr);        // On sélectionne le DS18B20

  ds.write(0x44);      // On lance une prise de mesure de température
  delay(1000);             // Et on attend la fin de la mesure

  ds.reset();             // On reset le bus 1-Wire
  ds.select(addr);        // On sélectionne le DS18B20
  ds.write(0xBE);         // On envoie une demande de lecture du scratchpad

  for (byte i = 0; i < 9; i++) // On lit le scratchpad
    data[i] = ds.read();       // Et on stock les octets reçus

  // Calcul de la température en degré Celsius
  temperature = ((data[1] << 8) | data[0]) * 0.0625;

  // Pas d'erreur
  return;
}
Steven H | #Geek | Développeur Web | Coffee Addict | #Domotique | #CM | lvl 26 | #TeamBarbecue | @MonDroguiste

Go Up