Arduino + 1wire + modbus : OK

Modérateurs : ramses, Balajol, monteric, j2c

moriss
Etudiant Solaire
Etudiant Solaire
Messages : 291
Enregistré le : mar. juil. 13, 2010 17:48 pm
Localisation : lyon

Message par moriss »

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.

Avatar du membre
Samounet
Expert Solaire
Expert Solaire
Messages : 617
Enregistré le : sam. août 02, 2008 18:38 pm
Localisation : Saint Caprais (32)

Message par Samounet »

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+++

moriss
Etudiant Solaire
Etudiant Solaire
Messages : 291
Enregistré le : mar. juil. 13, 2010 17:48 pm
Localisation : lyon

Message par moriss »

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

Message par moriss »

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

Message par moriss »

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

Avatar du membre
jean-yves 25
Etudiant Solaire
Etudiant Solaire
Messages : 233
Enregistré le : dim. nov. 09, 2008 13:17 pm
Localisation : Ornans (25290)

Message par jean-yves 25 »

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 du membre
Samounet
Expert Solaire
Expert Solaire
Messages : 617
Enregistré le : sam. août 02, 2008 18:38 pm
Localisation : Saint Caprais (32)

Message par Samounet »

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

bieeeen ! :-D

moriss
Etudiant Solaire
Etudiant Solaire
Messages : 291
Enregistré le : mar. juil. 13, 2010 17:48 pm
Localisation : lyon

Message par moriss »

: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.

Avatar du membre
jean-yves 25
Etudiant Solaire
Etudiant Solaire
Messages : 233
Enregistré le : dim. nov. 09, 2008 13:17 pm
Localisation : Ornans (25290)

Message par jean-yves 25 »

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

moriss
Etudiant Solaire
Etudiant Solaire
Messages : 291
Enregistré le : mar. juil. 13, 2010 17:48 pm
Localisation : lyon

Message par moriss »

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

Avatar du membre
patrick07
Maitre Solaire
Maitre Solaire
Messages : 1869
Enregistré le : lun. avr. 03, 2006 11:07 am
Localisation : Sud Ardèche -07- St Germain
Contact :

Message par patrick07 »

Bonjour Moriss,

En un petit peu plus compliqué: viewtopic.php?t=7438
Patrick

[url=https://ard-tek.com/index.php/forum/sujets-recents]Le forum du MaxiSun[/url]

moriss
Etudiant Solaire
Etudiant Solaire
Messages : 291
Enregistré le : mar. juil. 13, 2010 17:48 pm
Localisation : lyon

Message par moriss »

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:

Avatar du membre
panMillenium
Stagiaire Solaire
Stagiaire Solaire
Messages : 67
Enregistré le : mar. mars 12, 2013 8:54 am
Localisation : France isere (38)

Message par panMillenium »

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 du membre
jean-yves 25
Etudiant Solaire
Etudiant Solaire
Messages : 233
Enregistré le : dim. nov. 09, 2008 13:17 pm
Localisation : Ornans (25290)

Message par jean-yves 25 »

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

domotics
Newbie
Newbie
Messages : 1
Enregistré le : lun. juil. 23, 2007 22:05 pm
Localisation : Beauzelle (31)
Contact :

Message par domotics »

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

Répondre

Retourner vers « Arduino »