Вот мой последний экспериментальный вариант. 18b20 пять штук + DH11 на контроллер Arduino UNO. Все прекрасно работает с MD.
спасибо за идеи!
/*
При изменении значения датчика, контроллер отправляет по ethernet-сети HTTP-запрос на сервер,
где установлена система MajorDoMo.
*/
#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "DHT.h"
// -------------------------------
// NETS
byte mac[] = {0x00,0x2A,0xF6,0x12,0x68,0xAE};
byte ip[] = {192,168,0,5};
byte subnet[] = {255,255,255,0};
byte gateway[] = {192,168,0,1};
byte dns_server[] = {192,168,0,1};
byte remoteIP[] = {192,168,0,2};
int remotePort=80;
EthernetClient EK; // objekts
// -------------------------------
// SENSORI
// DallasTemperature
#define ONE_WIRE_BUS 2 // Digital 2 pin Arduino (куда подключен выход с шины датчиков DS18X20
#define TEMPERATURE_PRECISION 9
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DT(&oneWire); // objekts
// Настройка датчиков температуры (адреса удобно определять программой из примера DallasTemperature/Mulriple)
//Device 0 Address: 1060CF59010800E3 // piemers
//DeviceAddress Termometer1 = {0x28, 0xD6, 0xA6, 0x3D, 0x06, 0x00, 0x00, 0xC3}; // Ariela sens
//DeviceAddress Termometer2 = {0x28, 0x1F, 0x46, 0x3F, 0x06, 0x00, 0x00, 0x17}; // Ariela sens
DeviceAddress Termometers; // Для поиска
int numberOfDevices; // OneWire
String aa[30]; // Массив с HEX-адресами датчиков температуры DS18B20
float tempC;
//int old_temperature1=0;
//int old_temperature2=0;
// DHT
#define DHTPIN 3 // what pin we're connected to
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
//
char buf[80];
char ipbuff[16];
char ripbuff[16];
// taimeris
unsigned long tPrev;
unsigned long tInterval = 60000;
// Setup
void setup()
{
// SERIAL
Serial.begin(9600); // Скорость консольного порта 115200 (пригодится для отладки)
//
Serial.println("[SETUP]");
Serial.println();
Serial.println("Temperaturas tiek nolasitas x1/60sek");
// ETHERNET
Serial.println("Ethernet:");
Ethernet.begin(mac, ip, dns_server, gateway, subnet);
// give the ethernet module time to boot up:
//delay(2000);
for (int i=0; i<4; i++)
{
Serial.print(".");
delay(500);
}
/*
if (Ethernet.begin(mac) == 0)
{
Serial.println("Failed to configure Ethernet using DHCP");
// no point in carrying on, so do nothing forevermore:
// try to congifure using IP address instead of DHCP:
Ethernet.begin(mac, ip, dns_server, gateway, subnet);
}
*/
Serial.print(" IP = ");
Serial.println(Ethernet.localIP());
Serial.println();
// DallasTemperature
feja_mekletIerices();
Serial.println();
// DHT
dht.begin();
//
Serial.println("[AIZIET]");
Serial.println();
}
// AIZIET
void loop()
{
// DT
unsigned long tNow = millis();
if (tNow - tPrev > tInterval)
{
tPrev = tNow;
// requestTemperatures
DT.requestTemperatures(); // Перед каждым получением температуры надо ее запросить
int valid_sensor=0; // !?
delay(1000);
for(int i=0; i < numberOfDevices; i++)
{
// // TEMP SENSOR 1
float current_temp;
// getTempC / getTempCByIndex
//tempC = DT.getTempC(Termometer1); // Получим температуру от датчика (или ошибку)
tempC = DT.getTempCByIndex(i); // Получим температуру от датчика (или ошибку)
//
if (tempC == DEVICE_DISCONNECTED_C)
{
// Устройство отсоеденнено
Serial.println("Termometer1 is DEVICE_DISCONNECTED_C");
// TODO Послать бы на сервер сигнал о том, что датчит не отвечает
}
else
{
// Устройство отдало реальное значение температуры (или осталось старое)
current_temp = tempC; // получаем температуру
// Tn=n.n
Serial.print("T #"); Serial.print(i); Serial.print(" = "); Serial.print(current_temp); Serial.println("C");
//if ((old_temperature1!=(int)current_temp) && (current_temp<79) && (current_temp>5))
if (1==1)
{
int temp1 = (current_temp - (int)current_temp) * 100; // выделяем дробную часть
//sprintf(buf, "GET /objects/?object=objGKTS&op=m&m=tempChanged&t=%0d.%d", (int)current_temp, abs(temp1));
//sprintf(buf, "GET /objects/?object=sensorKotel&op=m&m=tempChanged&t=%0d.%d", (int)current_temp, abs(temp1));
//sprintf(buf, "GET /_arduCl/index.php?object=sensorKotel&op=m&m=tempChanged&t=%0d.%d", (int)current_temp, abs(temp1));
// v2
int str_len = aa
.length() + 1; char char_array[str_len]; aa.toCharArray(char_array, str_len); // Конвертируем строку с адресом в массив символов
sprintf(buf, "GET /objects/?object=%s&op=m&m=tempChanged&t=%0d.%d", char_array, (int)current_temp, abs(temp1)); // Формируем GET запрос
Serial.println(buf);
feja_httpRequest();
}
//old_temperature1=(int)current_temp;
}
// end TEMP SENSOR 1
}
/* // TEMP SENSOR 2
float current_temp2=0;
tempC = DT.getTempC(Termometer2); // Получим температуру от датчика (или ошибку)
//
if (tempC == DEVICE_DISCONNECTED_C)
{
// Устройство отсоеденнено
Serial.println("Termometer2 is DEVICE_DISCONNECTED_C");
// TODO Послать бы на сервер сигнал о том, что датчит не отвечает
}
else
{
// Устройство отдало реальное значение температуры (или осталось старое)
current_temp2 = tempC; // получаем температуру
Serial.print("T2=");
Serial.println(current_temp2);
//if ((old_temperature2!=(int)current_temp2) && (current_temp2<79) && (current_temp2>5))
if ((current_temp2<79) && (current_temp2>5))
{
int temp2 = (current_temp2 - (int)current_temp2) * 100; // выделяем дробную часть
sprintf(buf, "GET /objects/?object=objTS2&op=m&m=tempChanged&t=%0d.%d", (int)current_temp2, abs(temp2));
feja_httpRequest();
}
//
old_temperature2=(int)current_temp2;
}
*/
// DHT
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
float t = dht.readTemperature();
// check if returns are valid, if they are NaN (not a number) then something went wrong!
if (isnan(t) || isnan(h))
{
Serial.println("Failed to read from DHT");
}
else
{
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C");
int h2 = (h - (int)h) * 100; // выделяем дробную часть
sprintf(buf, "GET /objects/?object=DHT1_h&op=m&m=humChanged&h=%0d.%d", (int)h, abs(h2));
feja_httpRequest();
int t2 = (t - (int)t) * 100; // выделяем дробную часть
sprintf(buf, "GET /objects/?object=DHT1_t&op=m&m=tempChanged&t=%0d.%d", (int)t, abs(t2));
feja_httpRequest();
}
// end DHT
}
}
//
void feja_mekletIerices()
{
// begin
DT.begin(); // initialise bus 1-wire (temp. sensori)
// setResolution 9, 10, 11, 12 bit
DT.setResolution(TEMPERATURE_PRECISION); // visiem
//DT.setResolution(Termometer1, TEMPERATURE_PRECISION); // vienam no
Serial.println("DallasTemperature:");
// getDeviceCount
numberOfDevices = DT.getDeviceCount();
Serial.print("Deveju skaits = "); Serial.println(numberOfDevices, DEC);
// isParasitePowerMode
Serial.print("ParasitePowerMode = ");
if (DT.isParasitePowerMode()) {
Serial.println("ON");
}
else {
Serial.println("OFF");
}
// requestTemperatures
DT.requestTemperatures();
Serial.println("DallasTemperature -> meklejam ierices:");
for(int i=0; i < numberOfDevices; i++)
{
// getAddress
if(DT.getAddress(Termometers, i))
{
// v1
//Serial.print("Sensors "); Serial.print(i, DEC); Serial.print(" / Adr = ");
// v2
String aba[8]; // Создаем массив с байтами адреса
for (uint8_t i=0; i<8; i++)
{
//если бит меньше 16, то дописываем в начале 0, так же конвертируем в шеснадцатиричный код
if (Termometers<16)
{
//Serial.print("0");
aba = "0"+String(Termometers, HEX);
}
else // в противном случае просто конвертируем в 16ричный код и записываем байт в массив
{
aba = String(Termometers, HEX);
}
//Serial.print(Termometers, HEX);
}
aa = aba[0]+aba[1]+aba[2]+aba[3]+aba[4]+aba[5]+aba[6]+aba[7]; // Записываем полный адрес в массив адресов aa[], в ячейку i.
//
Serial.print("Sensors #"); Serial.print(i, DEC); Serial.print(" Adr = "); Serial.print(aa); // Выводим на экран i ячейку с 16-ричным адресом устройства
// v1
// getResolution
Serial.print(" / Resolution = "); Serial.print(DT.getResolution(Termometers), DEC); Serial.print(" / TempC = ");
// getTempC
//float tempC = DT.getTempC(Termometers);
Serial.print(DT.getTempC(Termometers)); Serial.println("C");
}
else
{
Serial.print("NOT FOUND");
}
}
}
//
void feja_httpRequest()
{
Serial.print("Ethernet -> Savienojamies ar ");
sprintf(ripbuff, "%u.%u.%u.%u", remoteIP[0], remoteIP[1], remoteIP[2], remoteIP[3]);
Serial.print(ripbuff);
Serial.print(":");
Serial.print(remotePort);
// if there's a successful connection:
if (EK.connect(remoteIP, remotePort))
{
Serial.print(" ");
//Serial.print("httpRequest: ");
Serial.println(buf);
//Serial.println();
// send the HTTP request:
// piemers EK.println("GET /_arduCl/index.php?t1 HTTP/1.1"); // wamp
// piemers EK.println("Host: 192.168.2.102");
// GET
EK.print(buf);
EK.println(" HTTP/1.1");
// Host
EK.print("Host: ");
sprintf(ipbuff, "%u.%u.%u.%u", ip[0], ip[1], ip[2], ip[3]);
EK.println(ipbuff); // ip адрес нашего контроллера в текстовом виде
// ...
EK.println("User-Agent: arduino-ethernet"); // Arduine Repeating Web client
EK.println("Content-Type: text/html"); //EK.print("Content-Type: text/html\n");
EK.println("Connection: close"); //EK.println("Connection: close\n");
EK.println();
//
delay(2000); // no D18B20v1 + D18B20v2
EK.stop(); // no D18B20v1 + D18B20v2
}
else
{
// if you couldn't make a connection:
Serial.println(" ");
EK.stop(); // Arduine Repeating Web client
}
}
Windows7 + MajorDoMo.
HP laptop, MegaD modules, Arduino Megas, DS18B20, DHT-11 and other sensors.
DSC Alarm + envisalink 3
Connect