Arduino + 1wire + modbus : OK

Modérateurs: monteric, ramses, Balajol

Messagepar moriss » Mar Mai 21, 2013 9:48 am

Salut à tous

Ne trouvant pas de quoi faire facilement du 1wire sur nos réguls, j'ai donc essayer de trouver un petit bout de code.

Material :
Arduino mega mais un bcp plus petit peu convenir
shield ethernet
du 1 wire

Resultat :
ça marche

J'arrive donc à créer un registre modbus, coller dedans les valeurs des sondes 1wire

Pour l'instant j'ai testé avec logisdom, aucun soucis, reconnu du 1er coup


Point à améliorer / à faire :
- tester sous smartapp (mais si le modbus est standard ça doit pas poser de soucis)
- changer le type de donner, j'obtiens que des températures entières (pas de virgule)
- intégrer toute la téléinfo : attente des optocoupleurs sf620
- Améliorer le code (faut toujours améliorer le code)
- tout à la fin, tester sur les arduino ethernet en natif
- encore plus à la fin, pourquoi pas essayer de stocker sur le port SD

A bientot
Modifié en dernier par moriss le Jeu Mai 23, 2013 11:06 am, modifié 3 fois.

moriss
Etudiant Solaire
Etudiant Solaire
 
Messages: 291
Enregistré le: Mar Juil 13, 2010 17:48 pm
Localisation: lyon

Messagepar Samounet » Mar Mai 21, 2013 10:05 am

Bonjour moriss,

Intéressant, c'est l'idée que tu avais en réupérant le bout de code de PanMillenium (la personne) ?

A ce sujet, tu penses qu'on pourrait l'adapter au PanMillenium (l'objet) justement ?

A+++
Avatar de l’utilisateur
Samounet
Expert Solaire
Expert Solaire
 
Messages: 615
Enregistré le: Sam Aoû 02, 2008 18:38 pm
Localisation: Saint Caprais (32)

Messagepar moriss » Mar Mai 21, 2013 10:16 am

salut,
oui tout à fait.
J'avais demandé le bout de code du modbus il me semble

mais en fait c'est beaucoup plus simple.

Pour l'intégration aux PanMillenium, quand je vois le niveau de PanMillenium je me dis que ça doit pas être compliqué pour lui

moriss
Etudiant Solaire
Etudiant Solaire
 
Messages: 291
Enregistré le: Mar Juil 13, 2010 17:48 pm
Localisation: lyon

Messagepar moriss » Jeu Mai 23, 2013 0:14 am

Bon, sous smartapp pour l'instant ça ne marche pas

vais demander à pasquall ou je me suis trompé
pourtant la comm en modbus fonctionne avec logisdom ou des freeware modbus client

EDIT : ok pour les chiffres à virgules
J'obtiens donc du 1 wire avec une définition sur 12bits :)
Modifié en dernier par moriss le Jeu Mai 23, 2013 9:44 am, modifié 1 fois.

moriss
Etudiant Solaire
Etudiant Solaire
 
Messages: 291
Enregistré le: Mar Juil 13, 2010 17:48 pm
Localisation: lyon

Messagepar moriss » Jeu Mai 23, 2013 11:02 am

Voila, merci à pasquall, je faisais une erreur dans smartapp

mon petit montage permet donc de voir la température aussi dans smartapp, et meme dans les 2 softs en même temps

moriss
Etudiant Solaire
Etudiant Solaire
 
Messages: 291
Enregistré le: Mar Juil 13, 2010 17:48 pm
Localisation: lyon

Messagepar jean-yves 25 » Jeu Mai 23, 2013 13:42 pm

Salut Moriss,

Ton système m'intéresse beaucoup mais je n'y connais rien en arduino, alors je compte sur toi pour nous donner un max d'information.

Je sais, je pousse le bouchon un p'tit peu trop loin moriss :lol: :lol: :lol:

Slts
Jean-Yves 25
4 panneaux 18 tubes Kamax
1 ballon mixte 600/170 litres
Avatar de l’utilisateur
jean-yves 25
Etudiant Solaire
Etudiant Solaire
 
Messages: 232
Enregistré le: Dim Nov 09, 2008 13:17 pm
Localisation: Ornans (25290)

Messagepar Samounet » Jeu Mai 23, 2013 14:18 pm

[quote="jean-yves 25"]Je sais, je pousse le bouchon un p'tit peu trop loin moriss :lol: :lol: :lol:
[/quote]

bieeeen ! :-D
Avatar de l’utilisateur
Samounet
Expert Solaire
Expert Solaire
 
Messages: 615
Enregistré le: Sam Aoû 02, 2008 18:38 pm
Localisation: Saint Caprais (32)

Messagepar moriss » Jeu Mai 23, 2013 14:31 pm

:cool:

concernant le "travail" :roll: c'est tout simple :

electronique :
Image

le prog :
Code: Tout sélectionner
#include <OneWire>

// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library

OneWire  ds(2);  // on pin 2 (a 4.7K resistor is necessary)

void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
 
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
 
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
 
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
 
  present = ds.reset();
  ds.select(addr);   
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");
  Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");
  delay(2000);
}


