Показ дописів із міткою рівень води. Показати всі дописи
Показ дописів із міткою рівень води. Показати всі дописи

вівторок, 25 вересня 2018 р.

MyHomeIoT: Рівень води Water Level шина I2C

MyHomeIoT Water Level

Рівень води MyHomeIoT Water Level призначений для контролю рівня води, та керуванням впускним і випускним клапаном по шині I2C з мікроконтролера. Приєднавши цю плату до Sonoff Basic (TH), або до будь якого пристрою на ESP8266, схемно сумісного з Sonoff basic (TH) та прошитого прошивкою MyHomeIoT починаючи з версії 1.1.4 і вище, до шини I2C, отримуєте контроль рівня води (чотири рівня: пустий, 1/4, 1/2, 3/4 і повний) плюс керування впускним і випускним клапаном зі світлодіодною індикацією і зворотнім зв'язком, як з додатку blynk app, так і з кнопки на самій платі. В додачу два тижневих планувальника для встановлення потрібного рівня води.
Також цей Water Level можна використовувати з будь яким мікроконтролером для своїх поробок автоматики і систем розумного будинку написавши програмну підтримку до свого мікроконтролеру який будете використовувати.

Схема пристрою

Схема рівня води (тицяйте в зображення для збільшення)
Схема складається з мікросхеми PCF8574P, яка є двонаправленим розширювачем портів вводу/виводу з керуванням по I2C шині і має адресу 0x21. Та мікросхеми ULN2803A, яка є масивом транзисторів Дарлінгтона і має 8 транзисторів з загальним емітером та внутрішніми діодами для індуктивних навантажень (реле).
Перші чотири входи IN1 - IN4 мікросхеми ULN2803A використовуються для визначення рівня води. Виходи OUT5 і OUT6 мікросхеми ULN2803A керують впускним і випускним клапаном. А OUT7 керує світлодіодним індикатором режиму роботи. OUT8 не використовується (резерв), тому можна замість мікросхеми ULN2803A застосувати UNL2003.

Мікросхема PCF8574P - двонаправлений розширювач портів вводу/виводу з шиною I2C
Кнопка S1 - встановлення потрібного рівня води.
Світлодіод D2 - для індикації режимів роботи та помилок сенсору.
Реле К1, К2 - керування впускним і випускним клапаном
Транзистор Q1 - захист від переливу води у випадку, якщо мікроконтролер "завис" або не працює з якихось причин. Можна без транзистору, тоді OUT5 мікросхеми ULN2803A з'єднати на пряму з реле К1 (вивід 2 на схемі).

Демонстраційний код


/*
 Name:  pcf8574_water_level.ino
 Created: 7/16/2018 8:59:19 AM
 Author: Andriy
*/
#include <Ticker.h>
#include <Wire.h>
#include <pcf8574_esp.h>


#define ADDRESS_WATER_LEVEL  0x21 // Address PCF8574 on the I2C bus
#define SDA    4 // Pin SDA wire 
#define SCL    5 // Pin SCL wire

typedef enum {
 empty  = 0x00,
 quarter  = 0x40,
 half  = 0x80,
 threeQuarters = 0xC0,
 full  = 0xFE,
 errorSensor = 0xFF
}WaterLevelEnum;

typedef enum {
 sensor_0,
 sensor_1,
 sensor_2,
 sensor_3,
 intake_pump,
 outlet_pump,
 led_indicator,
 button
}WaterLevelPortEnum;

typedef struct
{
 bool triggerInit  = false;   // трігер чи є такий пристрій в системі
 bool triggerButton  = false;   // трігер натискання і відпускання кнопки
 bool triggerStart  = false;   // трігер старту встановлення рівня води 
 bool stateLed   = false;   // стан світлодіодного індікатора увімк/вимкн 
 bool stateRelay[2]  = { false, false }; // стан впускного і випускного реле 
 uint8_t requiredWaterLevel = full;
 uint8_t currentWaterLevel = empty;
}WaterLevelTypeDef;

WaterLevelTypeDef waterLevelStruct;

PCF857x waterLevelDevice(ADDRESS_WATER_LEVEL, &Wire, false);

Ticker tickerWaterLevel;

