modbus & ds18b20
- Войдите на сайт для отправки комментариев
Вс, 25/12/2016 - 11:25
#include "ModbusRtu.h"
#include <OneWire.h>
#include <DallasTemperature.h>// Инициализация библиотеки термодатчиков.
#define ID 1 // адрес ведомого
#define btnPin 2 // номер входа, подключенный к кнопке
#define stlPin 13 // номер выхода индикатора работы
// расположен на плате Arduino
#define ledPin 12 // номер выхода светодиода
#define ONE_WIRE_BUS 10// Подключение цифрового вывода датчика к 10-му пину Ардуино.
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
//Задаём ведомому адрес, последовательный порт, выход управления TX
Modbus slave(ID, 0, 0);
boolean led;
int8_t state = 0;
unsigned long tempus;
int t;
// массив данных modbus
uint16_t au16data[11];
void setup() {
// настраиваем входы и выходы
io_setup();
// настраиваем последовательный порт ведомого
slave.begin( 9600 );
// зажигаем светодиод на 100 мс
tempus = millis() + 100;
digitalWrite(stlPin, HIGH );
sensors.begin(); // Запуск сенсора.
}
void io_setup() {
digitalWrite(stlPin, HIGH );
digitalWrite(ledPin, LOW );
pinMode(stlPin, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(btnPin, INPUT);
}
void loop() {
// обработка сообщений
state = slave.poll( au16data, 11);
// если получили пакет без ошибок - зажигаем светодиод на 50 мс
if (state > 4) {
tempus = millis() + 50;
digitalWrite(stlPin, HIGH);
}
if (millis() > tempus) digitalWrite(stlPin, LOW );
//обновляем данные в регистрах Modbus и в пользовательской программе
sensors.requestTemperatures(); // Send the command to get temperatures
t=(sensors.getTempCByIndex(0)*100/2);
io_poll();
}
void io_poll() {
//Копируем Coil[1] в Discrete[0]
au16data[0] = au16data[1];
//Выводим значение регистра 1.3 на светодиод
digitalWrite( ledPin, bitRead( au16data[1], 3 ));
//Сохраняем состояние кнопки в регистр 0.3
bitWrite( au16data[0], 3, digitalRead( btnPin ));
//Сохраняем значение температуры *100
au16data[2] = t;
au16data[5]= 5000;
au16data[3] = 1;
au16data[6] = 2;
au16data[4] = au16data[7];
//Сохраняем в регистры отладочную информацию
au16data[8] = slave.getInCnt();
au16data[9] = slave.getOutCnt();
au16data[10] = slave.getErrCnt();
}
Добрый день. Помогите передать получить температуру с датчика по Modbus.