Go Down

Topic: RCSwitch, Ethernet et VirtualWire : incompatibilités ??? (Read 1 time) previous topic - next topic

creb

Bonjour à tous,

je travaille sur mon projet domotique actuellement et je rencontre un problème sur mon code.
Ce projet consiste à contrôler:
* un volet roulant
* 3 prises RF de marque CHACON

Je désire passer par un ARDUINO UNO R3 en serveur web, équipé d'un émetteur RF 433 Mhz.
Le volet roulant est piloté par une série de 3 boutons (ouverture, fermeture et stop) et un récepteur RF 433 Mhz, le tout monté sur un autre ARDUINO R3 (qui sera sans doute remplacé par la suite par un NANO 3).
Les prises sont pilotées directement par l'ARDUINO serveur avec l'émetteur.

Tout fonctionne parfaitement si je divise mon code pour chaque fonction, mais lorsque j'essaie de mettre tout dans le même code, le serveur web ne fonctionne plus.
Si je mets les commandes de RCSwitch en commentaires, le serveur web fonctionne à nouveau.

Ma question est  : y'a t-il une incompatibilité entre les différentes librairies que j'utilise ? Sinon, qu'est ce qui bloque mon code ?

Voici mon code, en vous remerciant par avance pour votre aide:

Code: [Select]

#include <VirtualWire.h>
#include <RCSwitch.h>
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = {0x90, 0xA2, 0xDA, 0x0D, 0x48, 0xD3 };
IPAddress ip(192,168,0,25);
IPAddress gateway(192,168,0,254);
IPAddress subnet(255, 255, 255, 0);
EthernetServer server(8675);
String readString;
int Nombre;
char Message[VW_MAX_MESSAGE_LEN];
RCSwitch mySwitch = RCSwitch();
unsigned long allumage_eclairage_princ_faux_plafond = 5510485;
unsigned long extinction_eclairage_princ_faux_plafond = 5510484;
unsigned long allumage_ciel_faux_plafond = 5522773;
unsigned long extinction_ciel_faux_plafond = 5522772;
unsigned long allumage_ruban_faux_plafond = 5525845;
unsigned long extinction_ruban_faux_plafond = 5525844;

void setup()
{
  Serial.begin(9600);
  vw_setup(2000);
  vw_set_tx_pin (9);
  mySwitch.enableTransmit(5);
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.print("Adresse IP du serveur : ");
  Serial.println(Ethernet.localIP());
  Serial.println("Controle via Ethernet actif");
}

// Allumage de l'éclairage principal du faux plafond de la salle à manger
void allu_ecl_princ_faux_plaf()
{
  mySwitch.switchOn(4, 1);
}

// Extinction de l'éclairage principal du faux plafond de la salle à manger
void ext_ecl_princ_faux_plaf()
{
  mySwitch.switchOff(4, 1);
}