static void wl_Run(bool setOutletPump);
static uint8_t wl_GetWaterLevel(void);
static void wl_SetWaterLevel(uint8_t level);
static void wl_ReadKey(void);
static void wl_Control(bool setOutletPump);
static void wl_ErrorLedStatus(void);
static void wl_Action(bool state, bool stateIntakePump, bool stateOutletPump, String str);

// the setup function runs once when you press reset or power the board
void setup()
{
 Serial.begin(115200);

 Wire.begin(SDA, SCL);
 // ініціалізуємо рівень води
 waterLevelDevice.begin(0x8F);
 // встановлюємо потрібний рівень
 wl_SetWaterLevel(half);
 // взнаємо поточний рівень води і заносимо до структури
 waterLevelStruct.currentWaterLevel = wl_GetWaterLevel();

 if (waterLevelStruct.currentWaterLevel != errorSensor)
 {
  wl_Action(false, false, false, "Device water level is OK!");

  if (tickerWaterLevel.active())
  {
   tickerWaterLevel.detach();
   waterLevelDevice.write(led_indicator, LOW);
  }
 }
 else
 {
  wl_Action(false, false, false, "Device water level is sensor error!");
  
  if (!tickerWaterLevel.active())
  {
   tickerWaterLevel.attach(0.2, wl_ErrorLedStatus);
  }  
 }
}

// the loop function runs over and over again until power down or reset
void loop() 
{ 
 wl_Run(true);
}

static void wl_Run(bool setOutletPump)
{
 wl_ReadKey();
 wl_Control(setOutletPump);  
}

static void wl_ReadKey(void)
{
 if (!waterLevelDevice.read(button) && !waterLevelStruct.triggerButton)
 {
  waterLevelStruct.triggerButton = true;
  waterLevelStruct.triggerStart = !waterLevelStruct.triggerStart; 
 }
 else if (waterLevelDevice.read(button) && waterLevelStruct.triggerButton)
 {
  waterLevelStruct.triggerButton = false;  
 }
}

static void wl_Control(bool setOutletPump)
{
 if (waterLevelStruct.triggerStart) 
 {  
  waterLevelStruct.currentWaterLevel = wl_GetWaterLevel();

  if (waterLevelStruct.currentWaterLevel == errorSensor)
  {  
   wl_Action(false, false, false, "Error water sensor");
   
   if (!tickerWaterLevel.active())
   {
    tickerWaterLevel.attach(0.2, wl_ErrorLedStatus);
   }   
  }
  else
  {      
   if (tickerWaterLevel.active())
   {
    tickerWaterLevel.detach();
    waterLevelDevice.write(led_indicator, LOW);
   }
   
   if (waterLevelStruct.currentWaterLevel == waterLevelStruct.requiredWaterLevel)
   {    
    wl_Action(false, false, false, "The tank has already reached the required level");    
   }
   else if (waterLevelStruct.currentWaterLevel < waterLevelStruct.requiredWaterLevel)
   {
    if (!waterLevelStruct.stateRelay[0])
    {     
     wl_Action(true, true, false, "Intake Pump ON");
    }
   }
   else if (waterLevelStruct.currentWaterLevel > waterLevelStruct.requiredWaterLevel)
   {
    if (setOutletPump)
    {     
     if (!waterLevelStruct.stateRelay[1])
     {
      wl_Action(true, false, true, "Outlet Pump ON");
     }
    }
   }
  }  
 }
 else
 {
  if (waterLevelStruct.stateRelay[0])
  {   
   wl_Action(false, false, false, "Intake Pump OFF");
  }
  
  if (waterLevelStruct.stateRelay[1])
  {
   wl_Action(false, false, false, "Outlet Pump OFF");
  }
 } 
}

static void wl_Action(bool state, bool stateIntakePump, bool stateOutletPump, String str)
{ 
 waterLevelStruct.triggerStart = state;
 waterLevelStruct.stateLed = state;
 waterLevelStruct.stateRelay[0] = stateIntakePump;
 waterLevelStruct.stateRelay[1] = stateOutletPump; 
 Serial.println(str);
 Serial.print("Current water level is ");
 switch (waterLevelStruct.currentWaterLevel)
 {
 case empty:
  Serial.println("empty");
  break;
 case quarter:
  Serial.println("1/4");
  break;
 case half:
  Serial.println("1/2");
  break;
 case threeQuarters:
  Serial.println("3/4");
  break;
 case full:
  Serial.println("full");
  break;
 case errorSensor:
  Serial.println("error");
  break;
 default:
  break;
 } 

 waterLevelDevice.write(led_indicator, waterLevelStruct.stateLed);
 waterLevelDevice.write(intake_pump, waterLevelStruct.stateRelay[0]);
 waterLevelDevice.write(outlet_pump, waterLevelStruct.stateRelay[1]); 
}

