Прошивка для измерителя воды в баке

Kollega
Offline
Зарегистрирован: 21.02.2015

Всем Привет! Наверное уже кто-то занимался таким вопросом, буду благодарен если поделитесь.

Есть такой комплект:

1. Arduino Nano v3.0 на ATmega328

2. Ультразвуковой датчик HC-SR04

3. Символьный дисплей QC1602A

Везде есть описания для дальномера из этого комплекта. Но задача другая, нужно перепрошить под измеритель уровня воды в баке (емкость 750 литров, высота бака 2 метра).

Еще задача в том, что бак находится в плохо доступном месте, расстояние от бака до дисплея порядка 10 метров, чтобы не тащить провода, хотелось бы как-то передать данные на дисплей модулем Bluetooth HC-05.

bwn
Offline
Зарегистрирован: 25.08.2014

А питание туда тоже без проводов подадите? Да и с ультразвуком на измерении уровней жидкости вроде как не очень. Вам надо каждый сантиметр знать или хватит нескольких контрольных точек?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

в сам бак доступ есть? можно ведь и кусок пенопласта кинуть (приличного размера) и модуль заработает. если по радиоканалу то нужно 2 ардуины

дальности радиомодуля врядли хватит. можно использовать nrf24l01

но с питанием тебе действительно надо подумать

 

bwn
Offline
Зарегистрирован: 25.08.2014

jeka_tm пишет:

в сам бак доступ есть? можно ведь и кусок пенопласта кинуть (приличного размера) и модуль заработает. если по радиоканалу то нужно 2 ардуины

дальности радиомодуля врядли хватит. можно использовать nrf24l01

но с питанием тебе действительно надо подумать

 

Жека, а испарение постоянное, долго там этот модуль проживет?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

кстати да. что то я про это забыл

если поэкспериментировать мне кажется можно добиться работы подуля сквозь преграду, которая защиты от влаги

например презерватив натянутый на банку. но скорее всего надо будет подобрать расстояние от модуля до "защиты"

при расстоянии кратном длине волны теоретически образуется стоящая волна, и модуль ее не заметит и будет работать через защиту

наверно в чувствительности потеряет, но попробовать стоит

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

есть более сложный путь. использовать датчик от парктроника. он влаги не боится. герметичный

http://ru.aliexpress.com/item/New-Parking-Sensor-Car-Reverse-Back-Up-Ult...

но внутри ничего нет кроме пьезоизлучателя в алюминиевом стакане. сам разбирал

но к нему нужна схема. если бы кто нибудь срисовал с платы парктроника было бы проще

вообще должно быть вроде этого. подстройка вкручиванием и выкручиванием сердечника для подстройки на частоту излучателя

возможно для ECHO нужен усилитель

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

jeka_tm, он вроде и с платой продаётся   http://www.ebay.com/sch/i.html?_from=R40&_trksid=p2050601.m570.l1313.TR0...

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

я не видел такой набор. тем более. это вообще идеальный вариант

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

bwn правильно намекал, обычно точно не нужно знать сколько воды, а всего нужно 4 точки

нижный критический уровень

нижний нормальный

верхний нормальный

верхний критический

все

trembo
trembo аватар
Онлайн
Зарегистрирован: 08.04.2011

Нуууууу   как вам сказать....... Платка с датчиком...... без корпуса......

А вот это как при той-же цене :

ЧЕТЫРЕ тех-же самых датчика, плата в  корпусе и ещё и с дисплеем. И пищалка.  И сверло!!!!!!!!!

Диссплей работает по последовательному протоколу, недавно было его обсуждение и вроде научились читать данные.....

http://www.ebay.com/itm/Car-Rear-Reverse-Radar-System-Kit-Sound-Alert-LED-Display-4-Parking-Sensor-Black-/381068609815?pt=LH_DefaultDomain_71&hash=item58b9758917

http://www.ebay.com/itm/Car-4-Reverse-Parking-Sensor-System-Backup-Radar-LED-/150597476900?pt=AU_Car_Parts_Accessories&hash=item23104f2224&vxp=mtr

Alxxx.1
Offline
Зарегистрирован: 16.02.2015

4ре поплавка самодельных поставить лучше, на 4 уровнях. И считывать с них состояния как с кнопок, HIGH и LOW.

bwn
Offline
Зарегистрирован: 25.08.2014

Alxxx.1 пишет:

4ре поплавка самодельных поставить лучше, на 4 уровнях. И считывать с них состояния как с кнопок, HIGH и LOW.

