Rev 37 | Blame | Compare with Previous | Last modification | View Log | Download
#include <TimedAction.h>void ta_DS18B20temperature();TimedAction readDS18 = TimedAction(2500,ta_DS18B20temperature);// Include the libraries we need#include <OneWire.h>#include <DallasTemperature.h>// Define serial debugging: _SER_DEBUG is debugging on#define _SER_DEBUG// Modbus Registers Offsets (0-9999)const int OFFSET_HREG = 0;// Ethernet shield ENC28J60//#include <EtherCard.h>#include <Modbus.h>#include <ModbusIP_ENC28J60.h>// ModbusIP objectModbusIP mb(2502);struct ds18_sensor {// Data wire is plugged into port 2 on the Arduinobyte one_wire_bus = 3;int resolution = 12; //resolution = 0.0625int index = 0; //sensor index// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)//OneWire oneWire(one_wire_bus);OneWire *oneWire;// Pass our oneWire reference to Dallas Temperature.//DallasTemperature sensors(&oneWire);DallasTemperature *sensors;float temperature_celsius = 0.0;};ds18_sensor ds18;/** The setup function. We only start the sensors here*/void setup(void){// start serial port#ifdef _SER_DEBUGSerial.begin(9600);//Serial.println("Dallas Temperature IC Control Library Demo");#endif// The media access control (ethernet hardware) address for the shieldbyte mac[] = { 0x52, 0x4c, 0x44, 0x6b, 0x30, 0x40 };// The IP address for the shieldbyte ip[] = { 192, 168, 2, 177 };//Config Modbus IPmb.config( mac, ip);// Add OFFSET_HREG register - Use addHreg() for Holding registersmb.addHreg( OFFSET_HREG); // temperature short * 10 valuemb.addHreg( OFFSET_HREG + 1); // temperature short * 100 valuemb.addHreg( OFFSET_HREG + 2); // level sensor short * 10 valuemb.addHreg( OFFSET_HREG + 3); // level sensor short * 100 valuemb.addHreg( OFFSET_HREG + 4); // flow sensor short * 10 valuemb.addHreg( OFFSET_HREG + 5); // fl sensor short * 100 valuemb.addHreg( OFFSET_HREG + 6); // flow sensor ntc short * 10 valuemb.addHreg( OFFSET_HREG + 7); // fl sensor ntc short * 100 value// Start up the onewire libraryOneWire oneWire(int(ds18.one_wire_bus));ds18.oneWire = &oneWire;DallasTemperature sensors(&oneWire);ds18.sensors = &sensors;ds18.sensors->begin();ds18.sensors->setResolution(ds18.resolution);}/** Main function, get and show the temperature*/void loop(void){readDS18.check();// write ds18 temperature * 10 as short in one holding registermb.Hreg( OFFSET_HREG, (int)(ds18.temperature_celsius * 10.0));mb.Hreg( OFFSET_HREG + 1, (int)(ds18.temperature_celsius * 100.0));mb.task();}void ta_DS18B20temperature() {// call sensors.requestTemperatures() to issue a global temperature// request to all devices on the busds18.sensors->requestTemperatures(); // Send the command to get temperatures// We use the function ByIndex, and as an example get the temperature from the first sensor only.ds18.temperature_celsius = ds18.sensors->getTempCByIndex(ds18.index);#ifdef _SER_DEBUGif(ds18.temperature_celsius == DEVICE_DISCONNECTED_C) {Serial.print("Error Could not read temperature data ");}Serial.print("Temperature:");Serial.println(ds18.temperature_celsius);#endif}