Схема управления водяным насосом

Схема автоматического управления водяным насосом.





В данной записи рассмотрим схему для откачки воды с заданным интервалом на микроконтроллере ATMEGA8.

Распиновка ATMEGA8:

Принципиальная схема:

 

Собранную плату следует отмывать.

Круглые контакты — выводы для программирования.

Список электронных компонентов и примечания:

IC1 — Микроконтроллер ATMEGA8

С такой настройкой  фьюзов для eXtreme Burner AVR:

LOW — E1

HIGH — D9

Галки для других программ смотрите  здесь — http://homes-smart.ru/fusecalc/?prog=avrstudio&part=ATmega8

M1 — Сам водяной насос

VR1 — Любой стабилизатор напряжения на 5 вольт, например LM7805, КРЕН5

VT1 — Полевой транзистор,  любой N-MOSFET, с полным открытием затвора от напряжения, не выше 5-ти вольт(Vgs On\Off State), например IRFZ44N, IRF630.

Rel 1 — Нормально разомкнутое электромагнитное реле с номинальным постоянным напряжением срабатывания 12 вольт, силовые характеристики контактов — с коммутацией переменного напряжения 250 вольт, характеристики коммутации тока зависит от мощности насоса, реле следует разместить подальше от мк, чтоб возникающая искра, внутри реле, при коммутации силовых контактов не вносила помехи в работу мк.

SP — это буззер(пищалка) со встроенным генератором(когда подаешь питание она начинает не потрескивать, а пронзительно пищать)

C1 — Керамический конденсатор на 100 нФ(0,1 мкФ, на таком конденсаторе может быть написана цифра 104)

VD1 — Диод 1N4007 или аналогичный, служит защитой от неправильно подключенной полярности(переполюсовки), не обязателен.

HL1 — Любой маломощный светодиод, служит для отображения режима работы

HL2 — Любой маломощный светодиод, служит для индикации о включенном питании 12 вольт

R1 — 1 килоОм

R2 — 220 Ом, ограничение тока буззера

R3 — 500 Ом, ограничение тока светодиода HL2

R4 — 330 Ом, ограничение тока светодиода HL1

R5 — 10 килоОм, служит для принудительного закрытия затвора

R6 — 4K7*  Подстроечный резистор

R7 — 4K7*  Подстроечный резистор

R8 — 10 килоОм, служит для ограничения тока подачи высокого уровня сигнала на PD2

R9 — 10 килоОм, служит для ограничения тока подачи высокого уровня сигнала PD4

Важно!Резисторы R6 и R7 надо подбирать индивидуально, это зависит от сопротивления воды, провода, а также от того, что используется в качестве датчика, необходимо подобрать нужный номинал резистора, погружая датчик в воду(такую воду, в которой будут находиться датчики) и смотреть на срабатывание включения насоса (подбирать резистор надо ориентируясь на щелчки реле и\или на свечение светодиода режима работы, не надо подбирать резистор при подключенном насосе, от частых пусков и остановок он может сгореть).При этом датчики должны срабатывать только после полного погружения в воду, иначе насос будет включаться лишь от влаги, оставшейся на датчиках, также насос сразу же должен выключаться  при вынимании датчиков из воды.Не нужно размещать резисторы на датчике и тем более после погружать их под воду!Данные резисторы необходимо разместить ближе к ножкам микроконтроллера.Нижний датчик нужно разместить  выше дна водоема,чуть выше самой высокой точки насоса(так, чтобы насос после откачки оставался под водой), верхний датчик  разместить на уровне начала откачки воды(так, чтобы со временем датчик оказывался под водой, когда нужно включение насоса).

Датчиком могут служить клеммные колодки:

 

При вынимании датчика из воды светодиод сразу же гаснет, а вместе с ним отключается и реле, что отключает насос:

 

Принцип работы:

Ножка микроконтроллера PD2 служит входом верхнего датчика, а ножка PD4 — нижним датчиком, по умолчанию на ножках микроконтроллера PD2 и PD4 высокий уровень сигнала(подается положительное напряжение через резисторы 10k) — это значит, что датчики сухие и насос не работает.

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

Для того, чтобы принудительно запустить насос необходимо лишь перемкнуть контакты PD2 и PD4 на массу*.

*   — при этом после третьего цикла работы насоса включится бесконечное звучание пищалки!

 

Что выяснилось в процессе эксплуатации:

-При необходимости, а лучше все таки поставить искрогасящую цепочку на реле для уменьшения электромагнитных помех, искры, для защиты от сбоев микроконтроллера, от обгорания контактов реле и соответственно для продления срока его службы:

Цепочка ставится параллельно разомкнутым контактам реле, конденсатор C* и резистор RV подбираются по формулам:

