Немного вступления:
Приехал на выходных к родителям в деревню , ну все как обычно, помогал, делал, и тут Отец меня попросил провести розетку в погреб !?
Ну я естественно спросил у него зачем почему да для чего.
Чтоб не померзла картошка и не полопались банки с консервацией в погребе.
Ну так вот, оказывается мои родители каждую зиму контролировали температуру в погребе , ставили чашку с водой на дно погреба, и каждый день лазили туда и смотрели не замерзла ли вода или нет ли ледяной корочки.
Погреб то у них на улице вырыт а не под домом. Если вода подмерзала или появлялась ледяная корочка то они спускали в погреб электрический обогреватель и включали на некоторое время чтобы погреб прогрелся.
Индикатором прогревания погреба была все та же вода в чашке, как растаяла, пора выключать обогреватель.
Нууу, я минут так на пять призадумался и сказал - зачем вы это терпели и почему раньше не сказали мне !
Ну и я сразу же предложил Отцу автоматизировать этот процесс, да и еще добавить несколько наворотов.
Отец не отказался сказал - ДЕРЗАЙ!
Поехали:
Термореле на Ардуино с LCD и контролем протечки воды
Для изготовления термореле с индикатором уровня или наличия воды нам понадобиться следующее:
- Контроллер Ардуино УНО, НАНО или ПРО мини.
Дисплей LCD 1602
Датчик температуры 18b20
Модуль реле 5 В 1 канал
Корпус
Блок питания
Монтажные провода
Паяльник, припой и прямые руки
После приобретения всех комплектующих вот тут http://newmar.ru я сразу же принялся оживлять дисплей 1602, в интернете полно библиотек для Ардуино ИДЕ для работы с этим дисплеем.
Для его подключения мне пригодилась библиотека LicuidCrystal.
После того как на дисплее у меня высветилась надпись Hello world!
Я начал подключать датчик 18b20.
С ним оказалось все еще проще.
Библиотека OneWire как раз для него, кроме того таких датчиков можно подключить целую гирлянду, и все они будут работать на общей шине по протоколу OneWire.
С остальным все еще проще.
Для включения - выключения реле и бузера нам понадобится стандартный пример Blink из Ардуино ИДЕ,
Ну и для определения сопротивления воды понадобится пример AnalogRead.
Вот собственно и все, теперь осталось сляпать все это в один скетч, подключить всю "рассыпуху" к Ардуине , залить скетч в Ардуину и наслаждаться
Вот что у меня из этого получилось:
- Код: выделить все
#include <OneWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int DS18S20_Pin = 7;
const int analogInPin = A2;
int sensorValue = 0;
//Temperature chip i/o
OneWire ds(DS18S20_Pin); // on digital pin 7
void setup(void) {
Serial.begin(9600);
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("TERMOMETR");
}
void loop(void) {
float temperature = getTemp();
sensorValue = analogRead(analogInPin);
Serial.println(sensorValue);
Serial.println(temperature);
lcd.setCursor(0, 1);
lcd.print(temperature);
lcd.print("c ");
delay(50);
if (temperature<=2){
lcd.print("T-BKL");
digitalWrite(9, HIGH);
} else {
lcd.print("T-OTKL");
digitalWrite(9, LOW);
};
if (sensorValue>200){
digitalWrite(8, HIGH);
delay(50);
digitalWrite(8, LOW);
} else {
};
}
float getTemp(){
//returns the temperature from one DS18S20 in DEG Celsius
byte data[12];
byte addr[8];
if ( !ds.search(addr)) {
//no more sensors on chain, reset search
ds.reset_search();
return -1000;
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return -1000;
}
if ( addr[0] != 0x10 && addr[0] != 0x28) {
Serial.print("Device is not recognized");
return -1000;
}
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end
byte present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for (int i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
ds.reset_search();
byte MSB = data[1];
byte LSB = data[0];
float tempRead = ((MSB << 8) | LSB); //using two's compliment
float TemperatureSum = tempRead / 16;
return TemperatureSum;
}