void loop()
{
  EthernetClient client = server.available();
  if (client)
  {
    Serial.println("Nouveau client");
    while (client.connected())
    {
      if (client.available())
      {
        char c = client.read();
        if (readString.length() < 100)
        {
          readString += c;
          Serial.write(c);
           if (c == '\n') {
            Serial.println(readString);
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println();
            client.println("<HTML>");
            client.println("<HEAD>");
            client.println("<TITLE>Centralisation domotique</TITLE>");
            client.println("<center>");
            client.println("</HEAD>");
            client.println("<BODY>");
            client.println("<b>");
            client.println("<H1>Centralisation domotique</H1>");
            client.println("<br />");
            client.println("<hr />");
            client.println("<center>");
            client.println("<H2>Salle a manger<H2>");
            client.println("<hr />");
            client.println("<H3>Volet roulant de la baie vitree<H3>");
            client.println("<a href=\"/?ouverture_volet\"\">Ouvrir</a>");
            client.println("<a href=\"/?fermeture_volet\"\">Fermer</a>");
            client.println("<br />");
            client.println("<br />");
            client.println("<H3>Eclairage principal du faux plafond<H3>");
            client.println("<a href=\"/?all_ecl_prin_faux_plaf\"\">Allumer</a>");
            client.println("<a href=\"/?ext_ecl_prin_faux_plaf\"\">Eteindre</a>");
            client.println("<br />");
            client.println("<br />");
            client.println("<H3>Eclairage ciel à Leds du faux plafond<H3>");
            client.println("<a href=\"/?all_ciel_faux_plaf\"\">Allumer</a>");
            client.println("<a href=\"/?ext_ciel_faux_plaf\"\">Eteindre</a>");
            client.println("<br />");
            client.println("<br />");
            client.println("<H3>Eclairage ruban Leds du faux plafond<H3>");
            client.println("<a href=\"/?all_rub_leds_faux_plaf\"\">Allumer</a>");
            client.println("<a href=\"/?ext_rub_leds_faux_plaf\"\">Eteindre</a>");
            client.println("</BODY>");
            client.println("</HTML>");
            delay(1);
            client.stop();
            if(readString.indexOf("?ouverture_volet") >0)
            {
              Serial.println("Demande d'ouverture du volet de la bais vitree de la salle a manger envoyee");
              Nombre = 1;
              itoa(Nombre,Message,10);
              vw_send((uint8_t *)Message, strlen(Message));
              vw_wait_tx();
              delay(200);
            }
            else{
              if(readString.indexOf("?fermeture_volet") >0)
              {
                Serial.println("Demande de fermeture du volet de la baie vitree de la salle a manger envoyee");
                Nombre = 2;
                itoa(Nombre,Message,10);
                vw_send((uint8_t *)Message, strlen(Message));
                vw_wait_tx();
                delay(200);
              }
              else{
                if(readString.indexOf("?all_ecl_prin_faux_plaf") >0)
                {
                  //mySwitch.switchOn(4, 1);
                }
                else{
                  if(readString.indexOf("?ext_ecl_prin_faux_plaf") >0)
                  {
                    //mySwitch.switchOff(4, 1);
                  }
                }
                  readString="";
                  delay(1);
                  client.stop();
                  Serial.println("client disonnected");
              }
            }
          }
        }
      }
    }
  }
}

creb


Koni_Sipali

Je n'ai pas de solution désolé, mais j'ai plutôt le même problème (ici).

Du coup, les réponses à ton posts m'intéresseront.

Jz84100

pour info j'ai fais des tests il y a plusieurs jours pour mon projet
et avec ce programme mais avec une carte SD de le shield ethernet ca à fonctionné
le code n'est pas propre les noms des lampes de corresponde pas mais ça a marché comme je voulais

Code: [Select]
#include <Ethernet.h>
#include <SPI.h>
#include "IRremote2.h"
#include <SD.h>
#include <RCSwitch.h>
 
RCSwitch mySwitch = RCSwitch();
 

//network NB: Pins 10, 11, 12 and 13 are reserved for Ethernet module.
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 4 };
byte gateway[] = { 192, 168, 1, 1 };
byte subnet[] = { 255, 255, 255, 0 };
IRsend irsend;
String inString = String(35);

String Led;

int led[] = {00, 2, 3, 4 ,5 ,6 ,7 ,8,9  }; //Led pins num 0 in arry is not used
int numofleds = 8; //numofleds
String value[] = {"on","on","on","on","on","on","on","on","on"}; //startup all led are off
const int cuisine = 13;
EthernetServer server(80);
String data;
unsigned long Lampe_bureau_OFF = 4523348;
unsigned long Lampe_bureau_ON = 4523345;




void setup()
{
  Serial.begin(9600);
  Ethernet.begin(mac, ip,gateway,subnet);
  server.begin();
 //set pin mode
  for (int j = 1; j < (numofleds + 1); j++){
    pinMode(led[j], OUTPUT);
  }
  Serial.println("Serial READY");
  Serial.println("Ethernet READY");
  Serial.println("Server READY");
  pinMode(cuisine, OUTPUT);
  mySwitch.enableTransmit(10);
}

