Датчик контроля протечки воды ch-c0020

Просмотров: 1861


ch-c0020_vvКак здорово летом под теплым дождем с тобою вдвоем оказаться. Как классно по лужам бежать босиком, с тобою играть и смеяться! Но совсем грустно оказаться под таким дождем, который течет с потолка… 
И хорошая мысля – приходит опосля…

 

 

В настоящее время одним из основных элементов домашней автоматики стал контроль над протечкой воды. Протечка воды 

prot_02

может произойти по разным причинам: из-за повреждения водоснабжения у вас или у соседа свыше, или из-за простой случайности, но всегда это довольно неприятное событие. Для того,  чтобы обезопасить
себя от такого рода событий  был разработан этот проект. Он предусматривает два типа устройств:prot_01

 

 

 – датчик для работы в комплексе с модулем управления аварийным клапаном kranik_NSводоснабжения. – автономный датчик протечки воды со звуковой сигнализацией – это для тех, у кого пока нет возможности поставить аварийный клапан для отсечки воды, но есть желание получить, хотя бы  звуковую сигнализацию.

В качестве основы проекта был выбран микроконтроллер PIC-контроллер PIC10F222  в корпусе MicrochipPIC10FSOT-23. Это самый маленький  и самый простой контроллер.prot_03

PIC10F222Он имеет четыре порта ввода/вывода, на “борту” есть АЦП, что вполне достаточно для создания датчика контроля протечки воды.

Для первого варианта датчика предусмотрим возможность установки звукоизлучателя (пищалки), а также светодиода индикации. Для второго варианта – выходы индикации работы датчика и сигнал аварии. Этот проект рекомендуется также для начинающих разработчиков, кто впервые столкнулся с программированием  микроконтроллеров.

Отступление от темы: Почему микроконтроллер, а не операционный усилитель или компаратор. Во первых – наше время – время микроконтроллеров; во вторых -аналоговые устройства подразумевают наличие потенциометров для настройки параметров, “уход нуля” – может со временем приводить к необходимости регулировки чувствительности датчика, что крайне нежелательно для такого рода устройств. При этом чувствительность может возрасти (вызовет ложное “срабатывание” аварии) или наоборот уменьшится (датчик не сработает когда начнется потоп!), а АЦП избавлен от причуд “плавания нуля” – поэтому и выбрали микроконтроллер и ещё плюс – решение всех проблем с логикой работы датчика.


Принцип контроля протечки воды

Принцип на котором будет работать датчик – это измерение падения напряжения между контактами (электродами), которые будут контролировать наличие воды. Датчик будет иметь 4 ножки (электрода), на которых он будет стоять на полу. Любая трубопроводная вода содержит большое количество солей, что делают её проводящей электричество. Построим делитель напряжения на резисторах R1 и R2,  и подключим электроды к одному из резисторов. В “сухом” состоянии, при одинаковых резисторах, мы будем иметь 2,5 V на резисторе R2 (питание 5 V). При попадании воды в зону электродов суммарное сопротивление (электроды + резистор R2)  начнет уменьшаться, что приведет к понижению напряжения на делителе. Задав уровень аварийного порога и гистерезис, мы по изменению величины напряжения на резисторе R2 сможем контролировать протечку воды.

Теперь надо разобраться, как это будет понимать сам микроконтроллер. У микроконтроллера PIC10F222 8-битный АЦП. Опорными напряжениями для него служат Vcc и Vss, т.е. он может оцифровывать напряжения в диапазоне напряжения питания 0-5 V. Это значит, что он делит этот диапазон на 256 значений. При чтении данных из регистра АЦП – ADRES мы сможем получить значение от 0 до 255.princyp-1024x749

