Часть 3 - Датчик протечки воды - Пишем программу

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

Чем хорош микроконтролер в подобных задачах?
Если взять транзистор с большим коэфициентом усиления, то тоже все будет работать, нужно будет еще пару транизсторов добавить для цепи сброса esp12e. Цена и там и там будет не большая, учитывая, что это делается не большим тиражом, можно цену опустить. Но применяя микроконтроллер имеем куда большую гибкость, и это очень важно.
Данный проект может служить другим типом датчика, например датчиком открытия и закрытия двери. Микроконтроллер имеет возможность проснуться по смене уровня напряжение на его пине, и для переделки под этот вид срабатывания, нужно будет просто модифицировать программу. В случае с транзистором, это уже будет сложнее, еще больше паять мелких деталей, и все это больше занимает места.

Код программы для attiny13 приведен ниже, он работает следующим образом.

???
Описание будет позже
???

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76

#include <avr/sleep.h>
#include <avr/interrupt.h>

const int resetPin = 3;
const int statusLED = 2;
const int waterSensorPin = 0;
const int dublerOutputWaterPin = 1;

bool oneTimeCallExecuted = false;

void setup() {

pinMode(resetPin, INPUT);
digitalWrite(resetPin, HIGH);

pinMode(statusLED, OUTPUT);
pinMode(dublerOutputWaterPin, OUTPUT);
}

void sleep() {

GIMSK |= _BV(PCIE);
PCMSK |= _BV(PCINT0);
ADCSRA &= ~_BV(ADEN);
set_sleep_mode(SLEEP_MODE_PWR_DOWN);

sleep_enable();
sei();
sleep_cpu();

cli();
PCMSK &= ~_BV(PCINT0);
sleep_disable();
ADCSRA |= _BV(ADEN);

sei();
}

ISR(PCINT0_vect) {
}

void loop() {

digitalWrite(dublerOutputWaterPin, !digitalRead(waterSensorPin));

if (!oneTimeCallExecuted) {
pinMode(resetPin, OUTPUT);
digitalWrite(resetPin, LOW);

digitalWrite(statusLED, HIGH);
delay(1000);
digitalWrite(statusLED, LOW);
digitalWrite(resetPin, HIGH);

delay(1000);
pinMode(resetPin, INPUT);
digitalWrite(resetPin, LOW);

oneTimeCallExecuted = true;
} else {
digitalWrite(statusLED, !digitalRead(statusLED));
delay(100);
}

if (digitalRead(waterSensorPin) == HIGH) {
oneTimeCallExecuted = false;
digitalWrite(statusLED, LOW);
digitalWrite(dublerOutputWaterPin, !digitalRead(waterSensorPin));

sleep();

// delay in order to have time for reset
delay(2000);
}
}

Для настройки режима просыпания по прерыванию очень помогла эта статья
ATTiny85 Wake from Sleep on Pin State Change Code Example
https://bigdanzblog.wordpress.com/2014/08/10/attiny85-wake-from-sleep-on-pin-state-change-code-example/

Еще интересный проект Tiny Door and Window Sensor/Alarm with Ultra Low Standby Power (<1µA)
https://github.com/8n1/ESP8266-Tiny-Door-and-Window-Sensor

Для удаленного оповещения был выбран wifi модуль esp12e. Код в него может залит любой, при старте делающий запрос на ваш сервер. В запросе стоит указать состояние пина указавающего о состоянии датчика воды. Код для esp12 приводиться не будет.

Спасибо за внимание

Share