Поставьте два обычных поплавка от дренажных насосов (они рублей 200-250) и получите те же четыре точки с гистерезисом. Если нет переливной трубы, то еще аварийный выключатель, типа микрика и груши от унитаза. Итого 4 тонких проводка или одна витая пара.

P/S пять проводов, тогда сможем аварийным снять питание с насоса минуя ардуину.

Соврал, три состояния + авария.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

поставьте на стороне бочки DS2408 и получите восемь I/O каналов всего по трем (!) проводам (включая питание), расстояние до 150 метров. 

Со стороны контроллера - только резистор подтяжки.

P.S. в качестве бонуса получаем показания t воды в баке и t на улице.

123ksn
Offline
Зарегистрирован: 24.11.2014

Рекомендую классную и простую схему измерителя уровня воды в баке отсюда http://radiokot.ru/forum/viewtopic.php?f=3&t=108460

std
Offline
Зарегистрирован: 05.01.2012

123ksn, эта ссылка - четвёртая попавшаяся мне, за 15 минут, причём 10 из них были уделены крайне важному процессу чесания волос. У окна (надеюсь, меня не сожгут, как в средние века).

Чё собсно хотелось сказать: дружище, тебя услышали. Не бесись.

vlad219i
Offline
Зарегистрирован: 05.03.2014

Kollega, есть у меня похожая железка - контроллер насоса, одна из функций в ней - отслеживание и показывание уровня воды в резервной бочке. Собственно, сам показометр-то пишется в несколько строк...

Железо как у Вас, плюс RF24L01+ прикручен для передачи уровня на расстояние и удалённого управления. Скетч могу заслать, но вырезать оттуда ненужные функции Вам придётся самому. Надо?-)

Для интересующихся - ультрасоник врезан в крышку бочки с водой, всё это безобразие стоИт в неотапливаемом подполе. Плату датчика покрыл лаком, излучатель/приёмник смотрят на зеркало воды. Работает ~год, глюков нет.

PS: да - датчик к ардуине подключен через витую пару, длина порядка 5 метров.

bwn
Offline
Зарегистрирован: 25.08.2014

vlad219i пишет:

Kollega, есть у меня похожая железка - контроллер насоса, одна из функций в ней - отслеживание и показывание уровня воды в резервной бочке. Собственно, сам показометр-то пишется в несколько строк...

Железо как у Вас, плюс RF24L01+ прикручен для передачи уровня на расстояние и удалённого управления. Скетч могу заслать, но вырезать оттуда ненужные функции Вам придётся самому. Надо?-)

Для интересующихся - ультрасоник врезан в крышку бочки с водой, всё это безобразие стоИт в неотапливаемом подполе. Плату датчика покрыл лаком, излучатель/приёмник смотрят на зеркало воды. Работает ~год, глюков нет.

PS: да - датчик к ардуине подключен через витую пару, длина порядка 5 метров.

Скинули бы фоточки и полное описание в проектах. Эта тема здесь весьма актуальна и до сих пор идет спор, будет УЗ работать или нет.

vlad219i
Offline
Зарегистрирован: 05.03.2014

Про датчик уровня воды - я несколько лет назад задавал вопрос в AVR-овском форуме, мнения разошлись. Я попробовал - у меня заработало, что тут спорить-то...

"Проект" - громко сказано. Так, этюд. :-) Извольте.

Железка контролирует уровень воды, ток потребления насосной станции, температуру в подполе. При снижении температуры, слишком низком или слишком высоком уровне воды в бочке, снижении тока потребления насоса относительно номинального (что косвенно свидетельствует о сухом ходе или затыке во входной магистрали) - отключает насос на несколько десятков секунд.

Мозг - Arduino Pro Mini 328. Обвес - датчики DS18B20, HCSR04, ACS712-20, поплавковый датчик переполнения (с герконом). Ещё - I2C-LCD 16x2, плата с силовым реле и радиомодуль nRF24L01+.

Дистанционно можно запросить уровень воды, температуру и текущий режим работы. Также дистанционно можно принудительно включить или выключить насос.

Линейный показометр на 48 градаций на символьном дисплее - моя особенная гордость. :-)

/*
 * Use HCSR04 Ultrasonic module with 16x2 LCD
 * for display current water volume in barrel
 * Use at your own risk
 */

#include <Wire.h> 
#include <LiquidCrystal_I2Cv1.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h" // для печати отчёта RF24

//#define serialenabled // раскомментировать для выдачи в порт отладочной инфы

