Bonjour,
Je suis en train de faire exactement ce que tu cherche Ă faire !
Je suis actuelement en train de develloper le code mais cette semaine j'était bien occupé et le mois prochain aussi donc ça va pas trop avancer avant début juin malheuresement.
Moi j'arrive à communiquer dans les deux sens entre la zibase et l'arduino mais je passe par des astuces, il y a peu être mieux n'hesitez pas à apporter votre pierre a l'édifice, c'est la force des forums.
Donc pour le moment, le projet est d'installer l'arduino + shield ethenet relié via câble ou CPL au réseau maison dans un coffret au niveau de mon portail.
Il va me permetre de commander l'ouverture du portail, de messurer la T° ext ici, de detecter la sonnette, de detecter le courrier, de decter un passage barrière infraroure portail et de commander une ou plusieurs lumières.
Je vais aussi inclures une chose particulière, une sonde de lumière (ou une led utilisée en sonde sisi c'est possible) dans un tube pour détecter les appels de phares. Pour la petite histoire j'ai déjà réussi à mettre en place une détection de 'codes' d'appels de phares type morse avec un ou plusieurs codes à définirs. De la même manière avec la sonnette je pourrais detecter des codes, ça permettra à mes parents s'ils viennent d'ouvrir le portail sans telco (et sans phares

)
Pour la sonnette, je pense by-passer l'interphonne actuel. Ca me permettra de ne pas faire sonner la sonnette la nuit par exemple ou autre idée ou bien de la faire sonner via une commade zibase.
VoilĂ , prometteur, non ?
Pour la communication :
Zibase (ou autre) -> arduino : en commande HTTP c'est génial, super simple à mettre en place et assez fléxible. ça marche impecable.
Une commande http peux être accompagné d'une réponse type xml (du faut xml mais bon) pour un retour d'état ou reponse à demande de température.
La zibase sait lire un chiffre après un mot clé donc facile !
Pour de l'arduino -> Zibase : appel de scénario. C'est peut être pas le top mais ça marche bien. Un scenario peut commander après des perif virutels. J'ai pas encore trops chercher on peux peut-être commander direct des perif virtuels... L'inconvegnant c'est qu'il faut programmer l'arduino avec le n° de scénario donc ça pourrait être à améliorer ça.
Toute la question est aussi de chosir qui fait le job, soit l'arduino sert seulement d'interface entrés/sorties soit elle fait tout de même des actions... J'ai plus confiance en ma programmation donc je fait un max de truc avec l'arduino....
Par exemple, l'arduino gère le portail si on envoie une commande d'ouverture/fermeture alors que la maneouvre n'est pas terminée il ne fait rien...
Pour info, niveau coût, j'achette tout direct en chine (sur DX.com). L'arduino mega (une 50ene E/S) est à environ 15€, le shield ethernet est à 13€ aussi, une carte 8 relais (220V/10A) est à 8€... à vous de voir si vous voullez de la qualitée prenez dans les boutiques officieles mais perso je n'est pas été décu et même très surprit.
Pour la température, l'arduino gère très bien le 1-wire donc j'ai un DS18B20.
J'envoie aussi des push via pushingbox direct depuis l'arduino.
Aller place au code, qui je rappel est en cours de dev, ceux qu'il veullent un truc tout fait tout propre attendez quelques semaines.
- Code: Tout sélectionner
//ZodiArduino par Xiboard
#include <SPI.h>
#include <Ethernet.h>
#include <ClickButton.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Bounce.h>
long goOnTime;
long onTime;
long shortClick = 350;
long longClick = 1000;
String pwrdRead = String(10);
int alarmeStat = 0;
//MODE DEBUG > Suivi Serial
boolean DEBUG = true;
//Définitions des PINs
//ENTRES
#define buttonPin 50
#define ONE_WIRE_BUS 3
//SORTIES
#define ledPin 22
#define portePin 23
#define alarme 24
//Définitions des constantes
int courrierState;
int temperatureReturn = 0;
int lastOuverturePortail;
String readString = String(100);
float tempC;
long lastMesureTemp = 0;
long periodeMesureTemp = 120000; //2 mins
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
//Configuration 1-Wire
DeviceAddress Thermometer = { 0x28, 0x97, 0x45, 0x95, 0x04, 0x00, 0x00, 0xEF };
//Configuration Arduino :
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x19 };
IPAddress ip(192,168,0,100);
//Configuration Zibase :
IPAddress ipZibase(192,168,0,50);
//Configuration PushingBox :
char DEVID1[] = "v************"; //DevID PushingBox $message$
char serverPushName[] = "api.pushingbox.com";
EthernetClient client;
EthernetServer server(80);
// Setup des Entres Bounces
Bounce sonnette = Bounce( buttonPin, 50);
void setup() {
Serial.begin(9600);
//1-Wire
sensors.begin();
sensors.setResolution(Thermometer, 10);
//Setup des Sorties
pinMode(ledPin,OUTPUT);
pinMode(portePin,OUTPUT);
pinMode(alarme,OUTPUT);
//Demarrage Ethernet
if (Ethernet.begin(mac) == 0) {
Serial.println("Failed to configure Ethernet");
// no point in carrying on, so do nothing forevermore:
while(true);
}
else{
Serial.println("Ethernet ready");
// print the Ethernet board/shield's IP address:
Serial.print("IP address Arduino: ");
Serial.println(Ethernet.localIP());
}
// give the Ethernet shield a second to initialize:
delay(1000);
server.begin();
lastOuverturePortail = millis();
}
void loop() {
//Lectures des entrées
if(sonnette.update() && sonnette.read()) analyse_button();
//TEST Sonnette Code 1
if (pwrdRead == "...---..."){
//ouverture porte
digitalWrite(portePin, HIGH);
delay(1000);
digitalWrite(portePin, LOW);
pwrdRead = "";
}
//Test Sonnette Code 2
if (pwrdRead == ".-."){
//alarme
if (alarmeStat == 0){
digitalWrite(alarme, HIGH);
alarmeStat = 1;
}else{
digitalWrite(alarme, LOW);
alarmeStat = 0;
}
pwrdRead = "";
}
//Test Sonnette Appui Normal
if (pwrdRead == "." || pwrdRead == "_" || pwrdRead == "-"){
//sonnette normale
zibaseScenario(63);
sendToPushingBox(DEVID1,"Quelqu'un%20sonne%20Ă %20la%20maison");
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
pwrdRead = "";
}
//Test COURRIER
if(0 == 1){
zibaseScenario(63);
sendToPushingBox(DEVID1,"Nouveau%20courrier%20!");
}
//APPEL GET : COMMANDE RELAIS
EthernetClient client = server.available();
if(client){
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (readString.length() < 100) {
readString += c;
}
//if HTTP request has ended
if (c == '\n') {
if (readString.indexOf("?") >= 0)
{
if (readString.indexOf("cmdPortail=1") > 0 ) ouverturePortail();
if (readString.indexOf("lumPortail=0") > 0 ) {
Serial.println("Lumiere portail off");
digitalWrite(alarme, HIGH);
}
if (readString.indexOf("lumPortail=1") > 0 ) {
Serial.println("Lumiere portail on");
digitalWrite(alarme, LOW);
}
if (readString.indexOf("sonnette=1") > 0 ) Serial.println("action sonnette");
if (readString.indexOf("temperature") > 0 ){
Serial.println("renvoie temperature");
temperatureReturn = 1;
}
}
else
{
Serial.print("Aucune commande reconnue");
}
//now output HTML data header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
if(temperatureReturn){
client.println("<HTML>");
client.println("<HEAD>");
client.println("<TITLE>Arduino Retour Temperature</TITLE>");
client.println("</HEAD>");
client.println("<BODY>");
client.println('<?xml version="1.0" encoding="utf8" ?>');
client.print("<temperature>");
client.print(tempC);
client.print("</temperature>");
client.println("</BODY>");
client.println("</HTML>");
}
delay(100);
//stopping client
client.stop();
readString="";
}
}
}
}
//Mesure Temperature 1-Wire
if ((millis() - lastMesureTemp) > periodeMesureTemp){
Serial.print("Getting temperature...\n\r");
sensors.requestTemperatures();
printTemperature(Thermometer);
}
}
void ouverturePortail() {
if(millis() - lastOuverturePortail > 60000) {
Serial.print("Ouverture/fermeture portail en cours...\n\r");
digitalWrite(portePin, HIGH);
delay(1000);
digitalWrite(portePin, LOW);
lastOuverturePortail = millis()
}else{
Serial.print("Impossible, ouverture/fermeture portail en cours.\n\r");
}
}
void analyse_button() {
pwrdRead = "";
while(sonnette.read() || sonnette.duration() < 1000) {
//boucle tant que on a un état 1 ou temps inf à 1s
if(sonnette.risingEdge()) goOnTime = millis();
if(sonnette.fallingEdge()){
onTime = millis() - goOnTime;
if (onTime < shortClick){
//clic court
Serial.println("appui court");
pwrdRead += ".";
}
if (onTime > shortClick && onTime < longClick){
//click long
Serial.println("appui long");
pwrdRead += "-";
}
if (onTime > longClick){
//Click trop long
Serial.println("appui tres long");
pwrdRead += "_";
}
}
sonnette.update();
}
}
void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
Serial.print("Error getting temperature");
} else {
Serial.print("C: ");
Serial.print(tempC);
}
}
void zibaseScenario(int scenario){
client.stop();
if(DEBUG){Serial.println("connecting Zibase......");}
if (client.connect(ipZibase, 80)) {
if(DEBUG){Serial.println("connected Zibase");}
if(DEBUG){Serial.println("sendind request");}
if(DEBUG){
Serial.print("Lancement scenaro num");
Serial.println(scenario);
}
client.print("GET /cgi-bin/domo.cgi?cmd=LM%20");
client.print(scenario);
client.println(" HTTP/1.1");
client.print("Host: ");
client.println(ipZibase);
client.println("User-Agent: Arduino");
client.println();
}
else {
if(DEBUG){Serial.println("connection Zibase failed :/");}
}
}
//char msg[]
void sendToPushingBox(char devid[], char msg[]){
client.stop();
if(DEBUG){Serial.println("connecting PushingBox...");}
if (client.connect(serverPushName, 80)) {
if(DEBUG){Serial.println("connected PushingBox");}
if(DEBUG){Serial.println("sendind request");}
client.print("GET /pushingbox?devid=");
client.print(devid);
client.print("&message=");
client.print(msg);
client.println(" HTTP/1.1");
client.print("Host: ");
client.println(serverPushName);
client.println("User-Agent: Arduino");
client.println();
}
else {
if(DEBUG){Serial.println("connection PushingBox failed :/");}
}
}
Dsl, les commentaires sont essentiellements pour moi...
Il y a pas mal de librairies pour que ça marche chez vous mais vous pouvez les trouvez facilement sur google.
Je repète que c'est en test actuelement, et que le code tel quel n'est pas super fonctionnels quelques trucs marchent mais pas tout c'est pour donner une ligne directrice.
Aller n'hésitez pas à donner des idées je suis joueur
