(Умер через 35 мес. работы, установлен второй)Датчик объема воды в емкости(arduino, ethernet shield, sr04)

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

flair
Сообщения: 198
Зарегистрирован: Сб янв 16, 2016 12:18 am
Откуда: Минск
Благодарил (а): 16 раз
Поблагодарили: 15 раз

(Умер через 35 мес. работы, установлен второй)Датчик объема воды в емкости(arduino, ethernet shield, sr04)

Сообщение flair » Сб янв 16, 2016 12:43 am

Общий смысл поделки - У меня в доме стоит емкость для воды (на тонну воды), а у же из нее вода подается в дом по средствам насоса. Так вот вода имеет свойство заканчиваться, а для контроля уровня надо идти в гараж(именно там она и установлена), что не всегда удобно. Захотелось реализовать какую то удобную визуализацию.
Только начал осваивать 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(честно уже и не помню как)) настроил его в мост со своим основным роутером и воткнул в него ардуину с изернет шилдом и питание ардуины от него же(он с батарейкой).

Обязательно пост добавлю разным(сильно не пинайте это мой первый пост)))
Последний раз редактировалось flair Чт ноя 04, 2021 11:57 pm, всего редактировалось 7 раз.
Jager
Сообщения: 708
Зарегистрирован: Сб авг 18, 2012 10:21 am
Благодарил (а): 26 раз
Поблагодарили: 183 раза

Re: Датчик объема воды в емкости(arduino, ethernet shield, s

Сообщение Jager » Сб янв 16, 2016 9:18 am

Ethernet shield лишний в вашей связке :)
http://majordomo.smartliving.ru/Main/LinuxMiniHub
flair
Сообщения: 198
Зарегистрирован: Сб янв 16, 2016 12:18 am
Откуда: Минск
Благодарил (а): 16 раз
Поблагодарили: 15 раз

Re: Датчик объема воды в емкости(arduino, ethernet shield, s

Сообщение flair » Сб янв 16, 2016 10:48 am

Конечно сначала и планировал делать на tplinке но после старых опытов мой mr3040 крепко виснет и безбожно лагал... Настроил на нем одну конфигурацию и больше не трогаю )
smoker_vvo
Сообщения: 113
Зарегистрирован: Пт дек 14, 2012 3:46 am
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Re: Датчик объема воды в емкости(arduino, ethernet shield, s

Сообщение smoker_vvo » Чт янв 21, 2016 3:31 pm

To flair: Вопрос чисто технический, а чем уровень воды в танке измеряете?? И какие границы?? Ой вода заканчивается, Ой Вода кончилась или Воды МНОГО??
flair
Сообщения: 198
Зарегистрирован: Сб янв 16, 2016 12:18 am
Откуда: Минск
Благодарил (а): 16 раз
Поблагодарили: 15 раз

Re: Датчик объема воды в емкости(arduino, ethernet shield, s

Сообщение flair » Чт янв 21, 2016 6:20 pm

smoker_vvo писал(а):To flair: Вопрос чисто технический, а чем уровень воды в танке измеряете?? И какие границы?? Ой вода заканчивается, Ой Вода кончилась или Воды МНОГО??
Простите не очень понял вашего вопроса...
измеряется расстояние до воды.. (сонаром) , ардуина пересчитывает в объем(литры), так как геометрические размеры танка известны. а переменная выдается на главную сцену ... в свою очередь информация передается по всей системе.
аварийного уведомления пока не делал...
akouz
Сообщения: 254
Зарегистрирован: Ср июл 09, 2014 3:48 pm
Благодарил (а): 6 раз
Поблагодарили: 41 раз

Re: Датчик объема воды в емкости(arduino, ethernet shield, s

Сообщение akouz » Пт янв 22, 2016 12:43 am

flair писал(а): измеряется расстояние до воды.. (сонаром)
А сонар какой? Kитайский за два доллара, который воды боится и проржавеет через полгода?
flair
Сообщения: 198
Зарегистрирован: Сб янв 16, 2016 12:18 am
Откуда: Минск
Благодарил (а): 16 раз
Поблагодарили: 15 раз

Re: Датчик объема воды в емкости(arduino, ethernet shield, s

Сообщение flair » Пт янв 22, 2016 1:52 am

akouz писал(а):
flair писал(а): измеряется расстояние до воды.. (сонаром)
А сонар какой? Kитайский за два доллара, который воды боится и проржавеет через полгода?
за 4$)))
да китайский, отказоустойчивость покажет время... у меня медицинские приборы и пожаротушение на него не завязано... да и пока в принципе все на изоленте) по его цене можно взять жменю и менять как захочется... (хотя вода там не соленая, парения нет)
Может у Вас есть более качественное решение подобной задачи?
akouz
Сообщения: 254
Зарегистрирован: Ср июл 09, 2014 3:48 pm
Благодарил (а): 6 раз
Поблагодарили: 41 раз

Re: Датчик объема воды в емкости(arduino, ethernet shield, s

Сообщение akouz » Пт янв 22, 2016 3:49 am

flair писал(а): более качественное решение подобной задачи?
Давление воды мерять.
smoker_vvo
Сообщения: 113
Зарегистрирован: Пт дек 14, 2012 3:46 am
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Re: Датчик объема воды в емкости(arduino, ethernet shield, s

Сообщение smoker_vvo » Пт янв 22, 2016 9:16 am

Шо за сонар?? Можно фото????..... Давление чем мерять и в каком месте, на выходе из емкости?? А если емкости две, как у меня и соеденены в одну трубу??
flair
Сообщения: 198
Зарегистрирован: Сб янв 16, 2016 12:18 am
Откуда: Минск
Благодарил (а): 16 раз
Поблагодарили: 15 раз

Re: Датчик объема воды в емкости(arduino, ethernet shield, s

Сообщение flair » Пт янв 22, 2016 10:51 am

Ответить