// конфигурация железа
#define hcsr04_trigger         A0 // "Trigger" pin of HCSR04
#define hcsr04_echo            A1 // "Echo" pin of HCSR04
#define relay_pump             4 // реле отключения насоса (в нормальном состоянии (выключено) = 1)
#define float_switch           7 // датчик полной бочки об землю (полная = 0)  (в железе - подтяжка 4,7к к Vcc)
#define led_green              5 // зелёный светодиод через 680ом об землю
#define led_red                3 // красный светодиод через 680 ом об землю
#define acs712_input           A2 // датчик тока насоса ACS712-20
#define beeper                 6 // пьезопищалка
#define button_red             2 // кнопка

#define ONE_WIRE_BUS           8 // датчик температуры DS18B20 (в железе - подтяжка 4,7к к Vcc)
#define TEMPERATURE_PRECISION  12 // разрешение DS18B20 - 12 бит
LiquidCrystal_I2Cv1 lcd(0x20,16,2);  // i2cLCD 16*2, адрес 0x20

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature DSsensors(&oneWire);

RF24 radio(9,10);
byte addresses[][6] = { 
  "42no1","42srv" }; // адреса каналов приёма и передачи
#define ModuleID 101 // ID этого модуля


#define range_max    92 // maximum range, CM (equal to 0%, empty barrel)
#define range_min    9  // minimum range, CM (equal to 100%, full barrel)
#define barrel_capacity   200 // barrel volume, litres

// make some custom characters:
byte block0[8] = { // empty brick
  0b10101,
  0b00000,
  0b00000,
  0b00000,
  0b00000,
  0b00000,
  0b00000,
  0b10101
};
byte block1[8] = { // 1/3 loaded brick
  0b10101,
  0b10000,
  0b10000,
  0b10000,
  0b10000,
  0b10000,
  0b10000,
  0b10101
};
byte block2[8] = { // 2/3 loaded brick
  0b10101,
  0b10100,
  0b10100,
  0b10100,
  0b10100,
  0b10100,
  0b10100,
  0b10101
};
byte block3[8] = { // full loaded brick
  0b10101,
  0b10101,
  0b10101,
  0b10101,
  0b10101,
  0b10101,
  0b10101,
  0b10101
};
byte block4[8] = { // degrease sign
  0x06,0x09,0x09,0x06,0x00,0x00,0x00,0x00 
};
char errorcode = ' ';
long duration;
int range_cm;
int range_percents;
int range_litres;
boolean beeper_enabled = true;
unsigned int timeout_timer = 0; 
unsigned int ds18b20_bypass = 10;
float current_temperature;

float pump_current_instant = 0;
float pump_current_instant_raw;
float pump_current_squared = 0;
float pump_current_squared_sum = 0;
float pump_current_mean_square = 0;
float pump_current_rms = 0;
unsigned long begin_millis;
byte rmscur_error_counter = 0;
boolean ButtonRedPressed = 0;

// буфер для приёма/передачи RF24
struct buffer_template {
  int Security;      // на будущее
  byte CommandFrom;   // от кого команда
  byte CommandTo;     // кому команда
  byte Command;       // 0=Nop, 1=Get, 2=Set
  byte ParamID;       // номер параметра, если Set
  float ParamFloat0;  // значение параметра
  float ParamFloat1;  // значение параметра
  float ParamFloat2;  // значение параметра
  float ParamFloat3;  // значение параметра
  byte ParamByte0;  // значение параметра
  byte ParamByte1;  // значение параметра
  byte ParamByte2;  // значение параметра
  byte ParamByte3;  // значение параметра
  boolean Status; // 1 = OK
} 
BufferTX, BufferRX;


void setup()
{
  lcd.init();                      // initialize lcd 
  lcd.backlight();
#ifdef serialenabled
  Serial.begin(9600); 
  printf_begin();

#endif
  // create a new character
  lcd.createChar(1, block0);
  lcd.createChar(2, block1);
  lcd.createChar(3, block2);
  lcd.createChar(4, block3);
  lcd.createChar(5, block4);

  pinMode(float_switch, INPUT);
  pinMode(button_red, INPUT);
  digitalWrite(button_red, HIGH); // подтяжка
  pinMode(hcsr04_trigger, OUTPUT);
  pinMode(led_red, OUTPUT);
  pinMode(led_green, OUTPUT);
  pinMode(relay_pump, OUTPUT);
  digitalWrite(relay_pump, HIGH);
  tone(beeper, 2000, 50);
  attachInterrupt(0, doButtonRed, LOW);   // encoder pin on interrupt 0 (pin 2)

  // Start up the 1wire library
  DSsensors.begin();
  DSsensors.setWaitForConversion(false); // не ждать измерения температуры - делаем его на лету
  DSsensors.requestTemperatures();
  delay(1000);
  current_temperature=(DSsensors.getTempCByIndex(0)); // получаем температуру от далласа
  DSsensors.requestTemperatures(); // запуск нового преобразования

  // Setup and configure rf radio
  radio.begin();                          // Start up the radio
  radio.setDataRate(RF24_250KBPS);
  radio.setAutoAck(1);                    // Ensure autoACK is enabled
  radio.setRetries(15,15);                // Max delay between retries & number of retries
  radio.openWritingPipe(addresses[1]);
  radio.openReadingPipe(1,addresses[0]);

  radio.startListening();                 // Start listening
  radio.printDetails();                   // Dump the configuration of the rf unit for debugging

}