Если для делителя мы выбрали резисторы с одинаковым сопротивлением, то получим 2,5 V (приблизительно). 2,5 V для АЦП даст нам на выходе число 2,5/(5/256)=128. Это значит, что в “сухом” состоянии с АЦП будем считывать значение 128. При “замыкании” электродов водой напряжение естественно будет понижаться. Вопрос насколько? Все это можно выяснить только экспериментальным путем. Берем вольтметр, подключаем к электродам датчика, включаем питание и меряем напряжение. В “сухом”  состоянии у меня было 2,43 V, при замыкании контактов пальцами руки, напряжение понижалось до 2,1 V. Это значит, что для микроконтроллера мы будем иметь значение “сухое” – 124, и так называемое “мокрое” – 107. Это изменение на сопротивление пальцев руки, для воды оно будет значительней, но и этих данных достаточно для задания параметров работы микроконтроллера. Выберем порог срабатывания 100 и гистерезис 5. Гистерезис необходим для создания зоны устойчивости в районе порога срабатывания. Это значит, что Авария “сработает” когда значение получаемое от АЦП станет ниже 100-5=95 и отключится – когда станет выше 100+5=105.

О понятии  параметра “чувствительность датчика” можно сказать, что чем мы ниже понижаем порог, тем меньше его чувствительность. Чем больше гистерезис, тем больше защита от помех. Но все хорошо в меру. У нас верхний теоретический порог 128, на практике он может быть выше или ниже (все зависит от точности напряжения стабилизации стабилизатора, и погрешности величины сопротивлений выбранных нами резисторов). Визуальное расположение уровней контроля должно быть таким как на рисунке.uroven

Реально датчики работали с уровнем контроля напряжения –  80 и гистерезисом  – 20. Эти параметры зависят только от интуиции и опыта разработчика.


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

ch-c0020-schem

На основании рассмотренных выше рассуждений спроектируем схему. Остановимся на некоторых особенностях. Соединитель CON1 предназначен для внутрисхемного программирования микроконтроллера. Это избавит от проблемы предварительного программирования контроллера перед пайкой. Для защиты аналогового входа установим диодную сборку BAT54S. Измерительный делитель выполним на резисторах R3 и R5 величиной 510 кОм (этим делителем определяется и входное сопротивление датчика, т.е. его электрическая чувствительность). Для фильтрации установим конденсатор C1 величиной 0,1-0,47 мкФ. Через резистор R2 величиной 10 кОм подадим сигнал на вход AN0. Цифровой порт GP1 будем использовать для индикации работы датчика. Сделаем так: если светодиод медленно мигает, значит, датчик работает, если мигает быстро, то  обнаружена протечка воды. Такой алгоритм работы необходим, чтобы можно было легко контролировать работоспособность датчика. Для автономного датчика вывод GP2 будет управлять звуковым сигналом. Алгоритм работы следующий:  если молчит, то нет протечки, а если раздается периодический сигнал, то это значит, что есть  протечка воды. Если “попискивает” –  была протечка.

Сброс аварии и возврат в дежурный режим выполняется отключением питания. На выходе портов предусмотрим транзисторные ключи для возможности подключения исполнительных устройств типа реле. Питание датчика выберем стандартное для сырых помещений – 12 V, для этого на плате предусмотрим место для стабилизатора, учитывая разные варианты корпусов TO-92 или SOIC-8. Для защиты от неправильного подключения и наводок высокого напряжения на сигнальный кабель  установим цепочку защиты D2, R9, ST3.


Корпус для датчика

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


Печатная плата ch-c0020pcb

Печатная плата изготовлена с возможностью установки в корпус Z-65.


Габаритные размеры платы и сборочный чертеж

ch-c0020-montag

Форма платы предусматривает возможность крепления кабеля пластиковым зажимом и установку тактовую кнопки (в этом проекте не используется). Есть контакты для внутрисхемного программирования контроллера, что удобно и в изготовлении и на этапе проектирования, разработки и отладки.


Комплектующие для самостоятельной сборки

В таблице приведен тип, необходимое количество деталей для сборки датчика, а также ссылки, по которым можно реально приобрести детали.