static void wl_ErrorLedStatus(void)
{
 waterLevelDevice.toggle(led_indicator);
}

static uint8_t wl_GetWaterLevel(void)
{ 
 uint8_t level = (waterLevelDevice.read8() & 0xF) ^ 0x0F;
 
 if (level != 0b0000 && level != 0b0001 &&\
  level != 0b0011 && level != 0b0111 && level != 0b1111)
 {
  return errorSensor;
 }
 else
 {
  if (level == 0b0000)
   return empty;
  else if (level == 0b0001)
   return quarter;
  else if (level == 0b0011)
   return half;
  else if (level == 0b0111)
   return threeQuarters;
  else if (level == 0b1111)
   return full;  
 } 
}

static void wl_SetWaterLevel(uint8_t level)
{
 waterLevelStruct.requiredWaterLevel = level;
}

середу, 13 липня 2016 р.

Літній душ автомат

Літній душ автомат

Передмова

Добре коли приїжджаєш на дачу, чи повертаєшся здалеку до дому, а тебе вже чекає тепла, нагріта сонцем, вода в душі. І можна негайно прийняти його. А якщо приїхав на дачу ранком і вода ще не нагрілась, або повернувся до дому дуже пізно і вода вже охолола? То треба передбачити її нагрів. А ще добре щоб і потрібний рівень води підтримувався. Бо можна забутись набрати, або за час, коли не був на дачі, вона випарувалась. Чи просто щоб вода була свіжою і не заплила зеленою водорістю. Постійно підігрівати воду і тримати рівень води в літньому душі це непомірне марнотратство. Але завдяки нескладній автоматиці можна автоматизувати процес контролю рівня води в душі і її температури. І приготувати душ заздалегідь на потрібний час і день, абсолютно автоматично.

Необхідні модулі та деталі

Схема підключення модулів

Натисни на зображенні щоб збільшити. 
Схема підключення модулів для автоматичного літнього душа
Схема підключення зображена на малюнку. Фаза та нуль побутової електромережі 220 Вольт подати на контакти колодки. Далі вже з колодки 220 В подаємо напряму на реле часу. Реле часу живиться від електромережі постійно. Через контакти реле "Реле часу" підключаємо фазу яка буде живити знижувальний трансформатор, при спрацюванні "Реле часу" і далі ця фаза йтиме на контакти реле термостату і на вільний контакт з'єднувальної колодки. До цієї "комутованої фази" і нуль електромережі підключимо електротен води. З трансформатора, 12 Вольт змінної напруги, подамо на вирівнювач з стабілізатором на 5 Вольт. На виході маємо постійну напругу 12 Вольт, та 5 Вольт. 12 Вольт живить термостат і через реле "рівня води" 12 Вольт подається на електроклапан води. А 5 Вольт живить плату "рівня води". До плати термостату під'єднати герметичний датчик температури (постачається в комплекті з платою), який занурюється у воду. А до плати рівня води під'єднати датчик рівня води, який теж знаходиться в ємності з водою. Датчик рівня води я зробив з пластикового коробу для дротів, де закріпив оголені дроти за принципом як і в датчику рівня води, що поставлявся в комплекті з платою.

Принцип роботи

По заданій програмі спрацьовує реле часу і подає напругу на трансформатор і контакти реле термостату. Трансформатор подає живлення на плати "термостат" і "рівня води". Плата рівня води перевіряє рівень води в ємності і якщо не повний бак, то спрацьовує реле "рівня води" і 12 Вольт подається на електроклапан води. В бак подається вода. Коли вода досягне рівня "повний", електроклапан води закриється і постачання води в бак припиниться. Термостат перевіре рівень температури води і якщо температура буде нижча за потрібниу, спрацює реле термостату і подасть живлення на електротен нагріву води. По завершенню програми "реле часу" відключить всю електроніку.

Приклад готового пристрою

