Domo'Duino, la domotique par Arduino (NEWS: Modules 2.4ghz )

Cette exemple ne fonctionne pas avec mon shield made in china. J'ai donc récupérer juste le void loop/setup et cela ne fonctionne pas non plus lorsque je met des images pour avoir les états "ON" et "OFF" ...

salut tout le monde. Je peux dire ça maintenant que j'ai reçu mon module ethernet OFFICIEL moi ! ;) Moi au j'ai essayé le programme de Chesnel ====> marche pas ! :( Pourquoi dans le programme tu fais :

include et #include ?

Normalement si tu fais #include ça doit suffir non ? dans librarie Ethernet il y a :

ifndef ethernet_h

define ethernet_h

include

//#include "w5100.h"

include "Client.h"

include "Server.h"

je dis une con..rie ou pas ?

A+ chabot380

Salut !

Pour contourner ce genre de petits désagréments (gestion des images par le code arduino et autres), j'ai fait ce que je savais faire.

Un site web hébergé en ligne (on peut l'imaginer en local, mais dans ce cas un ordinateur doit rester allumé dans la maison). Ce site est composé de plusieurs pages pour la gestion domotique.

On peut imaginer ce que l'on veut. Le but étant que la page web, via un bouton, un lien, une image, ou un formulaire envoie un paramètre (par exemple allume lampe) à l'arduino via l'ethernet shield. L'arduino exécute le code correspondant et en fin de traitement renvoie à la page web de départ avec un paramètre aussi (par exemple lampe allumée). Ainsi j'affiche ma page avec l'image "lampe allumée". Je peux aussi stocker les infos transmises dans une base de données pour statistiques ou autres traitements.

Ainsi c'est le site qui gère les images et non le code arduino.

Courage

Ouai c'est ce que je pensait faire si je ne trouvais pas de solution mais c'est bizarre quand même car j'arrive a afficher la première image en début de page mais pas dans mes variables :/

EDIT: j'ai réussit $) $)

En fait mon soucis venait de cette partie de mon code

 plen=es.ES_fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"));
        plen=es.ES_fill_tcp_data_p(buf,plen,PSTR(" "));
        plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("Domo'duino, la domotique par Arduino"));
        plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("
"));

La partie texte suivit de l'image foutais la merde, je sait pas pourquoi mais c'est comme ça ^^ du coup j'ai bidouiller en passant mon texte directement dans l'image et maintenant ça fonctionne

IL me reste maintenant a voir comment créer plusieurs bouton l'un en dessous de l'autres, j'essaye de broder dans le code mais a chaque fois ça ne fonctionne pas ! c'est pas facile car pour faire fonctionner les boutons il y a des morceaux de codes un peu partout =(

Et j'aimerais aussi passer mes images "lampes allumés" et "lampes éteintes" directement en bouton pour retirer le bouton en dessous "switch on/switch off", il faut que je trouve un truc en HTML ^^

Si cela intéresse quelqu'un voila mon code pour l'interface "mono bouton" ^^

#include "etherShield.h"


// please modify the following two lines. mac and ip have to be unique
// in your local area network. You can not have the same numbers in
// two devices:
static uint8_t mymac[6] = {0x54,0x55,0x58,0x10,0x00,0x24}; 
static uint8_t myip[4] = {xxx,xxx,x,xx};
static char baseurl[]="http://xxxxxxx.dyndns-home.com/";
static uint16_t mywwwport =80; // listen port for tcp/www (max range 1-254)



#define BUFFER_SIZE 500
static uint8_t buf[BUFFER_SIZE+1];
#define STR_BUFFER_SIZE 22
static char strbuf[STR_BUFFER_SIZE+1];

EtherShield es=EtherShield();

// prepare the webpage by writing the data to the tcp send buffer
uint16_t print_webpage(uint8_t *buf, byte on_off);
int8_t analyse_cmd(char *str);

// LED cathode connects the Pin4, anode to 5V through 1K resistor
#define LED_PIN  4
#define LED_PIN2  5


void setup(){
  
   /*initialize enc28j60*/
     es.ES_enc28j60Init(mymac);
   es.ES_enc28j60clkout(2); // change clkout from 6.25MHz to 12.5MHz
   delay(10);
        
    /* Magjack leds configuration, see enc28j60 datasheet, page 11 */
    // LEDA=greed LEDB=yellow
    //
    // 0x880 is PHLCON LEDB=on, LEDA=on
    // enc28j60PhyWrite(PHLCON,0b0000 1000 1000 00 00);
    es.ES_enc28j60PhyWrite(PHLCON,0x880);
    delay(500);
    //
    // 0x990 is PHLCON LEDB=off, LEDA=off
    // enc28j60PhyWrite(PHLCON,0b0000 1001 1001 00 00);
    es.ES_enc28j60PhyWrite(PHLCON,0x990);
    delay(500);
    //
    // 0x880 is PHLCON LEDB=on, LEDA=on
    // enc28j60PhyWrite(PHLCON,0b0000 1000 1000 00 00);
    es.ES_enc28j60PhyWrite(PHLCON,0x880);
    delay(500);
    //
    // 0x990 is PHLCON LEDB=off, LEDA=off
    // enc28j60PhyWrite(PHLCON,0b0000 1001 1001 00 00);
    es.ES_enc28j60PhyWrite(PHLCON,0x990);
    delay(500);
    //
  // 0x476 is PHLCON LEDA=links status, LEDB=receive/transmit
  // enc28j60PhyWrite(PHLCON,0b0000 0100 0111 01 10);
  es.ES_enc28j60PhyWrite(PHLCON,0x476);
    delay(100);
        
  //init the ethernet/ip layer:
  es.ES_init_ip_arp_udp_tcp(mymac,myip,80);
  
    pinMode(LED_PIN, OUTPUT); 
    digitalWrite(LED_PIN, LOW);  // switch on LED
         pinMode(LED_PIN2, OUTPUT); 
    digitalWrite(LED_PIN2, LOW); 
}

void loop(){
  uint16_t plen, dat_p;
  int8_t cmd;
  byte on_off = 1;

  plen = es.ES_enc28j60PacketReceive(BUFFER_SIZE, buf);

    /*plen will ne unequal to zero if there is a valid packet (without crc error) */
  if(plen!=0){
               
    // arp is broadcast if unknown but a host may also verify the mac address by sending it to a unicast address.
    if(es.ES_eth_type_is_arp_and_my_ip(buf,plen)){
      es.ES_make_arp_answer_from_request(buf);
      return;
    }

    // check if ip packets are for us:
    if(es.ES_eth_type_is_ip_and_my_ip(buf,plen)==0){
      return;
    }
    
    if(buf[IP_PROTO_P]==IP_PROTO_ICMP_V && buf[ICMP_TYPE_P]==ICMP_TYPE_ECHOREQUEST_V){
      es.ES_make_echo_reply_from_request(buf,plen);
      return;
    }
    
    // tcp port www start, compare only the lower byte
    if (buf[IP_PROTO_P]==IP_PROTO_TCP_V&&buf[TCP_DST_PORT_H_P]==0&&buf[TCP_DST_PORT_L_P]==mywwwport){
      if (buf[TCP_FLAGS_P] & TCP_FLAGS_SYN_V){
         es.ES_make_tcp_synack_from_syn(buf); // make_tcp_synack_from_syn does already send the syn,ack
         return;     
      }
      if (buf[TCP_FLAGS_P] & TCP_FLAGS_ACK_V){
        es.ES_init_len_info(buf); // init some data structures
        dat_p=es.ES_get_tcp_data_pointer();
        if (dat_p==0){ // we can possibly have no data, just ack:
          if (buf[TCP_FLAGS_P] & TCP_FLAGS_FIN_V){
            es.ES_make_tcp_ack_from_any(buf);
          }
          return;
        }
        if (strncmp("GET ",(char *)&(buf[dat_p]),4)!=0){
           // head, post and other methods for possible status codes see:
            // http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
            plen=es.ES_fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n

200 OK

"));             goto SENDTCP;         } if (strncmp("/ ",(char *)&(buf[dat_p+4]),2)==0){                 plen=print_webpage(buf, on_off);             goto SENDTCP;         }         cmd=analyse_cmd((char *)&(buf[dat_p+5]));                 if (cmd==2){                 on_off=1;         digitalWrite(LED_PIN, LOW);  // switch on LED         }         else if (cmd==3){                 on_off=0;         digitalWrite(LED_PIN, HIGH);  // switch off LED         }         plen=print_webpage(buf, on_off);                   plen=print_webpage(buf, on_off); SENDTCP:  es.ES_make_tcp_ack_from_any(buf); // send ack for http get           es.ES_make_tcp_ack_with_data(buf,plen); // send data            }     }   }         } // The returned value is stored in the global var strbuf uint8_t find_key_val(char *str,char *key) {         uint8_t found=0;         uint8_t i=0;         char *kp;         kp=key;         while(*str &&  *str!=' ' && found==0){                 if (*str == *kp){                         kp++;                         if (*kp == '\0'){                                 str++;                                 kp=key;                                 if (*str == '='){                                         found=1;                                 }                         }                 }else{                         kp=key;                 }                 str++;         }         if (found==1){                 // copy the value to a buffer and terminate it with '\0'                 while(*str &&  *str!=' ' && *str!='&' && i 0x2f){                         // is a ASCII number, return it                         r=(*strbuf-0x30);                 }         }         return r; } uint16_t print_webpage(uint8_t *buf, byte on_off) {       int i=0;                     uint16_t plen;                         plen=es.ES_fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"));         plen=es.ES_fill_tcp_data_p(buf,plen,PSTR(" "));         plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("
"));                 plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("
"));                 if(on_off)         plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("
"));         else         plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("
"));                 plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("  ") );                 if(on_off){         plen=es.ES_fill_tcp_data_p(buf,plen,PSTR(""));         plen=es.ES_fill_tcp_data_p(buf,plen,PSTR(""));         }         else {         plen=es.ES_fill_tcp_data_p(buf,plen,PSTR(""));         plen=es.ES_fill_tcp_data_p(buf,plen,PSTR(""));         }                           return(plen); }

sur la reconnaissance vocale

Ca j'aime, c'est un peu l'option grand luxe d'une installation domotique :D a voir pour la suite si c'est intégrable dans mon interface ( qui paye pas de mine ^^ ) domotique ;)

Je sait bien que je n'est pas de cahier des charges ( et pourtant je bosse avec ce genre de trucs toute la journée ... ^^ ) bien définit mais on va dire que j'avance suivant ce que j'arrive a faire ! j'ai une idée, j'essaye de la mettre en place et si c'est pas le cas bah je contourne pour arriver a un truc faisable avec mes maigres connaissances ^^

Déjà si j'arrive a mettre plusieurs boutons sur mon interfaces actuels je serait assez satisfait de moi pour le moment ... c'est pas top mais ça fonctionne et c'est le principal ^^

J'ai une idée de cahier des charges pour le moment ^^

  • mettre en place plusieurs boutons
  • rendre les images comme boutons pour retirer le switch on/switch off
  • intégrer le relever de ma sonde de température LM35

En gros ça représente a peut près 10 mois de travail pour moi :D

J'espere que je ne t'ai pas offusqué

Euh ... non du tout XD

t'as raison, il faut keeper la peach ^^

Bonjour a tous,

J'ai donc réussit a récupérer sur la toile un code avec deux boutons que j'ai remis a ma sauce ! je me suis donc dit "aller on tente de faire 4 boutons", je compile nikel ça me détecte pas d'erreur mais biensur une fois que je veut accéder a la page ça ne fonctionne pas et pour moi impossible de voir l'erreur ! pour moi c'est cohérent ...

[u]Code Arduino 2 boutons (fonctionnel ):[/u]

[u]Code Arduino 4 boutons (non fonctionnel ):[/u]

PS: j'ai mis les codes sur megaupload car ils sont trop long pour être posté sur le forum dans les balises ^^

Bon bah j'ai essayer de modifier 2 ou 3 trucs mais c'est pas ça, ça ne fonctionne toujours pas :stuck_out_tongue_closed_eyes:

Bonjour a tous,

Bon comme je n'arrive toujours pas a augmenter mon nombre de bouton et que personne ne veut m'aider =(, j'essaye donc d'avancer et d'intégrer la sonde de température a ma page. Il s'agit d'une sonde type LM35. J'ai donc intégrer mon code dans l'arduino, j'ai un bon retour d'information sur le serial monitor mais je coince c'est pour l'afficher sur ma page. En effet sur un LCD, il y a la fonction très intuitive qu'est "lcd.print(le nom de la variable);" mais avec l'ethernet-shield comment faire ?

j'ai regarder l'exemple avec une sonde DSxxxxx Onewire mais je pige pas trop comment faire afficher la température sur la page ... quelqu'un pourrais me donner un coup de pouce ? et je veut bien aussi de l'aide toujours a propos de mes boutons car je suit bloqué pour une connerie et pas loin de tous abandonner car ça commence a me souler de toujours me retrouver bloqué tous les 5 minutes :stuck_out_tongue_closed_eyes:

merci

Salut chico ! ;)

dans ta page tu mets :

client.print("Temperature: "); client.print(temperature); client.print(" degrees C");

ça doit marcher.

A+

Chicotore tu n'est pas le seul à avoir des difficultés à exploiter le ENC28J60 avec la librairie que les vendeurs de shields indiquent !!! C'est une librairie qui a le mérite d'exister mais ne permet pas d'écrire du code très lisible. D'ou un besoin : une librairie plus accessible pour ce composant économique.

Je connais deux voies en chantier mais déjà fonctionnelles : -celle de JeeLabs et de sa librairie Ethercard que j'ai un peu petit peu utilisé. -celle plus ambitieuse de Turicas qui vise le fonctionnement sur ENC28J60 des sketches 'officiels' pour W5100. Je n'ai pas encore testé cette dernière mais ça vaudrait peut être le coup de faire une pause et de travailler un peu à partir des petits exemples de serveurs inclus avec cette librairie. ça pourrait t'ouvrir la voie du client.print indiqué par Chabot380..... https://github.com/turicas/Ethernet_ENC28J60 Bon courage

Ouais c'est une vrai galère cet ENC28J60 ....

Je pense mettre un terme a mon projet domotique, pour le moment je me vois mal finaliser quelque chose de cohérent ... je n'est pas, seul, les compétence nécessaire a un tel projet ! Je suit en pleine reflexion car ce projet me tenais a coeur mais je n'arrive même pas a passer de 2 à 4 boutons sur mon interface ... et je parle même pas du capteur de température =(

chicotore: (...) j'ai un bon retour d'information sur le serial monitor mais je coince c'est pour l'afficher sur ma page. En effet sur un LCD, il y a la fonction très intuitive qu'est "lcd.print(le nom de la variable);" mais avec l'ethernet-shield comment faire ? (...)

Je n'ai pas l'habitude des shields ETH mais cela me fait penser à un soucis similaire lors d'un affichage via interface RS232; la fonction ?.print(variable) ne fonctionne pas. Il faut passer par une transformation de la variable en chaine afin de pouvoir l'envoyer par le print(). Un peu casse-bonbons et consomme de la ressource, mais à priori pas d'autres solutions...

Bonjour, j'ai suivi un peux ce sujet parce qu'il m’intéresse et là j'ai l'impression que tu met la charrue avant les bœufs A ta place j'aurais suivis les recommandations de ojal

ojal: Je me permets de revenir une fois de plus dans cette discussion... Je ne comprends pas du tout comment ce projet avance... Vous en êtes à essayer un problème très ponctuel d'affichage d'une image alors qu'aucune base n'a été définie pour ce projet de domotique... Une fois de plus, je préconise d'établir un cahier des charges, définir des orientations d'architecture etc etc...

Qu'en pensez-vous?

chicotore: Mon cahier des charges se définie sur le tas suivant ce que j'arrive a mettre en place et ce que je n'arrive pas a faire !

Le plus gros du problème ce situe là et reprendre le code (de plus complexe et imbuvable) de quelqu'un d'autre est une mauvaise idée quand on ne maitrise pas un peux le sujet,limite ça peut juste servir d'exemple pour mieux comprendre. Je sais que c'est pénible et qu'on a envie de tout avoir tout de suite avec un minimum d’investissement mais au final ça ne marchera pas, la preuve en est le résultat.

Prend ton temps, commence par maitriser un peux mieux le langage c (ou tout autre langage procédurale), les algorithmes de base et après tout te paraitra plus simple et clair, tu te demanderas même comment tu a pus faire certaine erreurs sur des chose pourtant très basiques et banales.

Je préféré être franc, pour l'instant tu perd ton temps :~ . Il est préférable de perdre 1 mois à ton aise (sur le site du zéro par ex) avec les bases plutôt que d'avancé et galérer 6 mois pour un résultat qui marchera peut être mais qui sera bancal, sans possibilité d'évolution (dépendances), bugger et non optimal.

Entre () j'ai aussi un projet domotique mais je pencherais plutôt sur une solution pages web hébergées délocalisée,ajax (XMLHttpRequest) ,serveur et contrôleur arduino + protocole maison genre x10 en hexa pour la communication et commandes entre le serveur arduino et le client (web). Ajax sera remplacé à terme par les websocket (standardisé) histoire de pouvoir notifié au client (l'explorateur) d'un changement d'état d'un capteur ou autre (impossible sans rafraichissement de la page par ex pour ton problème avec le lm35). J'ai déjà développé une application modulaire (plcbus, 1wire, ...) serveur (socket) de domotique en java donc ça ne devrait pas être trop compliqué d'appliqué les même principe à l'arduino.

Désolé si je t'ai découragé ou autre mais ce ne serait pas te rendre service que de t'aider à "débugger" ton code.

ekaki: Je n'ai pas l'habitude des shields ETH mais cela me fait penser à un soucis similaire lors d'un affichage via interface RS232; la fonction ?.print(variable) ne fonctionne pas. Il faut passer par une transformation de la variable en chaine afin de pouvoir l'envoyer par le print(). Un peu casse-bonbons et consomme de la ressource, mais à priori pas d'autres solutions...

normal non ?

http://arduino.cc/en/Serial/Print

print() Description

Prints data to the serial port as human-readable ASCII text ...

Serial.print fonctionne mais pas client.print ;)

Fin du projet

Moi je dis repose toi :sleeping:, étudie un peut tout ça ]:D et plus tard repart sur de bonne base :%.

Sur ebay j'ai prit le moins chère, 10€ ethernet-shield chinois

Oui mais vrai casse tête chinois pour programmation petit scarabé !

Regarder lien là : http://www.ordinoscope.net/index.php/Electronique/Hardware/Communication/ENC28J60

A+ petit scarabé Maître chabot.

Je me permet d’insister lourdement sur l’existence d’une nouvelle librairie pour Ethershield
développée par Turicas (GitHub - turicas/Ethernet_ENC28J60: [NOT MAINTAINED, NOT COMPLETED] Implementation of an Arduino-compatible socket layer library that uses Microchip ENC28J60 Ethernet controller.).
Elle n’est pas finalisée mais déjà opérationnelle.
C’est une Librairie Ethernet pour Ethershield !
On utilise une Ethershield comme si c’était un shield (officiel) à base de W5100… avec le confort de codage qui va avec.
Un coup d’oeil à l’exemple (un des 7 exemples fournis avec) ci dessous montre à mon avis que le résultat est déjà intéressant. On croirait voir un programme ecrit pour la carte 'officielle’.
Les ‘client.print’ n’y manquent pas… on y voit également l’affichage de valeurs prises sur des entrées analogiques (pourquoi pas un LM35 ?)

Avant de jeter éventuellement l’éponge ton projet mérite sans doute d’aller faire un tour de piste avec cette librairie. (Il peut etre nécessaire de modifier la ligne 39 du fichier “enc28j60.c” pour tenir compte du câblage de la broche CS sur la carte utilisée)

WebServerSimpleLED.pde (2.23 KB)

J'ai essayer la nouvelle librairie dès que tu l'as posté ici mais chez moi ça ne fonctionne pas.

#include 
#define LED 8

byte mac[] = { 0x54, 0x55, 0x58, 0x10, 0x00, 0x24 };
byte ip[] = {192,168,1,15};
char link[30], LEDStatus[4];

Server server(80);

void setup() {
  pinMode(LED, OUTPUT);
  Ethernet.begin(mac, ip);
  server.begin();
}

void loop() {
  Client client = server.available();
  if (client) {
    char request[10];
    int i = 0;
    boolean current_line_is_blank = true;
    request[9] = '\0';
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (i < 9) {
          request[i] = c;
          i++;
        }
        if (c == '\n' && current_line_is_blank) {
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          
          client.println("Arduino etherShield");
          client.println("

Arduino etherShield Example

");           client.println("");           client.print("");           if (strncmp("GET /off", request, 8) == 0) {             digitalWrite(LED, LOW);             sprintf(LEDStatus, "OFF");             sprintf(link, "Turn on");           }           else {             sprintf(LEDStatus, "ON");             digitalWrite(LED, HIGH);             sprintf(link, "Turn off");           }           client.print("
Analog inputs:");           for (int x = 0; x < 6; x++) {             client.print(x);             client.print(" = ");             client.print(5000 * (analogRead(x) / 1024.0));             client.print(" mV ");           }           client.println("
uptime: ");           client.print(millis() / 1000.0);           client.println(" seconds
LED status: ");           client.print(LEDStatus);           client.println("
");           client.println(link);           client.println("
");           break;         }         if (c == '\n') {           current_line_is_blank = true;         } else if (c != '\r') {           current_line_is_blank = false;         }       }     }     delay(1);     client.stop();   } }

Impossible d'accéder au serveur ....

(Il peut etre nécessaire de modifier la ligne 39 du fichier "enc28j60.c" pour tenir compte du câblage de la broche CS sur la carte utilisée)

Comment connaitre cette broche ? si cette librairie est faite pour le shield en enc28j60 la broche devrais être la bonne non ?