Aidez nous ! Projet - Gestion domotique

J'ai fait des essais avec le câble de 4m sur le bus I2C en créant des perturbations : - avec un vieux moteur électrique qui crache des étincelles => pas de Pb - en enclenchant un gros contacteur => l'afficheur LCD du système affiche n'importe quoi, alors que le bus I2C fonctionne bien.

conclusion : je pense que pour ma liaison I2C à 1,5m cela devrait bien fonctionner => je vais utiliser un câble blindé pour plus de sécurité.

Qu'en pensez-vous ?

zoroastre:

Au final c'est le rendu (version close) que j'aimerais obtenir (rail DIN) par module. :open_mouth:

Brisebee: Qu'en pensez-vous ?

De ce que j'ai vu, entendu ça ne devrait pas posé de problème ? Zoro y répondra mieux que moi je pense.

osaka: Au final c'est le rendu (version close) que j'aimerais obtenir (rail DIN) par module. :open_mouth:

J'ai déja utilisé ce type de boîtier : mon unité de commande chauffage est monté dans un tel boîtier et je viens d'en commander d'autres chez Conrad pour les unités d'interfaçage chauffage et arrosage.

@+

Brisebee: J'ai déja utilisé ce type de boîtier : mon unité de commande chauffage est monté dans un tel boîtier et je viens d'en commander d'autres chez Conrad pour les unités d'interfaçage chauffage et arrosage.

J'ai pas vu de module arduino chez conrad. Tu parles juste de la boite ?

Sinon, vous savez, cela existe une jolie boite bien propre, pouvant contenir un arduino, un afficheur LCD , quelques boutons. (et si possible avec de la place pour une sheild "radio" radio RF ou wifi ou autres pour la liaison avec les autres modules) Pour faire une interface de commande chauffage pour mettre dans le salon ? Il faudrait que cela ressemble à un truc comme cela, par exemple http://www.conrad.fr/thermostat_avec_programmation_hebdomadaire_24_230v_p_52080_59631_836555_648169_FAS

cedric2: J'ai pas vu de module arduino chez conrad. Tu parles juste de la boite ?

Oui je parle du boîtier. Effectivement Conrad ne fait pas de modules Arduino.

Je posterai des photos au fur et à mesure. Pour l'instant je ne peux faire que celles des unités de commandes (puisqu'elles existent et fonctionnent avec mon ancien système).

cedric2: Sinon, vous savez, si cela existe une jolie boite bien propre, pour faire une interface de commande chauffage pour mettre dans le salon ?

Je n'ai jamais vu, mais je n'ai pas cherché.

@+

Bonjour a tous et toutes, moi j'ai utilise ce genre de boitier. et d'autre boitier pour Rail DIN http://www.tme.eu/fr/katalog/?art=Z-104#id_category%3D100625%26cleanParameters%3D1%26%26page%3D5%2C20 Site en pologne mais prix des boitier OK. A plus.

Cela a l'air pas mal et pas cher. (j'ai pas vu les frais de livraison) Il faut que je recherche encore un peu, et que je valide les taille, mais http://www.tme.eu/fr/details/abs-33a/boitiers-pour-appareils-a-ecran/# me semble pas mal adapté si je trouve un afficheur adaptable

Merci pour l’info, ces boîtiers ont l’air d’être bien adaptés pour la domotique, autant ceux pour rails DIN, qui sont à priori pas trop chers, que les autres. Il faut effectivement voir pour les frais de port, si quelqu’un a l’info ?

Les frais de livraison sont de 7,90€, livraison par UPS. Mes commandes on été reçu 3-4 jours après payement par paypal.

J'ai commander ce boitier et je suis satisfait de cellui-ci.

je l'utilise pour 32 entrées et un autre pour 16 sortie avec relais.

Yop yop, Vive les boiboites bien propre histoire de cacher un montage dégueulasse (les miens). :grin: Sinon pour changer un peux j'ai remis mon shield eth sur ma mega, pour la partie couplage contrôleur web/bus, j'arrive à envoyer une commande avec retour de statut assé rapidement (une 20 ène de millis sec, avec bus à 112500baud). Par contre je suis moyennement satisfait au niveau de la réactivité en ce qui concerne les commande local et statut je suis obligé de scruter tout les x ms si il y à eu un changement c'est loin d'être optimal. Je met mon code d’expérimentation.

