Log in Register

Login to your account

Username
Password *
Remember Me

Create an account

Fields marked with an asterisk (*) are required.
Name
Username
Password *
Verify password *
Email *
Verify email *
Captcha *
Welcome, Guest
Username: Password: Remember me

TOPIC: améliorer mon script

améliorer mon script 04 Jan 2016 17:58 #1

bonjour

je me suis faits un script pour fonctionner avec wiseflat

il me commande quatre relais une thermistance et une photorésistance

le mqtt est une passerelle photorésistance raspberry module chacon en 433 mhz

est comme je ne suis pas un pro de la programmation

ce serait sympa si un pro pouvez me corriger (m'aider à améliorer mon script)

mon script fonctionne

merci
#include <SPI.h>       
#include <Ethernet.h>
#include <PubSubClient.h>
#include <EthernetUdp.h>
#include <stdio.h>
#include "xPL.h"

#define IS_STRING_EQUAL(string1, string2) !strcmp(string1, string2) 

xPL xpl;
int devicePin; // contiendra le n° de pin extrait par sscanf (device=)
char commandValue;//contiendra une lettre n pour on  f pour off
 
//Photorésistance
int photocellPin = A0;     // La photo-résistance raccordée sur la PIN A0 (avec une résistance Pull-Down de 10K Ohms)
 
unsigned long timerLumiere = 0;//valeur courante du temps
//thermistance
unsigned long timerTemp = 0;//valeur courante du temps
int sensorPin = A1;//la thermistance raccordée en A1
 
byte mac[] = {
  0x90, 0xA2, 0xDA, 0x0D, 0xF0, 0xF5 };
IPAddress ip(192, 168, 0, 177);//ip arduino
IPAddress broadcast(192, 168, 0, 255);//ip de la box
IPAddress server(192, 168, 0, 17);//l'ip du server mqtt
//Udp messages xpl
EthernetUDP Udp;
//void callback message mqtt
void callback(char* topic, byte* payload, unsigned int length) {
}
 
void SendUdPMessage(char *buffer)
{
  Udp.beginPacket(broadcast, xpl.udp_port);
  Udp.write(buffer);
  Udp.endPacket();
}
 
void AfterParseAction(xPL_Message * message)
{
  if (xpl.TargetIsMe(message))
  {
    if (message->IsSchema_P(PSTR("lighting"), PSTR("basic")))
    {
      // Serial.println(PSTR("is lighting.basic"));
 
    }
  }
 
  // show message     
  //Serial.println(message->toString());
 
  // Pour tous les attributs du message XPL
  boolean noDeviceAttribute = true;
  for(int i=0 ; i < message->command_count ; ++i)
  {
    // Traitement du device
    if(IS_STRING_EQUAL(message->command[i].name, "device"))
    {
      // Récupératon du n° de device
      if(sscanf(message->command[i].value, "%d" ,&devicePin) == 1)
      { 
        // Un chiffre a bien été extrait
      }
 
      // Un attribut 'device' a été détecté
      noDeviceAttribute = false;
    }
 
    // Traitement de la commande
    else if(IS_STRING_EQUAL(message->command[i].name, "command"))
    {
      // Récupération du 2ème caractère dans la valeur de l'attribut "command"
      // ('n' pour "on" ou 'f' pour "off")
      commandValue = message->command[i].value[1];
    }
  }
 
  // Si aucun attribut 'device' n'a été détecté,
  // Alors effacer la pin
  if(noDeviceAttribute)
  {
    devicePin = -1;
    commandValue = '-';
  }
}
 
//messages mqtt
EthernetClient ethClient;
PubSubClient client(server, 1883, callback, ethClient);
 
void setup()
{
  //Serial.begin(115200);
  Ethernet.begin(mac,ip);
  Udp.begin(xpl.udp_port);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT); 
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
 
  xpl.SendExternal = &SendUdPMessage;  // pointer to the send callback
  xpl.AfterParseAction = &AfterParseAction;  // pointer to a post parsing action callback
  xpl.SetSource_P(PSTR("xpl"), PSTR("arduino"), PSTR("domotique")); // identifiant arduino sur le reseau xpl 
 
}
 