Наименование Типоразмер Тип Количество Примечание
Стабилизатор SOIC-8 (TO-92) 78L05 1 ST1(ST2)
Микроконтроллер SOT-23 PIC10F222 1 PIC1
Транзистор SOT-23 BC847C 1 FT1
Диодная сборка SOT-23 BAV70 1 D1
Диодная сборка SOT-23 BAT54S/BAT64-04 1 J1*
Стабилитрон SOT-23 BZX84-C20V 1 J1*
Звукоизлучатель Ф9мм KPX1212B 1 J1*
Конденсатор 0805 0,47х25v или (0,1х50v) 1 C1
Конденсатор 0805 0,1х50v 3 C3,C4,C6
Эл.конденсатор А 4,7х35v 1 C2
Эл.конденсатор С 100х16v 1 C5
Резистор 0805 510 кОм 2 R3,R4
Резистор 0805 10 кОм 3 R2,R8,R7
Резистор 0805 22 1 R9
Светодиод красный 0805 Светодиод 3мм FYL-3014 HD Красный матовый 3mcd 1 LD1
Печатная плата ch-c020pcb 1
Корпус Z-65 1

Последовательность сборки датчика

Сборку датчика контроля протечки воды начинайте с запайки PIC-контроллера и стабилизатора напряжения. Далее запаяйте керамические конденсаторы и резисторы. Следующими  идут диодные сборки, стабилитрон, и транзисторы. В конце мы запаиваем электролитические конденсаторы и “пищалку”. На этом сборка платы закончена, остается запрограммировать контроллер и запаять сигнальный кабель.

ch-c0020_vv01Рекомендуемые винты и гайки для крепления платы. Винты используются в качестве электродов.

ch-c0020_vv03


Программирование

Для программирования мы будем использовать стандартный соединитель. Необходимо скачать в конце статьи программу или HEX-файл и “прошить” контроллер.

Назначение выводов смотрите на принципиальной схеме или в описании платы.

Для программирования PIC-контроллера рекомендуется использовать внутрисхемный отладчик09974-_03  MPLAB ICD3 или программатор-отладчикpickit3_simple PICkit 3 . Они автоматически заботятся о сохранении заводской калибровочной константы.

Программа

В контроллере PIC10F2xx есть одна особенность, у них нет системы прерываний, поэтому программа представляет собой один непрерывный последовательный цикл. Этот вариант программирования удобен для начинающих программистов. На этом примере постараемся разъяснить построение простой (и может первой) программы на PIC-контроллере. Для программирования используется среда MPLAB 8.83 и компилятор С HI-TECH C Compiler for PIC10/12/16 MCUs (PRO Mode) V9.83. Почему сразу С? Потому, что язык С в понимании проще  для начинающих.

Как строится программа? Все наши действия вытекают из нашего тех. задания,  которые мы изложили в начале.

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

//---------------------------------------------------------------------------
// конфигурирование контроллера
__CONFIG(
 IOSCFS_8MHZ 	& 				// Тактовый генератор на 8 MHz
 MCPU_OFF		&				// Pull-up резистор отключен
 WDTE_ON		&				// Сторожевой таймер включен
 CP_ON			&				// Защита кода включена
 MCLRE_ON);						// Вывод GP3/MCLR настроен на функцию MCLR
//---------------------------------------------------------------------------

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

//---------------------------------------------------------------------------
// Описание переменных
bit	BEEP,						// флаг аварии протески
ALARM;							// флаг состояния порога контроля АЦП 

int timer,						// таймер формирующий длительность светового индикатора
dlitel,							// переменная формирующая период мигания светового индикатора
timerBeep,						// таймер формирующий длительность звукового сигнала
dlitelBeepOFF,dlitelBeepON;		// переменная формирующая период звукового сигнала
//---------------------------------------------------------------------------

Следующий шаг, это определения или описания наших констант.

//---------------------------------------------------------------------------
// определения
#define		LED		GP1			// порт индикации 
#define		OUT		GP2			// выход управления 

