проект еще не завершен:
Не решено: закрытие и открытие штор по заданному времени и отображение температуры
Работает: открытие и закрытие штор с пульта и с кнопок
Задача:
1) Открытие и закрытие штор с IR пульта (от телевизора, неиспользуемыми кнопками)
2) Открытие и закрытие штор вручную (кнопкой на стене, используется кнопка от стеклоподъемника)
3) Открытие и закрытие штор в заданное время (время задается кнопками)
4) Отображение времени (на LCD дисплее 16х2)
4) Отображение температуры в комнате или на улице (на LCD дисплее 16х2)
Используется:
1. Arduino UNO R3
2. 16X2 LCD дисплей (подключен к PIN 12,11,5,4,3,2 Arduino и с самопальными кнопками по аналогии с LCD шилдом)
3. Модуль времени DS1307 (подключен к А4, А5 Arduino и с впаянным DS18B20 - цифровым датчиком температуры. Датчик подключен к PIN 9 Arduino)
4. Модуль LN298N (используется для управления коллекторным двигателем привода штор, подключен к PIN 0, PIN 1 Arduino)
5. Два геркона (для детектирования крайних положений: геркон1 - подключен к А1 Arduino , геркон2 - подключен к А2 Arduino)
6. Кнопка от стеклоподъемника, подключенная по аналогии с кнопками "select","right" к PIN A3 Arduino
7. IR приемник TSOP1138 (data подключен к PIN 13 Arduino)
8. Пульт от ТВ тюнера Beholder M6 (можно любой на 38кГц, большинство такие, у меня от ТВ-тюнера Beholder M6 )
9. Механика штор, на основе коллекторного двигателя от принтера и привода от сканера (фото позже будет)
10. Блок питания (импульсный, от блока зарядки minidv видеокамеры Panasonic NV-GS11: 8вольт, 16ватт. Используется для питания всей логики, подключено к разъему внешнего питания Arduino Uno и коллекторного мотора привода штор, подключено к модулю LN298N)
11.Корпуса, коннекторы и всякая мелочь
Конструкция модуля управления:
Примечание: пины 6,7,8,10 Arduino - свободны
1) Подключение LCD дисплея 16х2 (WINSTAR WH1602A, пример подключения этого индикатора)
Подстроечный резистор, это регулировка контрастности дисплея (10кОм)
2) Подключение модуля часов DS1307
Примечание: вывод "DS" модуля часов DS1307 - это вывод цифрового датчика температуры DS18B20, который изначально не впаян в плату модуля. (в данном проекте подключен к PIN 9 Arduino)
3) Подключение кнопок (так же как и в LCD шилде, для настройки времени и т.п.)
Все 5 кнопок подсоединены к аналоговому входу A0 по следующей схеме
4) Подключение кнопки стеклоподъемника (по аналогии кнопок LCD шилда, для ручного открытия и закрытия штор)
5) Подключение IR приемника TSOP1138 к Arduino Uno (для инфракрасного пульта)
6) Подключение модуля LN298N и коллекторного мотора привода штор
Скетч для Arduino Uno R3
не завершен (использовал два разных скетча)
Не решено: закрытие и открытие штор по времени и отображение температуры
Работает: открытие и закрытие штор с пульта и с кнопок
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal.h>
///////////////////////////////////////////
//////////////////////
#include <IRremote.h>
#include <IRremoteInt.h>
int RECV_PIN = 13; //пин подключения IR приёмника TSOP1138
int RELAY_PIN1 = 0; //пин подключения LN298N модуля
int RELAY_PIN2 = 1; //пин подключения LN298N модуля
//int BUTTON_PIN1 = A3; //пин выключателя1
//int BUTTON_PIN2 = A2; //пин выключателя2
int BUTTON_GER1 = A1; //геркон1
int BUTTON_GER2 = A2; //геркон1
byte knop(){ //// для кнопок вверх-вниз, двойная кнопка без фиксации
int val = analogRead(3);
if (val < 100) return 1;
else if (val < 800) return 2;
else return 0;
}
IRrecv irrecv(RECV_PIN);
decode_results results;
bool LampState = false;
unsigned long time = millis();
int lastButtonState;
int lastButtonState2;
bool LampState2 = false;
////////////////////////////////////////////
#define DS1307_I2C_ADDRESS 0x68
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const byte outPin = 10; // выход на реле (пока не используется, запасное)
byte setMinClockOn; //
byte setHorClockOn;
byte setMinClockOff; //
byte setHorClockOff;
byte key(){ //// для кнопок ЛСДшилда
int val = analogRead(0);
if (val < 100) return 5;
else if (val < 200) return 3;
else if (val < 400) return 4;
else if (val < 600) return 2;
else if (val < 800) return 1;
else return 0;
}
/////////// часы ..
byte decToBcd(byte val){
return ( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val){
return ( (val/16*10) + (val%16) );
}
void setDateDs1307(byte second, // 0-59
byte minute, // 0-59
byte hour, // 1-23
byte dayOfWeek, // 1-7
byte dayOfMonth, // 1-28/29/30/31
byte month, // 1-12
byte year) // 0-99
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.endTransmission();
}
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f);
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}
////
void setClock(){ // установка часов
byte pos = 1;
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
lcd.clear();
lcd.blink();
while(key() != 1){ // крутим цикл
byte KEY = key(); // читаем состояние кнопок
delay(200);
lcd.setCursor(1, 1);
lcd.print("set to save");
lcd.setCursor(0, 0); // выводим инфу
if (hour < 10) lcd.print("0");
lcd.print(hour);
lcd.print(":");
if (minute < 10) lcd.print("0");
lcd.print(minute);
lcd.print(" ");
if (dayOfMonth < 10) lcd.print("0");
lcd.print(dayOfMonth);
lcd.print("/");
if (month < 10) lcd.print("0");
lcd.print(month);
lcd.print("/");
if (year < 10) lcd.print("0");
lcd.print(year);
lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции
if (KEY == 5 && pos < 13) pos += 3; // крутим позицию
else if (KEY == 2 && pos > 1) pos -= 3;
else if (pos == 1 && KEY == 3) hour++; // крутим значения
else if (pos == 1 && KEY == 4) hour--;
else if (pos == 4 && KEY == 3) minute++;
else if (pos == 4 && KEY == 4) minute--;
else if (pos == 7 && KEY == 3) dayOfMonth++;
else if (pos == 7 && KEY == 4) dayOfMonth--;
else if (pos == 10 && KEY == 3) month++;
else if (pos == 10 && KEY == 4) month--;
else if (pos == 13 && KEY == 3) year++;
else if (pos == 13 && KEY == 4) year--;
if (hour > 23) hour = 0;
else if (minute > 59) minute = 0;
else if (dayOfMonth > 31) dayOfMonth = 0;
else if (month > 12) month = 1;
else if (year > 99) year = 0;
}// конец цикла
setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
lcd.noBlink();
lcd.clear();
lcd.print(" Saved");
delay(1500);
}///
void setOnOff(){
byte pos = 0;
lcd.clear();
lcd.blink();
while(key() != 1){ // крутим цикл
byte KEY = key(); // читаем состояние кнопок
delay(200);
lcd.setCursor(1, 1);
lcd.print("set to save");
lcd.setCursor(0, 0); // выводим инфу
if (setHorClockOn < 10) lcd.print("0");
lcd.print(setHorClockOn);
lcd.print(":");
if (setMinClockOn < 10) lcd.print("0");
lcd.print(setMinClockOn);
lcd.print(" ");
if (setHorClockOff < 10) lcd.print("0");
lcd.print(setHorClockOff);
lcd.print(":");
if (setMinClockOff < 10) lcd.print("0");
lcd.print(setMinClockOff);
lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции
if (KEY == 5 && pos < 9) pos += 3; // крутим позицию
else if (KEY == 2 && pos > 1) pos -= 3;
else if (pos == 0 && KEY == 3) setHorClockOn++; // крутим значения
else if (pos == 0 && KEY == 4) setHorClockOn--;
else if (pos == 3 && KEY == 3) setMinClockOn++;
else if (pos == 3 && KEY == 4) setMinClockOn--;
else if (pos == 6 && KEY == 3) setHorClockOff++;
else if (pos == 6 && KEY == 4) setHorClockOff--;
else if (pos == 9 && KEY == 3) setMinClockOff++;
else if (pos == 9 && KEY == 4) setMinClockOff--;
if (setHorClockOn > 23) setHorClockOn = 0;
else if (setMinClockOn > 59) setMinClockOn = 0;
else if (setHorClockOff > 23) setHorClockOff = 0;
else if (setMinClockOff > 59) setMinClockOff = 0;
}// конец цикла
lcd.noBlink();
lcd.clear();
EEPROM.write(0, setMinClockOn);
EEPROM.write(1, setHorClockOn);
EEPROM.write(3, setMinClockOff);
EEPROM.write(4, setHorClockOff);
lcd.print(" Saved");
delay(1500);
}///
void menu(){
lcd.clear();
char menuTxt[2][14] = {"set ON/OFF >>", "set clock >>"};
byte pos = 0;
while(1){
delay(200);
byte KEY = key();
lcd.setCursor(0, 0);
lcd.print(pos+1);
lcd.print(".");
lcd.print(menuTxt[pos]);
if (KEY == 3 && pos != 0) pos--;
else if (KEY == 4 && pos < 1) pos++;
if (KEY == 5 && pos == 0) setOnOff();
else if (KEY == 5 && pos == 1) setClock();
}
}
void setup(){
Wire.begin();
/////////////////////////////////////////////////////
pinMode(BUTTON_GER1, INPUT); //геркон1
digitalWrite(BUTTON_GER1, HIGH); //геркон1
pinMode(BUTTON_GER2, INPUT); //геркон2
digitalWrite(BUTTON_GER2, HIGH); //геркон2
pinMode(RELAY_PIN1, OUTPUT);
// pinMode(BUTTON_PIN1, INPUT);
digitalWrite(RELAY_PIN1, LOW);
// digitalWrite(BUTTON_PIN1, HIGH);
irrecv.enableIRIn(); // Включаем ресивер
// lastButtonState = digitalRead(BUTTON_PIN1);
pinMode(RELAY_PIN2, OUTPUT);
// pinMode(BUTTON_PIN2, INPUT);
digitalWrite(RELAY_PIN2, LOW);
// digitalWrite(BUTTON_PIN2, HIGH);
// lastButtonState2 = digitalRead(BUTTON_PIN2);
/////////////////////////////////////////////////////
lcd.begin(16, 2);
lcd.clear();
pinMode(outPin, OUTPUT);
digitalWrite(outPin, LOW);
setMinClockOn = EEPROM.read(0);
setHorClockOn = EEPROM.read(1);
setMinClockOff = EEPROM.read(3);
setHorClockOff = EEPROM.read(4);
}
void loop()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
// обработка кнопок
if (key() == 1) menu(); // если нажата селект
else if (key() == 3) digitalWrite(outPin, HIGH);
else if (key() == 4) digitalWrite(outPin, LOW);
// сравниваем время и управляем выходом//
if (setMinClockOff == minute && setHorClockOff == hour
&& second == 0) digitalWrite(outPin, LOW);
if (setMinClockOn == minute && setHorClockOn == hour
&& second == 0) digitalWrite(outPin, HIGH);
// lcd.clear();
lcd.setCursor(0, 0);
if (hour < 10) lcd.print("0");
lcd.print(hour);
lcd.print(":");
if (minute < 10) lcd.print("0");
lcd.print(minute);
// lcd.print(":");
// if (second < 10) lcd.print("0");
// lcd.print(second);
// lcd.setCursor(8, 0);
// lcd.print(" ");
lcd.setCursor(0, 1);
if (dayOfMonth < 10) lcd.print("0");
lcd.print(dayOfMonth);
lcd.print("/");
if (month < 10) lcd.print("0");
lcd.print(month);
lcd.print("/");
if (year < 10) lcd.print("0");
lcd.print(year);
//
lcd.setCursor(11, 0);
if (setHorClockOn < 10) lcd.print("0");
lcd.print(setHorClockOn);
lcd.print(":");
if (setMinClockOn < 10) lcd.print("0");
lcd.print(setMinClockOn);
lcd.setCursor(11, 1);
if (setHorClockOff < 10) lcd.print("0");
lcd.print(setHorClockOff);
lcd.print(":");
if (setMinClockOff < 10) lcd.print("0");
lcd.print(setMinClockOff);
lcd.setCursor(7, 0);
if (digitalRead(outPin)) lcd.print("ON ");
else lcd.print("Off");
delay(200); // нужно для нормальной работы кнопок
///////////////////////////////////////
if ((knop() == 1) && (millis() - time > 500))
{
LampState = !LampState;
if (LampState)
{
digitalWrite(RELAY_PIN1,HIGH);
digitalWrite(RELAY_PIN2,LOW);
}
else
{
digitalWrite(RELAY_PIN1,LOW);
}
time = millis();
// lastButtonState=digitalRead(BUTTON_PIN1);
}
if ((knop() == 2) && (millis() - time > 500))
{
LampState2 = !LampState2;
if (LampState2)
{
digitalWrite(RELAY_PIN1,LOW);
digitalWrite(RELAY_PIN2,HIGH);
}
else
{
digitalWrite(RELAY_PIN2,LOW);
}
time = millis();
// lastButtonState2=digitalRead(BUTTON_PIN2);
}
if (irrecv.decode(&results))
{
if (results.value == 1641465911) //Код 1 кнопки ИКпульта
{
LampState = !LampState;
if (LampState)
{
digitalWrite(RELAY_PIN1,HIGH);
digitalWrite(RELAY_PIN2,LOW);
}
else
{
digitalWrite(RELAY_PIN1,LOW);
}
}
if (results.value == 1641453671) //Код 2 кнопки ИКпульта
{
LampState2 = !LampState2;
if (LampState2)
{
digitalWrite(RELAY_PIN1,LOW);
digitalWrite(RELAY_PIN2,HIGH);
}
else
{
digitalWrite(RELAY_PIN2,LOW);
}
}
irrecv.resume(); // Получаем следующее значение
}
if (digitalRead(BUTTON_GER1)==LOW && digitalRead(RELAY_PIN1)==HIGH)
{
digitalWrite(RELAY_PIN1,LOW);
digitalWrite(RELAY_PIN2,LOW);
}
if (digitalRead(BUTTON_GER2)==LOW && digitalRead(RELAY_PIN2)==HIGH)
{
digitalWrite(RELAY_PIN1,LOW);
digitalWrite(RELAY_PIN2,LOW);
}
///////////////////////////////////////
///////////////////////////////////////
}
Использованные материалы:
https://www.youtube.com/watch?v=V8ScYJGU00o
|