void loop()
{
  begin_millis = millis();

  // температуру измеряем раз в 10 циклов (для уменьшения самоподогрева датчика)
  ds18b20_bypass ++;
  if (ds18b20_bypass > 9)
  {
    ds18b20_bypass = 0;
    current_temperature=(DSsensors.getTempCByIndex(0)); // получаем температуру от далласа
    DSsensors.requestTemperatures(); // запуск нового преобразования
    if (current_temperature < -99.0)
    {
      current_temperature=99.0;
    }
  }

  //измеряем уровень воды в бочке
  digitalWrite(hcsr04_trigger, HIGH); // даём импульс в сонар
  delayMicroseconds(10);
  digitalWrite(hcsr04_trigger, LOW);
  duration = pulseIn(hcsr04_echo, HIGH); // получаем ответ от сонара
  range_cm = duration/58;
  range_percents = constrain((100 - map(range_cm, range_min, range_max, 0, 100)), 0, 100); // вычисляем наполненность бочки в процентах
  range_litres = int((barrel_capacity/100)*range_percents);

  //ACS712A-20 - измеряем ток потребления насоса (RMS)
  pump_current_squared_sum = 0;
  for (int n=0; n<500; n++) // 500 последовательных измерений - ~90мС, 4-5 периодов @50Hz
  {
    pump_current_instant_raw = analogRead(acs712_input)-512; //при отсутствии тока - на выходе ACS712 (и входе ADC) половина Vcc, вычитаем её
    pump_current_instant = (4.88*(abs(pump_current_instant_raw)))/100; // рассчитанный мгновенный ток
    // здесь 4.88 = 5000mV/1024 (Vcc/ADCmax) ; 100 - хар-ка датчика, mV/A
    pump_current_squared = pump_current_instant * pump_current_instant;
    pump_current_squared_sum += pump_current_squared;
  }
  pump_current_mean_square = pump_current_squared_sum / 500;
  pump_current_rms = sqrt(pump_current_mean_square)*1.41; // получаем действующее значение
  if((pump_current_rms > 2)&&(pump_current_rms < 4)) // если ток насоса от 2 до 4 ампер - это сухой ход, увеличиваем счётчик ошибок
  {
    rmscur_error_counter++;
  }
  if (pump_current_rms >= 4)
  {
    rmscur_error_counter = 0;
  }
  // если ток больше 2А (насос включен) - зажигаем зелёный светодиод
  if (pump_current_rms > 2)
  {
    digitalWrite(led_green, HIGH);
  } 
  else 
  {
    digitalWrite(led_green, LOW);
  }

  lcd.setCursor(0, 0);
  lcd.print(range_litres); // уровень воды в литрах
  lcd.print(F("L "));

  lcd.setCursor(5, 0);
  lcd.print(current_temperature, 1); // температура
  lcd.write(0x05); // "o" sign
  lcd.print(F(" "));

  int rate = range_litres;

  lcd.setCursor(12, 0);
  if (timeout_timer > 0) // если таймер таймаута считает - выводим код ошибки и таймер на экран
  {
    lcd.print(errorcode);
    if (timeout_timer < 100)
    {
      lcd.print(" ");
    }    
    if (timeout_timer < 10)
    {
      lcd.print(" ");
    }    
    lcd.print(timeout_timer);
  } 
  else {
    lcd.print(F("Auto")); // насос разрешён
    errorcode = ' ';
  }


  // выводим псевдографический показометр уровня воды
  lcd.setCursor(0, 1);
  int range_percentst = range_percents;
  for (int i=0; i<16; i++) // выводим линейку
  {
    if (range_percentst >= 100/16) // 16 знаков в строке
    {
      lcd.write(0x04); // полный кубик
      range_percentst -= 100/16;
    }
    else
      if (range_percentst >= 100/24) 
      {
        lcd.write(0x03); // кубик, заполненный на 2/3
        range_percentst -= 100/24;
      }
      else
        if (range_percentst >= 100/48) 
        {
          lcd.write(0x02); // кубик, заполненный на 1/3
          range_percentst -= 100/48;
        }
        else
        {
          lcd.write(0x01); // пустой кубик
        }
  }

  if (timeout_timer > 0)
  {
    timeout_timer--;
  }

  // если бочка пуста или наполнилась или накопилось 10 ошибок тока или температура меньше +2C - выключаем насос на некоторое время
  if (((range_percents < 2)||(digitalRead(float_switch) == 0)||(rmscur_error_counter > 9)||(current_temperature < 0.5))&&(timeout_timer == 0))
  {    
    digitalWrite(relay_pump, LOW); // выключить насос
    digitalWrite(led_red, HIGH);
    if (beeper_enabled == true)
    {
      for (int i = 0; i<5; i++)
      {
        tone(beeper, 4000, 100);
        lcd.noBacklight();
        delay(100);
        lcd.backlight();
        delay(100);
      }
      beeper_enabled = false; // это чтобы свистопляска случилась 1 раз до сброса ошибки
    }
    if (range_percents < 2)
    {
      timeout_timer = 999; // если бочка пуста - запрет насоса на 999 секунд
      errorcode = 'E'; // код ошибки - пустая бочка
    }
    if (digitalRead(float_switch) == 0)
    {
      errorcode = 'F'; // код ошибки - полная бочка
      timeout_timer = 60; // запрет насоса на 60 секунд
    }
    if (rmscur_error_counter > 9)
    {
      errorcode = 'i'; // код ошибки - сухой ход в течение 10 секунд
      timeout_timer = 20; // запрет насоса на 20 секунд
      rmscur_error_counter = 0;
    }
    if (current_temperature < 0.5)
    {
      errorcode = 't'; // код ошибки - низкая температура
      timeout_timer = 60; // запрет насоса на 60 секунд
    }
  }
  // после обнуления таймера ошибки при запрещённом насосе или сброса ошибки кнопкой - включаем насос не менее чем на 10 секунд
  if (((timeout_timer == 0)&&(digitalRead(relay_pump) == LOW))||(ButtonRedPressed))
  {    
    rmscur_error_counter = 0;
    digitalWrite(relay_pump, HIGH);
    digitalWrite(led_red, LOW);
    beeper_enabled = true;
    tone(beeper, 2000, 250);
    errorcode = ' ';
    timeout_timer = 10;
    // принудительный сброс ошибки кнопкой = не следим за ошибками в течение 300 секунд
    if (ButtonRedPressed)
    {    
      timeout_timer = 300;
      errorcode = 'M'; // код ошибки - нажатие кнопки
      ButtonRedPressed = false;
      delay(250);
    }
  }


  // вывод отладочной инфы в консоль
#ifdef serialenabled
  Serial.print(F("Duration(uS)=")); 
  Serial.print(duration); 
  Serial.print(F(";Range(CM)=")); 
  Serial.print(range_cm); 
  Serial.print(F(";FloatSW="));
  Serial.print(digitalRead(float_switch));
  Serial.print(F(";TOtimer=")); 
  Serial.print(timeout_timer); 
  Serial.print(F(";Irms(A)=")); 
  Serial.print(pump_current_rms);
  Serial.print(F(";T(C)="));
  Serial.print(current_temperature);
  Serial.print(F("\n\r")); 
#endif

  // + крутим пустые циклы, чтобы основной выполнялся раз в секунду
  while ((millis() - begin_millis) < 1000)
  {
    // + обработка радиомодуля
    if( radio.available()){
      while (radio.available()) {                          // While there is data ready
        radio.read( &BufferRX, sizeof(BufferRX) );             // Get the payload
      }    

      if (BufferRX.CommandTo == ModuleID)
      {
        if (BufferRX.Command == 1) // если это запрос инфы из эфира
        {
          BufferTX.CommandTo = BufferRX.CommandFrom;
          BufferTX.CommandFrom = ModuleID;
          BufferTX.ParamFloat0 = float(range_litres);
          BufferTX.ParamFloat1 = current_temperature;
          BufferTX.ParamFloat2 = float(timeout_timer);
          BufferTX.ParamByte0 = digitalRead(led_green);
          BufferTX.ParamByte1 = errorcode;
          radio.stopListening();                                        // First, stop listening so we can talk   
          radio.write( &BufferTX, sizeof(BufferTX));              // Send the final one back.      
          radio.startListening();                                       // Now, resume listening so we catch the next packets.
        }
        if (BufferRX.Command == 2) // если это установка параметра из эфира
        {
          if (BufferRX.ParamByte0 == 1) // если команда сброса ошибки (большая красная кнопка)
          {
    tone(beeper, 2000, 100);
    tone(beeper, 3000, 100);
            ButtonRedPressed = true;
          }
          if (BufferRX.ParamByte0 == 2) // если команда выключения насоса
          {
    tone(beeper, 3000, 100);
    tone(beeper, 2000, 100);
            digitalWrite(relay_pump, LOW); // выключить насос
            digitalWrite(led_red, HIGH);
            timeout_timer = 300; // запрет насоса на 300 секунд
            errorcode = 'R'; // код ошибки - удалённое отключение
          }
          if (BufferRX.ParamByte0 == 3) // если команда #3 - звук для привлечения внимания
          {
            for (int x = 0; x < 10; x++)
            {
                tone(beeper, 2800, 50);
                delay(100);
            }
          }
        }
      }    
    }
    // - обработка радиомодуля

    // если бочка полна - моргаем красным светодиодом
    if (digitalRead(float_switch) == 0)
    {
      digitalWrite(led_red, HIGH);
      delay(200);
      digitalWrite(led_red, LOW);
      delay(200);
    }
    if (ButtonRedPressed) // если нажали кнопку
    {
      begin_millis -= 1000; // для преждевременного выхода из цикла ожидания
    }
  }
  // - крутим пустые циклы, чтобы основной выполнялся раз в секунду


}
// - main loop end