#define		POROG	95			//100 80
#define		GISTER	5			//5 20
#define _XTAL_FREQ 	8000000		// для __delay
//---------------------------------------------------------------------------

Теперь сама программа. В начале программы мы проводим настройку основных рабочих регистров контроллера – это OPTION, затем настройку порта ввода/вывода, регистры  TRISGPIO и GPIO. А так как в нашем датчике главную роль играет АЦП, то и его настройка. Обратите внимание, у нас в регистре конфигурации включен сторожевой таймер, это такой модуль микроконтроллеров, который  предназначен для борьбы с возможным сбоем работы программы. От чего возможен такой сбой? Работа самой программы зависит не только от программного кода записанного в контроллер, а также и от данных находящихся в ОЗУ контроллера. Если сама программа из-за свойств FLASH памяти относительно надежно защищена, то ОЗУ более подвержено электромагнитным помехам. Принцип контроля работоспособности программы при помощи сторожевого таймера основан на том, что нормально работающая программа должна в своем основном цикле постоянно  сбрасывать в ноль (специальной командой) сторожевой таймер. Если программа “зависла”, то нарушается работа основного цикла и таймер не обнуляется. Через определенное время происходит переполнение сторожевого таймера, которое приводит к аппаратному рестарту контроллера. Программа запускается сначала и нормальная работа контроллера возобновляется. Поэтому для  работы программы  без сбоев  необходимо расположить команды сброса сторожевого таймера в главном цикле программы.