pour le modbus

Code: Tout sélectionner
#include <SPI>
#include <Ethernet>

#include "Mudbus.h"

Mudbus Mb;
//Function codes 1(read coils), 3(read registers), 5(write coil), 6(write register)
//signed int Mb.R[0 to 125] and bool Mb.C[0 to 128] MB_N_R MB_N_C
//Port 502 (defined in Mudbus.h) MB_PORT

void setup()
{
  uint8_t mac[]     = { xxx };
  uint8_t ip[]      = { xxx };
  uint8_t gateway[] = {xxx };
  uint8_t subnet[]  = { 255, 255, 255, 0 };
  Ethernet.begin(mac, ip, gateway, subnet);
  //Avoid pins 4,10,11,12,13 when using ethernet shield

  delay(5000);
  Serial.begin(9600);
 
  pinMode(7, INPUT);
  pinMode(8, OUTPUT);
}

void loop()
{
  Mb.Run();
 
  //Analog inputs 0-1023
  //Mb.R[0] = analogRead(A0); //pin A0 to Mb.R[0]
  Mb.R[0] = analogRead(A0)
  Mb.R[1] = analogRead(A1)
  Mb.R[2] = analogRead(A2);
  Mb.R[3] = analogRead(A3);
  Mb.R[4] = analogRead(A4);
  Mb.R[5] = analogRead(A5);

  //Analog outputs 0-255
  analogWrite(6, Mb.R[6]); //pin ~6 from Mb.R[6]

  //Digital inputs
  Mb.C[7] = digitalRead(7); //pin 7 to Mb.C[7]

  //Digital outputs
  digitalWrite(8, Mb.C[8]); //pin 8 from Mb.C[8]
}


on mélange tout ça, et ça roule :)

maintenant j'attends les optocoupleurs pour la téléinfo, et du coup je pense aussi que l'arduino peut servir d'intermédiaire entre 2 esclaves, vais cogiter ça :roll:
Modifié en dernier par moriss le Jeu Mai 23, 2013 14:33 pm, modifié 1 fois.

moriss
Etudiant Solaire
Etudiant Solaire
 
Messages: 291
Enregistré le: Mar Juil 13, 2010 17:48 pm
Localisation: lyon

Messagepar jean-yves 25 » Sam Mai 25, 2013 19:42 pm

Bonjour Moriss,

faut-il taper tout le code que tu as mis en ligne ou est-ce que tu peux mettre ce programme en ligne pour l'injecter directement dans l'arduino.

Je viens de commander le shield ethernet. Je dois te dire que je ne connais pas encore l'arduino, mais que je compte apprendre très vite et donc j'aurais beaucoup de question à te poser par la suite.

J'ai déjà une carte téléinfo sur port USB, c'est ce type de carte qu'il faut ?