Code arduino (brouillon pas propre et non optimisé) :

#include 
#include 
#include 
#include 
#include 

#define DATA_LENGTH 6
#define ADDRESS 0x12
#define RECEIVER 0x10

#define RE_DE_ON PORTK|=128
#define RE_DE_OFF PORTK&=~(128) 
#define RE_DE_REG DDRK |= 128
#define BAUD 115200

#define _WAIT(_pres) _delay_us(_pres)
#define SERIAL_BUFFER_SIZE 16

byte mac[] = {  0x90, 0xA2, 0xDA, 0x00, 0x6D, 0x86 };
byte ip[] = { 192,168,1,109 };

Server server(9390);
Client client = 0;

volatile uint8_t listener = 0;
volatile uint32_t delayWD = 0;

uint8_t bufferBusTx[DATA_LENGTH] = {0}; 
volatile uint8_t bufferBusRx[SERIAL_BUFFER_SIZE] = {0};
volatile uint8_t bufferTmp[32] = {0};
volatile uint8_t pos = 0;
volatile uint8_t available = 0;

uint32_t delayB = 0;
volatile uint8_t ack = 0;
uint8_t err = 0;

const uint32_t pres = 69120000/BAUD;
const uint32_t maxRec = 14000000/BAUD;
const uint32_t maxTrans = (32640000/(BAUD/100))+((ADDRESS*(pres*2)));


ISR(USART1_RX_vect)
{
  if((UCSR1B & (1< 0)
    {
      bufferBusTx[i] = client.read();
      i+=1;
    }
    
    if(bufferBusTx[1] == 0x12 && bufferBusTx[2] == 0x12)
    {
      if(bufferTmp[2])
      {
        writeAjax(client, bufferTmp);
          
        bufferBusTx[2] = 0;
        bufferTmp[2] = 0;
      }
    }
    else
    {
      while(client.connected())
      {
        if(available)
        {
          readData(); 
          available = 0;
        }
        else
        {
          sendData();
        }   
      }
    }
    client.flush();
    client.stop();
  }
  
  if(available)
  {
    readData();   
    available = 0; 
  }
  else
  {
    sendData();
  }
  
}

uint8_t sendData()
{
  if(bufferBusTx[2] && !listener) 
  {
    _WAIT(pres);
    writeData(bufferBusTx);
    ack = 1;
  }
  
  if(listener && micros() >= delayWD) 
  {
    listener = 0x00;
    ack = 0;
  }
}

void readData() 
{
    if(bufferBusRx[0] == 0x02 && bufferBusRx[bufferBusRx[1]+4] == 0x03) //debut de trame
    {
        if(checkData()) //crc ok
        {
          action();
        }
        else //sinon on retourne directement un message d'erreur crc à l'envoyeur
        {
          
          ackError(0x02);
        }
    }
    else //sinon on retourne directement un message d'erreur general de reception
    {
      ackError(0x01);
    }
       
}

void action()
{ 
    if(bufferBusRx[4] == 0xFF || err == 2)
    {
      bufferBusTx[2] = 0;
      _WAIT(pres);
      RE_DE_ON;
      write(0x00, 1);
      _WAIT(pres);
      RE_DE_OFF;
      ack = 0;
      err = 0;
      if(bufferBusRx[4] == 0xFF)
      {
        if(client.connected())
        {
          writeAjax(client, bufferBusRx);
        }
        else
        {
          for(int i = 0; i <= bufferBusRx[1]+1; i++)
          {
            bufferTmp[i] = bufferBusRx[i];
          }
        }
      }
    }    
    else
    {
      ++err;
      _WAIT(pres);
      writeData(bufferBusTx);
    }
}

void writeAjax(Client cli, volatile uint8_t* buf)
{
    client.print("{");

    for(int i = 0; i <= buf[1]; i++)
    {
      client.print("\"i");
      client.print(i);
      client.print("\":");
      client.print((int)buf[i+1]);
      if(i < buf[1])
      {
        client.print(",");
      }
    }
    client.print("}");
    
    client.flush();
    client.stop();
}

void writeData(uint8_t* data)
{
  uint16_t crc = 0xFFFF;
  
  for(uint8_t i=0; i <= data[0]; i++)
  {
    crc = _crc16_update(crc, data[i]);
  }
  
  RE_DE_ON;
  
  write(data[1], 1); 
  write(0x02, 0); 
  for(uint8_t i=0; i <= data[0]; i++) 
  {
    write(data[i], 0);
  }
  
  write(((crc & 0xFF00) >> 8), 0);
  write((crc & 0x00FF), 0);
  write(0x03, 0); 
  _WAIT(pres); 
  RE_DE_OFF;
}

uint8_t checkData()
{
  uint16_t crc = 0xFFFF;
  
  uint16_t _crc = (bufferBusRx[bufferBusRx[1]+2]<<8);
  _crc += bufferBusRx[bufferBusRx[1]+3];
  
  for(uint8_t i=1; i <= bufferBusRx[1]+1; i++)
  {
    crc = _crc16_update(crc, bufferBusRx[i]);    
  }

  if(crc == _crc)
  {
    return 1;
  }
  
  return 0;
}

void ackError(uint8_t ErrorNo)
{
  uint8_t data[5] = {0};
  data[0] = 0x04; 
  data[1] = 0x81;
  data[2] = ADDRESS;
  data[3] = 0xFE;
  data[4] = ErrorNo;
  _WAIT(pres);
  writeData(data);
}
//////////////////////////////////////////////////////////////////////////////////////////////////

void write(uint8_t data, uint8_t txb8)
{
  while (!((UCSR1A) & (1 << UDRE1)))
    ; 
  if(txb8)
  {
    UCSR1B |= (1<> 8;
  UBRR1L = baud_setting;
    
  UCSR1A |= (1<

Page index html:






DDuinoAjax

    
    
    
        
    
    
    
   



 

DD

Code javascript:

function init()
{
    setInterval("getStatut()", 200);
}

function getStatut()
{
  var dataJSon = {"0":0x02,"1":0x12,"2":0x12 };
  send(dataJSon);
}

function parseJSon(dJson)
{
  var duino = eval('(' + dJson + ')');
  if(duino.i2 == 0x10)
  {
    log(dJson);
    for(var i = 0; i <= 7; i++)
    {
      id="dw"+i;
    
      if(duino.i5 & (1 << i))
      {
        $(id).innerHTML="off";
        $(id).setAttribute('onclick', "cmdIO("+i+", 0, 0)");
      }
      else
      {
        $(id).innerHTML="on";
        $(id).setAttribute('onclick', "cmdIO("+i+", 1, 0)");
      }
      //log(Date.now());
    }
  }
}

function cmdIO(pin, value, ack)
{
  //log(Date.now());
  var dataJSon = {"0":0x04,"1":0x10, "2":0x12, "3":value, "4":pin };
  send(dataJSon);
}

function send(dataJSon)
{
  jQuery.post("socket.php", dataJSon,
  function(data)
  {
    parseJSon(data);
  });
}

function $(id)
{
  return document.getElementById(id);
}

function log(msg)
{
  $("log").innerHTML+="
"+msg;
}

function sleep(milliseconds)
{
  var start = new Date().getTime();
  start+=milliseconds;
  
  while((new Date().getTime()) <= start)
  {
      
  } 
}

Code php:


Je songe à revenir vers les websocket mais serveur en java et communication avec le bus non plus avec shield eth mais via port serie du serveur (hard).

Bonsoir,

Je reviens vers vous, pour vous tenir au courant de l’avancement de mes travaux.
Je viens de finir mes essais et le schéma structurel de l’unité d’interfaçage arrosage.
Cette unité en I2C vient s’intercaler entre l’unité de gestion (arduino) et l’unité de commande arrosage.
Je joins le schéma à ce post.
N’hésitez pas à me faire des commentaires et des remarques.
Je vais la câbler dès que j’ai reçu tous les composants, il ne me manque plus grand chose.

Bien à vous tous

Schéma structuel unité d’interfaçage arrosage.pdf (137 KB)

Yep!

Je viens de jeter un oeil. J'ai presque tout compris à part les transistors sur les lignes scl et sda qui à mon goût ne servent pas à grand chose :grin:

En tout cas super boulot, faudra nous mettre une jolie photo kicad 3d XD

@+

Zoroastre.

En fait, j’ai repris un schéma que j’ai trouvé sur le net, et qui doit permettre d’augmenter la distance sur la liaison I2C, j’ai fait quelques essais avec une longueur de 10m cela fonctionne très bien.
En fait je n’ai besion que d’environ deux mètres, mais je préfère assurer.

J’enverrai des photos dès que j’aurai fini le câblage.
En attendant voici des photos de l’unité de commande arrosage et de l’unité de commande chauffage.

Yop Yop BriBri, Tu as bien avancé, en tout cas super boulot qui devrait en inspiré plus d'un. :) Grâce à toi je viens de découvrir le pcf8574 :sweat_smile: qui m'apparait très intéressant pour étendre le nombre d'e/s. :open_mouth:

Pour l'instant je ne travaille plus trop sur le bus, je suis en train de me faire une application java serveur de websocket qui permettra la communication websocket<->arduino via shield ethernet mais également via port serie, ce qui permettra de lier web <-> arduino sans même être obligé de disposé d'un shield ethernet. :open_mouth:

osaka: je viens de découvrir le pcf8574 :sweat_smile: qui m'apparait très intéressant pour étendre le nombre d'e/s. :open_mouth:

Le PCF8574 est très intéressant et facile à mettre en oeuvre avec un arduino.

osaka: je suis en train de me faire une application java serveur de websocket qui permettra la communication websocket<->arduino via shield ethernet

Pour ce que j'ai compris, ton principe de websocket permet d'utiliser des fonctions (ou modules) pour échanger des informations entre l'arduino et le serveur web, c'est ce dont je vais avoir besoin. Je vais bientôt attaquer la partie programmation et notamment ce qui concerne la partie web. Pour le moment, je n'en suis pas encore là, j'avance doucement, pas à pas. Mais j'aurai besoin d'aide à ce moment là.

@+

Yep!

Pour ma part, je viens de finir la sérigraphie de mon premier proto double coeur à 20 Mhz.

J'ai quelques défauts de conception : petit manque de place au niveau de l'alimentation qui n'est pas définitive à l'heure actuelle. J'attends la livraison de régulateurs 5v/2A et 3.3v (le pion rouge) ainsi que des condo chimiques. Je me suis planté sur l'empreinte des quartz. C'est exploitable pour l'heure et je vais lancer les tests dés que j'aurais définitivement validé la partie alimentation (faudrait pas que çà chauffe de trop quand je vais tirer dessus).

J'attaque le shield ethernet + eeprom + ds1307 déssiné dans les grandes lignes.

@+

Zoroastre.

Brisebee:

osaka: je suis en train de me faire une application java serveur de websocket qui permettra la communication websocket<->arduino via shield ethernet

Pour ce que j'ai compris, ton principe de websocket permet d'utiliser des fonctions (ou modules) pour échanger des informations entre l'arduino et le serveur web, c'est ce dont je vais avoir besoin.

En fait ça permettra surtout une communication full-duplex, dans le cas de serveur de contenu web (pages html, ...) la communication ne peux être initié que d'un seul côté, celui qui fais la requête (navigateur [requête]) ->arduino [réponse]-> navigateur). Dans le cas du websocket chacun pourras initié la conversation (navigateur<->arduino). Entre () contrairement à la solution ajax et socket php, ici le code html pourra ce trouver sur un hébergeur distant comme la beaucoup n'accepte pas les sockets.

Brisebee: Mais j'aurai besoin d'aide à ce moment là.

Pas de problème, on t'aideras du mieux possible.

zoroastre: je viens de finir la sérigraphie de mon premier proto double coeur à 20 Mhz.

Pourquoi un double coeur ? As-tu une application particulière en projet ? Quels CI utilises-tu ?