void loop()
{
  xpl.Process();  // heartbeat management
 
  int packetSize = Udp.parsePacket();
  if(packetSize)
  {
    char xPLMessageBuff[XPL_MESSAGE_BUFFER_MAX];
 
    // read the packet into packetBufffer
    Udp.read(xPLMessageBuff, XPL_MESSAGE_BUFFER_MAX);       
 
    // parse message
    xpl.ParseInputMessage(xPLMessageBuff);
 
 
    // Affichage de la commande
    //Serial.println(commandValue);
 
    // Affichage de la pin concernée
   // Serial.println(devicePin);
 
    if (commandValue == 'n')
    {
      digitalWrite(devicePin,HIGH);
    }
    else if (commandValue == 'f')
    {
      digitalWrite(devicePin,LOW);
    }
  }
 
 
//-- Photo-résistance
  // exemple envoyer un Message  toutes les 10 secondes=10000
  else if ((millis()-timerLumiere) >= 10000) 
  { 
 
    // Lecture de la valeur de la photorésistance
    int photocellReading = analogRead(photocellPin); // lit la valeur analogique sur la broche A0 (pont diviseur Photo-résistance + Résistance)
 
    //pour ne pas descendre en dessous de zero
    if (photocellReading == 0)
      photocellReading == 0;
    else
      //conversion en pourcentage
      photocellReading = min(15.665 * log(photocellReading) + 4.6691, 100);
    //(!strcmp : comparer chaine de caractères) 
 
   //if (photocellReading < 18 )
    {
      // Conversion de valeur 'int' en 'char*' (tableau de char = chaine de caractères)
      char photocellString[11];
      itoa(photocellReading, photocellString, 10);
      // Serial.println(photocellString);
 
      if (client.connect("photocell", "testuser", "testpass"))
      {
 
 
        client.publish("photocell", photocellString);
        // Lecture de valeur courante du temps
        timerLumiere = millis();
      }
    }
  }
      //-- Thermistance
      else if ((millis()-timerTemp) >= 30000) //toutes les 30 secondes=30000 1h = 3600000ms
      { 
 
        int sensorPinReading = analogRead(sensorPin);
 
        float voltage = sensorPinReading * 5.0 / 1024.0;
        float temperatureC = (voltage - 0.5) * 12.3; //conversion en degrés
 
        //Serial.print(voltage); 
        //Serial.println(" volts"); //On écrit le voltage
        //Serial.print(temperatureC); 
        // Serial.println(" degrees C");
 
        char temperatureCString[5];
        //Conversion de valeur 'float' en 'char*' (tableau de char = chaine de caractères)
        dtostrf(temperatureC, 4, 1, temperatureCString);//le (4) quatre valeur total deux chiffres une virgule un chiffre le (1) un chiffre après la virgule
 
        xPL_Message msgtemp;
        msgtemp.hop = 1;
        msgtemp.type = XPL_TRIG;
        msgtemp.SetTarget_P(PSTR("*"));
        msgtemp.SetSchema_P(PSTR("sensor"), PSTR("basic"));
        msgtemp.AddCommand_P(PSTR("device"),PSTR("1"));
        msgtemp.AddCommand_P(PSTR("type"),PSTR("temp"));
        msgtemp.AddCommand("current",temperatureCString); //-- Création du message XPL 
        xpl.SendMessage(&msgtemp);     
 
        // Lecture de valeur courante du temps
        timerTemp = millis();
      }
    }
 
 
 
 
 
 
 
 
Last Edit: 06 Jan 2016 14:59 by gromain. Reason: quote -> code
The administrator has disabled public write access.

améliorer mon script 06 Jan 2016 15:45 #2

salut,

ce n'est pas évident de t'aider à améliorer ton script, ne sachant pas trop ce qu'il fait.

J'ai regardé le lien wiseflat, j'avoue que je ne connaissais pas. Compatible xPL en plus, c'est sympa.
J'ai pas tout saisi l'histoire de MQTT, faut que je creuse un peu. Tu sais m'en dire plus dans le contexte de l'arduino et wiseflat ?

Sinon, pas grand chose à dire sur ton script à première vue, à part que le type boolean bof sur un 8 bit. Ça consomme autant qu'un byte.

Romain
  • gromain
  • Avatar 2013 01 07
  • OFFLINE
  • Administrateur
  • Administrateur
  • Posts: 153
  • Thank you received: 10
  • Karma: 3
The administrator has disabled public write access.

améliorer mon script 10 Jan 2016 10:32 #3

salut


pour la partie réception de l'arduino

mon script me commande une plaque 4 relais

les commandes xpl sont envoyées sur le reseau par wiseflat

la j'ais une contrainte

le script doit être compatible si le message xpl est parser device= command=

ou command= device=






Tu sais m'en dire plus dans le contexte de l'arduino et wiseflat ?

avec arduino le schéma lighting.basic il n'y a pas grands choses a dire

une fois wt4 installé tu envois les commandes

xpl-sender -m xpl-cmnd -c lighting.basic command=on device=8

xpl-sender -m xpl-cmnd -c lighting.basic command=off device=8

puis dans l'ihm tu les actives et voila

pour wiseflat 5 il est en cour de developpement intégralement en javascript

Plus de base de données

compatible avec le schéma lighting.basic chez moi
J'ai pas tout saisi l'histoire de MQTT

mqtt me sert de passerelle entre mon arduino et mon raspberry

pour commander un module chacon DI-O en 433 mhz

arduino recupere les données d'une photorésistance en A0

et les envois sur le raspberry a un topic qui démarre a 17h15

quand 18 pourcent arrive sur le topic le raspbery

envoi une commande via un emetteur 433 puis kill le topic
Last Edit: 10 Jan 2016 13:11 by jeanphilippe.
The administrator has disabled public write access.
Backtotop