Tu vois je commence déjà :roll:

Slts
Jean-Yves 25
4 panneaux 18 tubes Kamax
1 ballon mixte 600/170 litres
Avatar de l’utilisateur
jean-yves 25
Etudiant Solaire
Etudiant Solaire
 
Messages: 232
Enregistré le: Dim Nov 09, 2008 13:17 pm
Localisation: Ornans (25290)

Messagepar moriss » Dim Mai 26, 2013 10:20 am

Salut
Pas de soucis, j'essaierai de te donner un coup de main mais je suis aussi débutant ;)
Je met en ligne mon sketch dans la soirée, le codé ci-dessus sont juste mes sources trouvées sur le net
Pour la téléinfo, il te faut soit le shield téléinfo, soit te crée un petit circuit. Perso je vais passer par cette solution moins couteuse, je trouve le prix du shield teleinfo abusé

Image

je pense testé ce schéma

moriss
Etudiant Solaire
Etudiant Solaire
 
Messages: 291
Enregistré le: Mar Juil 13, 2010 17:48 pm
Localisation: lyon

Messagepar patrick07 » Dim Mai 26, 2013 10:27 am

Bonjour Moriss,

En un petit peu plus compliqué: http://forum.apper-solaire.org/viewtopic.php?t=7438
Avatar de l’utilisateur
patrick07
Maitre Solaire
Maitre Solaire
 
Messages: 1720
Enregistré le: Lun Avr 03, 2006 11:07 am
Localisation: Sud Ardèche -07- St Germain

Messagepar moriss » Lun Mai 27, 2013 17:03 pm

Merci Patrick, j'avais déjà vu ce post, mais t'inquiete pas, je ne cherche surtout pas à faire concurrence au Maxisun :D

Petite news du jour, l'arduino sait servir de passerelle :cool:
Il est capable de recevoir une trame, d'un soft, et de la donnée en lecture à un autre :cool:

moriss
Etudiant Solaire
Etudiant Solaire
 
Messages: 291
Enregistré le: Mar Juil 13, 2010 17:48 pm
Localisation: lyon

Messagepar panMillenium » Mar Mai 28, 2013 21:47 pm

excellent cette petite librairie "mudbus.h"
ca donne envie de relier un shield ethernet avec un panstamp, ou une Arduino Ethernet genre etherten, avec un chip "rf" cc1101!

pour ce qui est de brancher des capteurs 1wire sur un panstamp, pas de problem en utilisant les routines de moriss ci dessus. Cest vraiement sympa de voir cette convetgence entre tous les appareils
Avatar de l’utilisateur
panMillenium
Stagiaire Solaire
Stagiaire Solaire
 
Messages: 67
Enregistré le: Mar Mar 12, 2013 8:54 am
Localisation: France isere (38)

Messagepar jean-yves 25 » Sam Juin 01, 2013 12:59 pm

Bonjour,

Voilà, tout le matériel est reçu, il ne me reste plus qu'à me mettre au travail :-D

Slts
Jean-Yves 25
4 panneaux 18 tubes Kamax
1 ballon mixte 600/170 litres
Avatar de l’utilisateur
jean-yves 25
Etudiant Solaire
Etudiant Solaire
 
Messages: 232
Enregistré le: Dim Nov 09, 2008 13:17 pm
Localisation: Ornans (25290)

Messagepar domotics » Dim Mai 18, 2014 11:54 am

Bonjour
Je cherche des capteurs pour domotiser une serre.
Avez vous d'autres exemples de capteurs 1-wire que la température qui fonctionne avec Arduino ?
Merci pour votre aide
--
Domotics - skype : mr.domotics
Magazine et Forum : http://www.touteladomotique.com
Boutique : http://laboutiquededomotique.com

domotics
Newbie
Newbie
 
Messages: 1
Enregistré le: Lun Juil 23, 2007 22:05 pm
Localisation: Beauzelle (31)

Suivante

Retourner vers Arduino

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité