Arduino + 1wire + modbus : OK
Modérateurs : ramses, Balajol, monteric, j2c
-
- Etudiant Solaire
- Messages : 291
- Enregistré le : mar. juil. 13, 2010 17:48 pm
- Localisation : lyon
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
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.
-
- Etudiant Solaire
- Messages : 291
- Enregistré le : mar. juil. 13, 2010 17:48 pm
- Localisation : lyon
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 :)
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.
- jean-yves 25
- Etudiant Solaire
- Messages : 233
- Enregistré le : dim. nov. 09, 2008 13:17 pm
- Localisation : Ornans (25290)
-
- Etudiant Solaire
- Messages : 291
- Enregistré le : mar. juil. 13, 2010 17:48 pm
- Localisation : lyon
concernant le "travail" c'est tout simple :
electronique :
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);
}
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]
}
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
Modifié en dernier par moriss le jeu. mai 23, 2013 14:33 pm, modifié 1 fois.
- jean-yves 25
- Etudiant Solaire
- Messages : 233
- Enregistré le : dim. nov. 09, 2008 13:17 pm
- Localisation : Ornans (25290)
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à
Slts
Jean-Yves 25
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à
Slts
Jean-Yves 25
4 panneaux 18 tubes Kamax
1 ballon mixte 600/170 litres
1 ballon mixte 600/170 litres
-
- Etudiant Solaire
- Messages : 291
- Enregistré le : mar. juil. 13, 2010 17:48 pm
- Localisation : lyon
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é
je pense testé ce schéma
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é
je pense testé ce schéma
- panMillenium
- Stagiaire Solaire
- Messages : 67
- Enregistré le : mar. mars 12, 2013 8:54 am
- Localisation : France isere (38)
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
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
- jean-yves 25
- Etudiant Solaire
- Messages : 233
- Enregistré le : dim. nov. 09, 2008 13:17 pm
- Localisation : Ornans (25290)
-
- Newbie
- Messages : 1
- Enregistré le : lun. juil. 23, 2007 22:05 pm
- Localisation : Beauzelle (31)
- Contact :
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
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 - skype : mr.domotics
Magazine et Forum : http://www.touteladomotique.com
Boutique : http://laboutiquededomotique.com