// Interrupt on A changing state
void doButtonRed()
{
  delay(10);
  if(digitalRead(button_red) == 0) // debouncing
  {
    ButtonRedPressed = true;
  }
}






На вопросы - отвечу.

flamantino
Offline
Зарегистрирован: 13.06.2014

интересно данный девайс еще рабочий - интересует Ульра звуковой датчик- потому что я уже пару тройку уже поменял - и перешел на  старую провереную систему )) С релхками и герконами  - к стати сухой ход можно герконовым датчиком отслеживатьь или по ультразвуку если таковая еще работает  

Chipsay
Offline
Зарегистрирован: 30.03.2016

Идея использовать ультразвук ( как вариант HC-SR04 ) - не плохая.  Похожий девайс испытываю сейчас. Датчик HC-SR04 был покрыт в несколько слоев лаком (только сама плата, излучатель и приемник не заливал) и помещен под крышку в аквариуме. Расстояние до поверхности воды около 4-5 см. К датчику ничего не подключал. Через неделю снял, и сразу, не суша и не стряхивая подключил к ARDUINO -  расстояние до поверхности либо неверные либо вообще нет. Виной тому конденсат на защитной сетке на датчике. Достаточно было продуть и датчик показал верное значение. Далее - срезал защитную сетку и оставил еще на неделю. Влага оказалась внутри. Датчик не работал.