C*=I^2/10

I — ток нагрузки в квадрате делится на 10

Если насос мощностью 400Вт, В сети 230 Вольт, ток нагрузки будет 400Вт/230 В=1,739 Ампер

1,739 ^2=3,024/10=0,302 мкФ — такой емкости конденсатор нужен.

 

Резистор:

RV=EO/( 10 * I *  ( 1 + 50 / EO ))

EO — Напряжение на нагрузке, вольт.

I — рабочий ток нагрузки, ампер.

Считаем:

230/( 10 * 1, 73 *  (51/230)) =

= 230 /(17,3 *0,221)= 230 / 3,8233 = 60, 15 Ом — такого номинала нужен резистор.

 

-Датчик может обледенеть и перестать работать при температуре от 0 градусов цельсия и ниже, если он находится не глубоко под водой, верхний датчик часто находится на воздухе без воды — от этого быстро и окисляется, для устранения этих проблем или уменьшения их влияния  следует контакты  датчика  размещать как можно дальше друг от друга.

-Датчик может загрязниться, на него может налипнуть разный мусор, после чего датчик может надолго остаться в замкнутом состоянии, чтоб этого не произошло, также следует  размещать датчик ближе к середине водоема, НЕ у краев и также контакты датчика размещать дальше друг от друга.Например, если в качестве датчика используется клеммная колодка, то все средние винты надо выкрутить и вынуть вместе с резьбовыми контактами, оставить только два крайних(к примеру НЕ подсоединять провода к  1-му и 4-му контактам, а подсоединить к  1-му и 8-му).

 

Работа прошивки:

При подаче питания начинает светиться светодиод HL1 в течении ~1 секунды, затем происходит писк буззера — 77 миллисекунд.

Если нижний и верхний датчик в воде, то начинается опустошение:

При опустошении сбрасывается количество циклов работа-простой.

Далее в подпрограмме cycle считается количество циклов опустошения, если циклов опустошения больше трех, то происходит переход к аварийной подпрограмме.

Далее выдерживается пауза в 1,5 секунды для стекания капель.

Проверяется нижний датчик на сухость, если он сухой то Реле и светодиод HL1 выключается, происходит переход на начало программы (старт).

Далее идет писк пищалки два раза, после чего загорается светодиод HL1 и включается реле.

Счетчик counter сбрасывается до нуля.(инкремент counter в прерывании, частота процессора 1000000Гц/255=3921 прерываний = 1 секунда)

Идет цикл — работать, пока не пройдет время time_of_work (counter<time_of_work, к примеру 20 минут), при этом проверяется на сухость нижний датчик, если нижний датчик сухой — то Реле и светодиод HL1 выключается, осуществляется переход к началу программы.

Цикл кончился — выключается насос и светодиод, счетчик counter сбрасывается, начинается цикл простоя до тех пор, пока counter<time_of_relax(к примеру 10 минут), опять же в это время проверяется на сухость нижний датчик, если нижний датчик сухой — то Реле и светодиод HL1 выключается, осуществляется переход к началу программы.

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

 

Скомпилированные прошивки в HEX.

При прошивке не забудьте установить  Фьюзы

 

v0.2:

-Сокращено время индикации включения.

-Во время работы насоса простое свечение светодиода заменено миганием.

-Короткий писк буззера перед началом простоя.

-Введена задержка от случайного включения от волн и всплесков, датчики должны пробыть в воде >2,5 секунд для включения реле.

PumpFullAutoController_20m_10m_v0_2

 

v0.1:

Работает — 20 секунд, простаивает — 10 секунд, нужна для подбора резистора датчиков:

PumpFullAutoController_20sec_10sec

 

Работает — 20 минут, простаивает — 10 минут:

PumpFullAutoController_20min_10min

 

Работает 10 минут, простаивает 10 минут:

PumpFullAutoController_10min_10min

 

Работает 10 минут, простаивает 5 минут:

PumpFullAutoController_10min_5min

 

 

 

Исходный код v0.2 (работа насоса — 20 минут, простой — 10 минут), для того чтобы настроить свое время работы — не нужны знания программирования, достаточно изменить значение переменных time_of_work и time_of_relax и скомпилировать исходный код в Atmel Studio в HEX, значение 3921 = 1 секунда, следовательно , если мы хотим , чтоб насос работал 1 час, то необходимо изменить переменную time_of_work на 14 115 600, так как в одном часе 3600 секунд, 3600 * 3921 прерывание = 14 115 600:

 

/*
* PumpFullAutoController.c
*Created: 23.08.2018 18:57:50
* 06.04.2019
* Author : LampCore.ru
*/
#define F_CPU 1000000UL
 
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
 
 volatile uint8_t top_sensor=0;