//---------------------------------------------------------------------------
// сама программа
void main(void)
{
// Настройка контроллера
	CLRWDT(); 					//сброс сторожевого таймера +++++++++++++++++++++- 
// загрузку калибровочной константы си берет на себя
// обнуление порта (правда Си тоже это делает)
	GPIO=0;
// настройка регистра OPTION
	OPTION=0b11001111;
//			 |||||+++--- PS<2:0>: настройка предделителя
//			 ||||+------ PSA: пределитель подключен к сторожевому таймеру
//			 |||+------- T0SE: счет по фронту импульса на входе T0CKI
//			 ||+-------- T0CS: вход таймера подключен к внутренему генератору
//			 |+--------- GPPU: подтягивающие резисторы на GP0, GP1, GP3 отключены
//           +---------- GPWU: побуждение по входам GP0, GP1, GP3 отключено

//  настройка портов ввода вывода
  TRISGPIO=0b11111001;
//			 |||||||+--- GP0: вход
//			 ||||||+---- GP1: выход
//			 |||||+----- GP2: выход
//			 ||||+------ GP3: вход
//			 ++++------- не используются

// настройка АЦП
	ADCON0=0b01000001;
//			 |||||||+--- ADON: АЦП включен
//			 ||||||+---- GO/DONE: статус и запуск конвертирования
//			 ||||++----- CHS<1:0>: АЦП подключен к входу GP0/AN0
//			 ||++------- не используются
//			 |+--------- ANS0: вывод GP0/AN0 настроен как аналоговый
//			 +---------- ANS1: вывод GP1/AN1 настроен как цифровой

	CLRWDT(); 					//сброс сторожевого таймера +++++++++++++++++++++- 
//---------------------------------------------------------------------------

Перед запуском основного цикла необходимо, чтобы все электрические цепи нашей схемы пришли в “нормальное” состояние. У нас есть одна цепь на входе АЦП, которая содержит емкость. Это значит, что ей нужно время, чтобы она зарядилась до необходимого уровня. Если не сделать задержку, то после подачи питания, когда программа войдет в основной цикл, напряжение не успеет на конденсаторе C1 подняться до необходимого уровня. Измеренное напряжение окажется низким и это будет расценено как аварийная ситуация. Для устранения выдачи ошибочной аварии при включении питания вводится цикл ожидания.

//---------------------------------------------------------------------------
// задежка необходимая для заряда входной емкости фильтра
// после подачи питания
	timerBeep++;				// 
	while(timerBeep)			//
	{
		GO=1;					// включить конвертирование
		while(GO);				// ожидание окончания конвертирования
		timerBeep++;			// 
	}
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// главный цикл работы
	while(1)
	{
		CLRWDT(); 				//сброс сторожевого таймера +++++++++++++++++++++- 	
//--------------------------------------------------------------------
// измерение потенциала между электродами		
		GO=1;					// включить конвертирование АЦП		
		while(GO);				// ожидание окончания конвертирования		
//--------------------------------------------------------------------
// определения состояния аварии		
		if (ADRES<POROG-GISTER)	// сравниваем полученное значение из АЦП
		{
			if (ALARM==0)       // если небыло аварии
			{
				ALARM=1;       	// установить аварию
				dlitel=5000;	// задаем длительность мигания светодиода индикатора
				timer=0;		// инициализация таймера индикации светодиода
			}
		}
		else if (ADRES>POROG+GISTER)	// сравниваем полученное значение из АЦП
		{	
			if (ALARM==1)       // если была аварии
			{
				ALARM=0;       	// сбросим аварию
				dlitel=60000; 	// задаем длительность мигания светодиода индикатора
				timer=0;		// инициализация таймера индикации светодиода
			}					
		}
//--------------------------------------------------------------------
// управление светодиодом-индикатором контроля работы датчика		
		timer++;
		if(timer==dlitel && LED==0) // если светодиод отключен и timer==dlitel
		{
			LED=1;					// выключить светодиод
			timer=0;				// инициализация таймера индикации светодиода
		}	
		else if(timer==dlitel && LED==1) // если светодиод включен и timer==dlitel
		{
			LED=0;					// включить светодиод
			timer=0;				// инициализация таймера индикации светодиода
		}				
//--------------------------------------------------------------------
// управление зуммером - подачей звукового сигнала
		if(ALARM==1)BEEP=1;			// защелка сигнала аварии

		if(BEEP==1)					// если была авария
		{		
			if(BEEP==1 && ALARM==1)	// проверим состояние авария и защелка
			{
				 dlitelBeepOFF=20000;// равномерный сигнал
				 dlitelBeepON=20000;
			}
			else
			{
				 dlitelBeepOFF=65000;// "попискивание"
				 dlitelBeepON=1000;
			}				 
			// формирование звукового сигнала	 			
			timerBeep++;
			if(timerBeep==dlitelBeepOFF && OUT==0)
			{
				OUT=1;
				timerBeep=0;
			}	
			else if(timerBeep==dlitelBeepON && OUT==1)
			{
				OUT=0;
				timerBeep=0;
			}
		}	
	}
//---------------------------------------------------------------------------	

}//end programm===============================================================

Естественно все мысли по созданию программы трудно полностью изложить. Многое подскажут комментарии. А все остальное можно обсудить на форуме.

Описание программы для второго типа датчика не приводится, чтобы не перегружать статью. В нем только различаются функции управления выходами. Сигнал индикаторного светодиода выводится на модуль управления. В режиме  ожидания –  подмигивает, показывает, что датчик исправен и работает. Авария – быстрое мигание. Состояние после аварии – медленное мигание. Сигнал управление реле – в режиме ожидания разомкнут, авария и после аварии – замкнут. Сама программа еще проще.


Тестирование прототипа датчика.

 


Заказать в интернет-магазине Ворон.

Печатная плата ch-c0020pcb ch-c0020pcb_25


Файлы для загрузки