vlad219i  использует "Железка контролирует уровень воды, ток потребления насосной станции, температуру в подполе." Разница температур видимо не существенна и поэтому нет сильного испарения. Если бак окажется на улице или под крышей - конденсат на датчике неизбежен.

Будем пробовать прикрутить датчик от парктроника.

А вот Progress Bar через строчку смотрится красиво. За скетч -спасибо!

Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015

Существуют другие способы узнать уровень. В промышленности использую вот такие:

http://www.owen.ru/catalog/preobrazovatel_gidrostaticheskogo_davleniya_o...

Бывают и дешевле из Китая. 

flamantino
Offline
Зарегистрирован: 13.06.2014

У меня тоже самое   HC-SR04  - проработал 3 месяца и финиш - от партроника тоже пробова-но воду он почему о плохо видел  - ставил HC-SR05 - тоже самое сдох  - Мне кажется что  данные дадчик не годятся для долговременого измерения уровя воды - надежность стремится к нулю - Конечно много есть способов измерения уровня - но мне почему то импонирует даный метод с ультрозвуком  - к сожолению - пока ждем датчиков по надежнее,Конечно самый надежный пока это герконами 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

А почему никто не вспоминает прессостат от стиралки ;) Надежно и дешево :)

flamantino
Offline
Зарегистрирован: 13.06.2014

прессостат датчик позиционый  как и  геркон Да или Нет ( к тому же от стиралки расчитаны на маленкий столб воды ) - не решает проблем отслеживания уровня 

vlad219i
Offline
Зарегистрирован: 05.03.2014

