Page 1 sur 2

Posté : mar. mai 21, 2013 9:48 am
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

Posté : mar. mai 21, 2013 10:05 am
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+++

Posté : mar. mai 21, 2013 10:16 am
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

Posté : jeu. mai 23, 2013 0:14 am
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 :)

Posté : jeu. mai 23, 2013 11:02 am
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

Posté : jeu. mai 23, 2013 13:42 pm
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

Posté : jeu. mai 23, 2013 14:18 pm
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

Posté : jeu. mai 23, 2013 14:31 pm
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:

Posté : sam. mai 25, 2013 19:42 pm
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

Posté : dim. mai 26, 2013 10:20 am
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

Posté : dim. mai 26, 2013 10:27 am
par patrick07
Bonjour Moriss,

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

Posté : lun. mai 27, 2013 17:03 pm
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:

Posté : mar. mai 28, 2013 21:47 pm
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

Posté : sam. juin 01, 2013 12:59 pm
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

Posté : dim. mai 18, 2014 11:54 am
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