Схема датчика (полная) — формате[wpdm_file id=118 template=”link-template-calltoaction3.php”]Схема датчика (автономный) – формате[wpdm_file id=119 template=”link-template-calltoaction3.php”]Ch-C0020 — Схема Датчика (Для Модуля Управления Аварийным Клапаном Водоснабжения[wpdm_file id=120 template=”link-template-calltoaction3.php”]Ch-C0020 — Сборочный Чертеж Плат[wpdm_file id=121 template=”link-template-calltoaction3.php”]Ch-C0020 — Прошивка A[wpdm_file id=122 template=”link-template-calltoaction3.php”]Ch-C0020 — Прошивка S[wpdm_file id=123 template=”link-template-calltoaction3.php”]Ch-C0020 — Проект[wpdm_file id=124 template=”link-template-calltoaction3.php”]



Это может быть интересно


  • Toyota Auto Fader – Модуль включения усилителяToyota Auto Fader – Модуль включения усилителя
    Просмотров: 1812 Toyota Auto Fader – Модуль включения усилителя. Часто автолюбители прибегают к замене штатного головного устройства на универсальное мультимедийное, в котором значительно расширены функциональные возможности. Если возникает желание оставить …
  • OLED RET012864E/REX012864JOLED RET012864E/REX012864J
    Просмотров: 1358 RET012864E/REX012864J ОЛЕД индикатор производитель Raystar-Optronics приобретался в http://www.microchip.ua/ к сожалению никакой информации на сайте поставщика нет. Поэтому решил работу с этой версией индикатора на драйвере SSD1305 предоставить на своем сайте. Так как …
  • Проект с использованием MCC часть 06Проект с использованием MCC часть 06
    Просмотров: 1136 Изменим схему следующим образом добавим две тактовые кнопки BT1 и BT2. Теперь переключимся на конфигурацию выводов, для этого сделаем двойной клик в окне Ресурсы проекта на Pin Module. …
  • Регулятор влажности ch-3800Регулятор влажности ch-3800
    Просмотров: 1334   И еще один проект на плате ch-c3xxx –  универсальный регулятор влажности ch-3800. Регулятор позволяет работать как в режиме индикатора влажности, так и в режиме регулятора. Рабочий диапазон …
  • Проект с использованием MCC часть 11Проект с использованием MCC часть 11
    Просмотров: 743 Можно несколько облагородить программу вынести наши процедуры обработки нажатия кнопок в отдельные функции. Но вы должны понимать, что это хоть и не значительно, но будет тормозить общую скорость …
  • ch-4060 – регулятор температуры и влажности на датчике DHT11/DHT22/AM2302ch-4060 – регулятор температуры и влажности на датчике DHT11/DHT22/AM2302
    Просмотров: 2290 На плате ch-4000 очень легко собрать устройство регулятора температуры и влажности. Датчик DHT11  самый недорогой вариант для создания такого устройства, правда точность его не велика, но для бытовых устройств …
  • NeoPixel LED and PIC24NeoPixel LED and PIC24
    Просмотров: 505 Популярность однопроводной шины для управления светодиода типа WS2812 не ослабевает, а новые типы светодиодов в корпусах 3,5*3,5мм, 2,0*2,0мм становяться все больше привлекательными. Построение дисплеев для анимации требуют все …
  • MCC PIC24 – модуль REAL-TIME CLOCK AND CALENDAR (RTCC)MCC PIC24 – модуль REAL-TIME CLOCK AND CALENDAR (RTCC)
    Просмотров: 355 RTCC предоставляет пользователю часы реального времени и функция календаря (RTCC), точность “хода” может быть откалибрована. Основные особенности модуля RTCC: • Работает в режиме глубокого сна. • Возможность выбора источника …
  • Цифровой спидометр для автомобиляЦифровой спидометр для автомобиля
    Просмотров: 10070  Универсальность печатной платы ch-c0030pcb позволяет создавать на её основе разнообразные устройства. Одним из таких устройств является электронный спидометр для автомобиля, в котором можно задать два компаратора скорости, например,  для …
  • Дисплей KD035C-3A подключение и управлениеДисплей KD035C-3A подключение и управление
    Просмотров: 627 Дисплей KD035C-3A производиться компанией SHENZHEN STARTEK ELECTRONIC TECHNOLOGY CO.,LTD Характеристики Параметр Спецификация Единицы измерения Размер дисплея 70.08(H)*52.56(V) (3.5inch) mm Тип дисплея TFT active matrix Цветовая гамма 65K/262K colors Разрешение …



Поделись этим!

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.