Девайс работает второй год непрерывно, плата сонара покрыта лаком (кроме излучателя и приёмника). Конденсат на крышке бочки присутствует, но его немного. Температура в подполе зимой +2...+5 градусов, T воды при наполнении - градусов 15-20.

Это просто моя статистика и подробности для тех, кому это может быть интересно. :-)

Logik
Offline
Зарегистрирован: 05.08.2014

flamantino пишет:

прессостат датчик позиционый  как и  геркон Да или Нет ( к тому же от стиралки расчитаны на маленкий столб воды ) - не решает проблем отслеживания уровня 

Таких действительно большинство. Но в современных моделях ставят "цифровые". Мембрана прогибается под давлением  и перемещает сердечник в катушке, индуктивность изменяется и это вызывает изменение частоты на выходе.

Chipsay
Offline
Зарегистрирован: 30.03.2016

ИМХО потому и работает, что вода охлаждается. Конденсат из окружающего воздуха на бочке должен быть снаружи. Если воду закачивать из скважины или из колодца глубиной метров 10-20, то температура воды будет +4 - +6 С. Если накопительный бак на чердаке или в доме ситуация станет противоположной - испарение и конденсат будут внутри бочки. 

Chipsay
Offline
Зарегистрирован: 30.03.2016

Есть идея оснастить Ардуинкой аквариум: автокормушка + фильтрация воды + ещё всякой всячины с расчетом оставить на месяц-два. Поплавковые - герконовые датчики - не хотелось бы в аквариум засовывать. Ультразвуковой датчик в крышке - заманчиво. В ТО на датчики парктроников (для Ардуино) минимальная дистанция указана 25-30 см. Мне нужно 2-3-4 см. Кто пробовал эти влагозащищенные датчики, - какая реально минимальная дистанция?

Ещё вопросик. А никто случаем датчик PH не юзал? Какой срок службы реально? 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Нафига в аквариум датчики засовывать? Геркон в куске пенопласта засуньте, пущай плавает внутри колонны, вставленной в аквариум не до дна, прямо возле стенки. А ответка - снаружи, в сухости.

Мысли вслух, в общем.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

не, не так. На пенопласт наклеить неодимовый магнит, все это в трубку и в аквариум.

А 3-5 герконов снаружи трубки.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Tomasina пишет:

не, не так. На пенопласт наклеить неодимовый магнит, все это в трубку и в аквариум.

А 3-5 герконов снаружи трубки.

Ага, так лучше. И проблемы с влажностью нет, и всё работать будет. Только магнит подобрать по вкусу.

Chipsay
Offline
Зарегистрирован: 30.03.2016

Пенопласт - не самый лучший вариант. Рано или поздно он залипнет. Проверено. Аппарат "Струна" тот что измеряет объём топлива на АЗС - кто сталкивался с ним, - знает. Подобные штучки (геркон+магнит на поплавке) есть готовые на Ebay http://www.ebay.com/itm/Double-Ball-Water-Level-Sensor-Liquid-Float-Switch-Tank-Pool-Steel-/262173563574?hash=item3d0ac31ab6:g:MRUAAOSw7FRWYFmu . Кстати, исполнение в металле может быть и понадёжнее чем пластик или пенопласт. Дело не в этом. Ветка форума про ультразвук на Ардуино. Бочка в подвале или аквариум в комнате - лишь варианты применения. Хочется как-то по эстетичнее сделать. Чтоб всякие "приблуды" и "прибамбасы" в глаза не бросались. Есть аквариум, есть вода, есть рыбка! - Красота! ...  А вот фикальный насос и жопоподтирочный автомат можно и спрятать.    

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

эти сенсоры максимум 300 мм длиной, а вот мне надо на 200-литровую бочку, это примерно 800 мм. Так что только колхоз, тем более за эти 799 р. я таких сенсоров ух как много могу сделать. :)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Chipsay пишет:

Пенопласт - не самый лучший вариант. Рано или поздно он залипнет. Проверено.

И шо? Теперь всё додумывать за вас? Ну не юзайте пенопласт, раз не можете сообразить, как и из какого материала сделать так, чтобы не залипало, вот и решение проблемы.

И жопоподтирочного автомата не надо - он думать не научит, даже не надейтесь.

 

flamantino
Offline
Зарегистрирован: 13.06.2014

кто пробовал парк троник как измерител уровня ?

Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

Привет всем!
А кто глядел в ИК оптические датчики?

Модель

GP2Y0A21YK0F

Бренд

Sharp

Стандартный пакет

500

Категория

Оптические датчики-расстояние измерения

Зондирования расстояние