void loop()
{
  EthernetClient client = server.available();
 
  if(client){
    // an http request ends with a blank line
    boolean current_line_is_blank = true;
    while (client.connected()) {
     
      if(client.available()) {
     
        char c = client.read();
        // if we've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so we can send a reply
        if (inString.length() < 35) {
            inString.concat(c);
         }
        if (c == '\n' && current_line_is_blank) {
                   
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<html><body><form method=get>");
          client.println("<p>Control des DELs</p>");
         
          if(inString.indexOf("cuisine=on")>0){
           mySwitch.send(Lampe_bureau_ON, 24);
  delay(1000);
         }else if(inString.indexOf("cuisine=off")>0 ){         
            mySwitch.send(Lampe_bureau_OFF, 24);
  delay(1000); 
         }
         client.println("<br>cuisine <input type=submit name=cuisine value=on><input type=submit name=cuisine value=off>");
         client.println("</from></html></body>");

       
          break;
         
        }
        if (c == '\n') {
          // we're starting a new line
          current_line_is_blank = true;
        } else if (c != '\r') {
          // we've gotten a character on the current line
          current_line_is_blank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    inString = "";
    client.stop();
  }
}

Artouste

Up !
Si quelqu'un a une idée...
bonsoir
AMHA il y a du conflit d'interruption et/ou de timer
quel est ton cablage


creb

Bonsoir à tous ,

@ Artouste : Rien de bien compliqué pour le câblage : Mon émetteur RF est connecté à la Pin 9, ce qui laisse les Pins 4, 10, 11, 12 et 13 pour le shield ethernet comme indiqué sur plusieurs pages Internet.

@Jz84100 : je vais tester au cas où. Tu fais quelque chose de spécial par rapport à la carte SD ?

creb

Juste une petite précision : dans le code présenté, j'ai mis l'émetteur RF en pin 9 pour virtualwire et en pin 5 pour rcswitch. J'avais testé cette solution, qui ne donne rien de mieux.
Pour le premier code testé, un seul émetteur est branché sur la pin 9 (pour virtualwire ET rcswitch).

creb

Un update pour vous donner la solution que j'ai trouvé.
En fait, il semblerait que les librairies VirtualWire et RCSwitch ne soit pas très amies.
La seule solution que j'ai trouvée a été de d'utiliser RCSwitch sur mon Arduino UNO (serveur web), puis de passer sur un Arduino NANO via la librairie Wire pour lancer mes commandes VirtualWire.
Il a juste fallut rajouter un second émetteur RF, quelques fils et 2 microcontrôleurs au lieu d'un, mais tout fonctionne maintenant.

henrikl2000

 vais avoir le même problème avec RCSwitch que vous avez mentionné. Vous résoudre maintenant ?

I am having the same problem with RCSwitch as you mentioned. Did you solve it by now?

henrikl2000

Salut

J'ai découvert que si vous remplacez la bibliothèque SD avec la bibliothèque SdFat, je travaille avec RCSwitch.

https://github.com/Greiman/SdFat

Remplacer les #include <SD.h>
Avec
#include « SdFat.h »
SdFat SD ;

Et vous pouvez utiliser RCSwitch

fdufnews

Tu es certain qu'il y a encore de la mémoire RAM de libre avec toutes ces librairies?

henrikl2000

Salut
Viens de trouver un remplacement pour RCSwitch qui fonctionne très bien avec Ethernet et la carte SD.
Aucun conflit avec SD

La bibliothèque RemoteSwitch est faite par Randy Simons et peut être téléchargé ici :
https://bitbucket.org/fuzzillogic/433mhzforarduino/Overview

N'oubliez pas de lire les docs et tester les exemples pour obtenir une meilleure compréhension.

Par ailleurs Désolé mon Français. J'ai utilisé Bing traduction

Go Up