volatile uint8_t bottom_sensor=0;
volatile long flick=0; //для мигания светодиода во время работы
 
//uint8_t pump_work=0;
long counter=0;
 
 
 
//1 000 000 / 255 = 3 921,568627 прерываний в секунду
	ISR(TIMER0_OVF_vect)
	{
		// handle interrupt
		counter++;
 
		//для мигания светодиода
		flick++;
		if(flick>980){flick=0;}
 
	}
 
 
#define PUMP_ON PORTC |= (1<<PC5);//ON 
#define PUMP_OFF PORTC &= ~(1<<PC5);//Off 
 
 
#define LED_INDICATION_ON PORTB |= (1<<PB1);//ON 
#define LED_INDICATION_OFF PORTB &= ~(1<<PB1);//Off
 
#define BUZZER_ON PORTB |= (1<<PB0);//ON
#define BUZZER_OFF PORTB &= ~(1<<PB0);//Off
 
 
 
 uint8_t opust=0;
 
 
 
//2 sec //1sec
//long time_of_work=7844;
//long time_of_relax=3922;
 
 
//20sec
//10sec
//long time_of_work=78420; 
//long time_of_relax=39210;
 
 
 //20min
 //10min
 long time_of_work=4705200;
 long time_of_relax=2352600;
 
 
 //10min
 //10min
 //long time_of_work=2352600;
 //long time_of_relax=2352600;
 
 
 
 //10min
 //5min
 //long time_of_work=2352600;
 //long time_of_relax=1176300;
 
 
 //1hour
 //10sec
 //long time_of_work=14115600;
 //long time_of_relax=39210;
 
 
 
 
 uint8_t count_of_cycles=0;
 
int main(void)
{
 
  DDRC |= 1<<PC5;//Выход НА МОСФЕТ для вкл.реле
 
    DDRD |= 0<<PD2;//Вход верхнего датчика
    DDRD |= 0<<PD4;//Вход нижнего датчика 
 
 
   DDRB |= 1<<PB1;//Выход светодиода индикатора работы
   DDRB |= 1<<PB0;//Выход буззера
 
 LED_INDICATION_OFF;
 BUZZER_OFF;
 
 //Высокий уровень на ножках датчиков(как вода замкнет будет низкий уровень)
  PORTD |= (1 << PD2);
  PORTD |= (1 << PD4);
 
 
  TIMSK=(1<<TOIE0);//Разрешить выполнение прерываний по переполнению
  TCCR0 |= 0x01;//предделитель - 1
  sei();// Разрешить глобальные прерывания
 
 LED_INDICATION_ON;
 _delay_ms(500);
 LED_INDICATION_OFF;
 
  BUZZER_ON;
  _delay_ms(50);
  BUZZER_OFF;
 
    while (1) 
    {
 
 
 
		start:
		//нижний сенсор и верхний сенсор, если в воде
		//////////////задержка - защита от всплесков воды и волн - выждать 2,5 секунд
 
		if( ! (PIND & (1 << PD4))  &&    ! (PIND & (1 << PD2))  )
		{
			_delay_ms(2500);
 
			if( ! (PIND & (1 << PD4))  &&    ! (PIND & (1 << PD2)) ) { opust=1; } } if (opust) { count_of_cycles=0; cycle: //так как первый цикл=0, поэтому >2(итого 3 прохода - 0,1,2)
			if (count_of_cycles>2)
			{
				goto emergency;
			}
 
 
			//стечь каплям	и перейти на старт
			_delay_ms(1500);
			//если нижний датчик сухой
			if ((PIND & (1 << PD4)))
			{
				opust=0;
				PUMP_OFF;
				LED_INDICATION_OFF;
				goto start;
			}
 
 
 
			//Пищалка если сработали датчики
			for(int i=0;i<2;i++){
 
			BUZZER_ON;
			_delay_ms(620);
 
			BUZZER_OFF;
			_delay_ms(100);
 
			}
 
 
 
 
 
			//вкл светодиод
			LED_INDICATION_ON;
			//вкл насос
			PUMP_ON;
 
			//счетчик
			counter=0;
 
			//работать, пока не пройдет 20 минут
		do
		{	
			_delay_us(1);
 
			//мигать 4 раза в секунду 3921\8=490 //4-вкл 4-выкл
			if(flick<491){LED_INDICATION_ON;}
	        else{LED_INDICATION_OFF;}
 
 
 
		//если нижний датчик сухой
		if ((PIND & (1 << PD4)))
		{
			opust=0;
			PUMP_OFF;
			LED_INDICATION_OFF;
			goto start;
		}
 
 
		} while ( counter
Сохранить в соц.сети:

Оставить комментарий

avatar
  Подписаться  
Уведомление о