10 ~ 80 см

Тип выхода

Аналоговый

Напряжение питания

4.5 В ~ 5.5 В

Ток питания

40mA

Напряжение,-выход (typ) @ Расстояние

1.9 В @ 10 ~ 80 см

Напряжение,-выход (typ) @ Расстояние

400мв @ 80 см

Расстояние 10-80 см как бы подходит.
Не знаю, правда, как инфракрасный свет отражается от воды :(
Впрочем, можно попробовать и наклонное зондирование.

Удачи всем!

 

vadimg
Offline
Зарегистрирован: 19.02.2017

привет, заинтересовал проект и есть вопросы )
Не понятно что подключается к А2
Какое нужно реле(ссылку или картинку)
Какие резисторы на пинах 3,5(плохо видно)
Что за пьезо на 6 пине
через что (программа) подключаться к НРФке?
Для чего функция ресет?
спасибо

vlad219i
Offline
Зарегистрирован: 05.03.2014

vadimg пишет:

привет, заинтересовал проект и есть вопросы )
Не понятно что подключается к А2
Какое нужно реле(ссылку или картинку)
Какие резисторы на пинах 3,5(плохо видно)
Что за пьезо на 6 пине
через что (программа) подключаться к НРФке?
Для чего функция ресет?
спасибо

К A2 - ACS712-20, датчик протекающего тока.

Реле - http://arduino.ru/sites/default/files/u7746/relay1.jpg .

Резисторы на 3 и 5 пинах - 680 ом, ограничивают ток через светодиоды.

Пьезоизлучатель - обычный, без встроенного генератора. Пьезодинамик.

К НРФ у меня обращается базовый модуль умного дома, потом выкладывает всю собранную инфу на страничку в инете, там же и SQL-база заполняется. Кроме того, есть беспроводной пульт управления/контроля, тоже с НРФ работает.

Ресет - для сброса текущей ошибки.

vadimg
Offline
Зарегистрирован: 19.02.2017

спасибо большое

vadimg
Offline
Зарегистрирован: 19.02.2017

подскажите, подойдёт ли датчик ACS712-30а? У меня гидрофор с насосом 950Ватт, но там сильный пусковой ток.
И интересный у вас проект дома, умный дом и кучу датчиков)) Может есть у вас это в свободном доступе или канал на Ютубе? )

vadimg
Offline
Зарегистрирован: 19.02.2017

постоянно ошибка "F" якобы полная бочка, хоть шкала в разных вариантах. Даже на нуле...пытался вырезать из скетча эту функцию - устройство начинает перегружаться каждые 10 сек. Можно конечно увеличить время, но так не правильно...

vlad219i
Offline
Зарегистрирован: 05.03.2014

vadimg пишет:

постоянно ошибка "F" якобы полная бочка, хоть шкала в разных вариантах. Даже на нуле...пытался вырезать из скетча эту функцию - устройство начинает перегружаться каждые 10 сек. Можно конечно увеличить время, но так не правильно...

Ошибка "F" бывает только тогда, когда замкнут поплавковый датчик (т.е. когда pin7 замккнут на общий провод). Может быть, подтяжки нет на 7 пине?

vlad219i
Offline
Зарегистрирован: 05.03.2014

vadimg пишет:

подскажите, подойдёт ли датчик ACS712-30а? У меня гидрофор с насосом 950Ватт, но там сильный пусковой ток.
И интересный у вас проект дома, умный дом и кучу датчиков)) Может есть у вас это в свободном доступе или канал на Ютубе? )

Подойдёт, конечно. Только в расчётах кое-что подправить придётся, у него ВАХ другая (66мВ/A против 100мВ/A у 20-го). Вообще - проводник в датчике рассчитан на 5-кратное превышение максимального тока, так что и 20-го будет хватать.

ps: сорри, наврал. троекратное превышение. 60 ампер пускового тока он переварит, но измерить адекватно не сможет.

У меня насосная станция с мотором 800Вт, кстати.

Нет, в свободном доступе проекта нет и не предвидится. Там в каждом модуле довольно много костылей и открытых паролей/адресов/etc, причёсывать всё у меня времени нет.

vadimg
Offline
Зарегистрирован: 19.02.2017

понял, спасибо.
Ошибка F пропала :)
 

iborsch
Offline
Зарегистрирован: 07.11.2019

поставил вентилятор 70мм, так, что бы обдувал ультразвуковой датчик, конденсат не появляется на датчике, но переодически умирает вентилятор...

Бак 100 литров, дисплей и плата - табло от кассового аппарта, мега8515