Только начал осваивать majordomo. Автору респект!)
Собран из кусков кода с просторов сайта\форума\интернета. Уже часов пять работает и сильно радует)))
Собственно скетч ардуинки.
Код: Выделить всё
/**
* Контроллер-сборщик данных (к проекту http://smartliving.ru/)
* Platform: Arduino UNO R3 + EthernetShield W5100
* IDE: Arduino 1.0.1
* Подключение датчиков температуры DS18x20 по схеме с нормальным питанием (пример http://sourceforge.net/apps/trac/arduios/wiki/owmon)
* данные (зеленый провод со схемы по ссылке указанной выше) подключаем на D2
* ВНИМАНИЕ! Для того чтобы у Вас заработало получение данных с детчиков температуры, нужно прописать адреса ваших датчиков (ниже по коду)
*
**/
#include <Ethernet.h>
#include <SPI.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <math.h>
// MAC-адрес нашего устройства
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 120 }; //ip ардуинки
byte subnet[] = { 255, 255, 255, 0 };
byte gateway[] = { 192, 168, 0, 1 }; //роутер каторый дает интернет
byte dns_server[] = { 192, 168, 1, 1 };
// ip-адрес удалённого сервера
byte server[] = { 192, 168, 0, 104 }; //ip сервера где стоит majordomo
EthernetClient rclient;
// Pin controller for connection data pin DS18S20
#define ONE_WIRE_BUS 2 // Digital 2 pin Arduino (куда подключен выход с шины датчиков DS18X20
#define TEMPERATURE_PRECISION 9
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// Настройка датчиков температуры (адреса удобно определять программой из примера DallasTemperature/Mulriple)
//Device 0 Address: 28 2D 39 7A 6 0 0 F7
//Device 1 Address: 28 BD 2C 7B 6 0 0 67
// Датчик температуры на (котел он же гараж)
DeviceAddress Termometer1 = { 0x28, 0x2D, 0x39, 0x7A, 0x6, 0x0, 0x0, 0xF7 };
// Датчик температуры на (пока не использую)
DeviceAddress Termometer2 = { 0x28, 0xBD, 0x2C, 0x7D, 0x6, 0x0, 0x0, 0x67 };
// Для поиска
DeviceAddress Termometers;
// Инициализация начальных значений
int echoPin = 9; // пины дальномера
int trigPin = 8;
float tempC;
int old_temperature1=0;
int old_temperature2=0;
int old_dist=0;
int statusL =0; // переменная для отображения литров
char buf[80];
char ipbuff[16];
// ------------------------------------------------------------------------------------------------
// Функция отправки HTTP-запроса на сервер
void sendHTTPRequest() {
Serial.println(buf);
if (rclient.connect(server, 80)) {
Serial.println("OK");
rclient.print(buf);
rclient.println(" HTTP/1.0");
rclient.print("Host: ");
sprintf(ipbuff, "%u.%u.%u.%u", ip[0], ip[1], ip[2], ip[3]);
rclient.println(ipbuff); // ip адрес нашего контроллера в текстовом виде
rclient.print("Content-Type: text/html\n");
rclient.println("Connection: close\n");
delay(2000);
rclient.stop();
} else {
Serial.println("FAILED");
}
}
/**************************************************************************************************
*/
void searchDevices() {
int numberOfDevices = sensors.getDeviceCount();
sensors.begin();
sensors.requestTemperatures();
for(int i=0;i<numberOfDevices; i++) {
if(sensors.getAddress(Termometers, i))
{
Serial.print("Found device ");
Serial.print(i, DEC);
Serial.print(" with address: ");
for (uint8_t i = 0; i < 8; i++) {
if (Termometers[i] < 16) Serial.print("0");
Serial.print(Termometers[i], HEX);
}
Serial.print("Resolution actually set to: ");
Serial.print(sensors.getResolution(Termometers), DEC);
Serial.println();
float tempC = sensors.getTempC(Termometers);
Serial.print(tempC);
Serial.println("C");
} else {
// not found
}
}
}
/**************************************************************************************************
*/
// ------------------------------------------------------------------------------------------------
void setup()
{
// Для дебага будем выводить отладочные сообщения в консоль
Serial.begin(9600);
Serial.println("Start");
pinMode(trigPin, OUTPUT); //инициализация пинов дальномера
pinMode(echoPin, INPUT);
// Настройки 1-wire
sensors.begin(); // Инициализация шины 1-wire (для датчиков температуры)
// Определим сколько датчиков на шине
Serial.print("1-wire: found ");
Serial.print(sensors.getDeviceCount(), DEC);
Serial.print(" devices.");
Serial.print(" Parasite power is: ");
if (sensors.isParasitePowerMode()) Serial.println("ON");
else Serial.println("OFF");
searchDevices();
/*
if (sensors.validAddress(r1) == true) {
Serial.println("Address is VALID");
if (sensors.isConnected(Termometer1) == true) {
Serial.println("Termometer1 isConnected");
sensors.setResolution(Termometer1, TEMPERATURE_PRECISION);
sensors.setResolution(Termometer2, TEMPERATURE_PRECISION);
} else {
Serial.println("Termometer1 isConnected=false");
}
}
*/
Ethernet.begin(mac, ip, dns_server, gateway, subnet); // Инициализируем Ethernet Shield
}
// ------------------------------------------------------------------------------------------------
void loop()
{
// Перед каждым получением температуры надо ее запросить
sensors.requestTemperatures();
int valid_sensor=0;
delay(1000); // задержка в 1 сек.
// TEMP SENSOR 1 --------------------------------------
float current_temp1=0;
tempC = sensors.getTempC(Termometer1); // Получим температуру от датчика (или ошибку)
{
// Устройство отдало реальное значение температуры (или осталось старое)
Serial.print("T1: ");
current_temp1 = tempC; // получаем температуру
Serial.println(current_temp1);
if ((old_temperature1!=(int)current_temp1) && (current_temp1<79) && (current_temp1>5)) {
int temp1 = (current_temp1 - (int)current_temp1) * 100; // выделяем дробную часть
sprintf(buf, "GET /objects/?object=sensorKotel&op=m&m=tempChanged&t=%0d.%d", (int)current_temp1, abs(temp1));
sendHTTPRequest();
}
old_temperature1=(int)current_temp1;
}
// TEMP SENSOR 2 --------------------------------------
float current_temp2=0;
tempC = sensors.getTempC(Termometer2); // Получим температуру от датчика (или ошибку)
{
// Устройство отдало реальное значение температуры (или осталось старое)
Serial.print("T2: ");
current_temp2 = tempC; // получаем температуру
Serial.println(current_temp2);
if ((old_temperature2!=(int)current_temp2) && (current_temp2<50) && (current_temp2>5)) {
int temp1 = (current_temp2 - (int)current_temp2) * 100; // выделяем дробную часть
sprintf(buf, "GET /objects/?object=sensorZal&op=m&m=tempChanged&t=%0d.%d", (int)current_temp2, abs(temp1));
sendHTTPRequest();
}
old_temperature2=(int)current_temp2;
}
int duration, cm; // получение сантиметров от дальномера
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
cm = duration / 58;
statusL = ((107-cm)*80*120) / 100; // привожу см в литры
statusL = statusL / 10; //тоже действо
Serial.print(statusL);
Serial.println(" L");
int current_dist=statusL;
//Serial.println(current_dist);
if ((old_dist!=(int)current_dist)) {
old_dist=(int)current_dist;
sprintf(buf, "GET /objects/?object=sensorDist&op=m&m=statusChanged&status=%i", (int)current_dist);
sendHTTPRequest();
}
}
авторство не мое. чуть только добавил
кстати температурный сенсор тоже задействован - контролирует температуру что бы не замерзло(случай был).
Еще из удобного к ардуинке не пришлось тянуть lan кабель. был найден в закромах карманный роутер tp-link mr3040(спалил у него дату usb(честно уже и не помню как)) настроил его в мост со своим основным роутером и воткнул в него ардуину с изернет шилдом и питание ардуины от него же(он с батарейкой).
Обязательно пост добавлю разным(сильно не пинайте это мой первый пост)))