Subversion Repositories Arduino.arduino

Rev

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 object
ModbusIP mb(2502);

struct ds18_sensor {
  // Data wire is plugged into port 2 on the Arduino
  byte one_wire_bus = 3;

  int resolution = 12; //resolution = 0.0625
  int 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_DEBUG
  Serial.begin(9600);
  //Serial.println("Dallas Temperature IC Control Library Demo");
  #endif
  
  // The media access control (ethernet hardware) address for the shield
  byte mac[] = { 0x52, 0x4c, 0x44, 0x6b, 0x30, 0x40 };
  // The IP address for the shield
  byte ip[] = { 192, 168, 2, 177 };

  //Config Modbus IP
  mb.config( mac, ip);

  // Add OFFSET_HREG register - Use addHreg() for Holding registers
  mb.addHreg( OFFSET_HREG);     // temperature short * 10 value
  mb.addHreg( OFFSET_HREG + 1); // temperature short * 100 value
  mb.addHreg( OFFSET_HREG + 2); // level sensor short * 10 value
  mb.addHreg( OFFSET_HREG + 3); // level sensor short * 100 value
  mb.addHreg( OFFSET_HREG + 4); // flow sensor short * 10 value
  mb.addHreg( OFFSET_HREG + 5); // fl sensor short * 100 value
  mb.addHreg( OFFSET_HREG + 6); // flow sensor ntc short * 10 value
  mb.addHreg( OFFSET_HREG + 7); // fl sensor ntc short * 100 value

  // Start up the onewire library
  OneWire 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 register
  mb.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 bus
  ds18.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_DEBUG
  if(ds18.temperature_celsius == DEVICE_DISCONNECTED_C) {
    Serial.print("Error Could not read temperature data ");
  }
  Serial.print("Temperature:");
  Serial.println(ds18.temperature_celsius);
  #endif
}