Зовнішній вигляд готового макету
Працює надійно вже другий літній сезон. Зробив як макет. Оформити у короб якось руки не доходять. Знаходиться в недоступному для жінок і дітей місці.
Автодуш в роботі
В мене запрограмовано реле часу на вмикання кожного дня о 6 ранку на 10 хвилин, щоб набралась свіжа вода. Протягом дня, як сонечко нагріло воду, ми користуємось душем щоб освіжитись коли спекотно. А на кожен вечір з 19 по 21 годину душ вмикається щоб добрати води і догріти її в межах 38 - 42 градуси по Цельсію. І вже всі миємось перед сном. Коли потрібно гаряча вода поза планом, на "реле часу" передбачено ручне вмикання чи вимикання автоматичного душа.

Примітка

Огляд всіх модулів автоматичного душа є у попередніх блогах, дивитись за посиланнями в цьому блозі у розділі "Необхідні модулі та деталі".

Обов'язково до подачі живлення 220 Вольт на колодку, передбачити пакетник-автомат на 16А. Закрити всю автоматику в короб. Додержуватись техніки електробезпеки. 220 Вольт небезпечне для життя.

неділю, 10 травня 2015 р.

Електронний конструктор "Сенсор рівня води"

Електронний конструктор "Сенсор рівня води"

Передмова

Для автоматизації контролю рівня води і автоматичного поповнення води в своєму літньому душі прикупив на BANGGOOD електронний конструктор Sensor Water Level Detection . Там є вже зібрані плати, або набір деталей з платою для самостійного збирання. Обрав набір для самостійного збирання - дешевше і задоволення більше.

Призначення

Сенсор рівня води (Sensor Water Level Detection) необхідний для контролю рівня води в ємності. І автоматичної подачі рідини, коли ємність спорожніє. Та автоматичного припинення подачі рідини, коли ємність наповниться. 

Комплектація

Набір прийшов в простому пластиковому пакетику. Містив всі необхідні деталі, дві плати і дроти з роз'ємами, що з'єднують плату електроніки з платою сенсора. Роз'єм з дротами для живлення плати. Схеми електричної принципової і опису роботи сенсора в наборі не було.
Вміст набору

Складання

Хоч схема сенсора була відсутня, при складанні пристрою труднощів не виникло. Друкована плата була якісною і розташування деталей та їхні номінали були чітко роздруковані на самій платі.
Паяти акуратно. Спочатку впаяв всі пасивні елементи: резистори і конденсатори. Потім: діоди, світлодіоди, транзистори, мікросхему. На останок: реле, роз'єми, кнопку. Транзистори і мікросхему не перегрівати. Панельку для мікросхеми не застосовував, так надійніше.
Готовий пристрій

Випробування і принцип роботи

Для перевірки роботи та дослідження алгоритму роботи пристрою зібрав макет з самого пристрою і склянки води. Живиться сенсор напругою 5 вольт.
Працює пристрій так:
Як немає води - світиться два червоних світлодіоди. Один червоний світлодіод означає що рівень води на мінімумі, інший що реле увімкнулось і своїми контактами подало живлення на електроклапан чи електронасос. 
Як вода стала надходити до ємності і собою замкнула нижні контакти датчика - світиться жовтий світлодіод - з реле нічого не відбувається.
Як вода досягла верхніх контактів датчика - світиться зелений світлодіод і реле відмикається. Контакти розривають подачу живлення на електроклапан чи електронасос і подача води до ємності припиняється.
Як падає рівень води в ємності і верхні контакти датчика оголюються, то світиться жовтий світлодіод - з реле нічого не відбувається.
Як оголюються нижні контакти датчика, то світиться червоний світлодіод і реле увімкнеться. Розпочнеться подача води.
Як кнопка на платі в натиснутому стані, то поведінка реле зовсім протилежна: при повній ємності реле вмикається, при пустій ємності реле вимикається.

Схема підключення

Схема підключення
З малюнку має бути зрозумілою схема підключення. Додаткових пояснень не потребує.

Переваги та недоліки

Почнемо з переваг: Низька ціна, від 4 до 7 умовних одиниць (залежить від продавця). Якісна друкована плата. Простота конструкції (доступно для початківців). Містить все для виготовлення готового пристрою.
Недоліки: Мала ступінь рівнів води (бак пустий, в баку є вода, бак повний). Закороткий датчик води, для своїх потреб необхідно робити самотужки, розміром, який підійде для мого душу. Чотири дроти, що з'єднують датчик рівня з платою електроніки.

Відео-огляд сенсора рівня води