Добавление Клавиатуры и кода в проект.
- Войдите на сайт для отправки комментариев
Доброго времени суток камрады! Возник вопрос по техническому проекту. Есть готовый и прекрасно работающий проект. Таймер который работает на убывание ( по умолчанию установлен час ). Когда собирался данный проект сразу встал вопрос и возможности запуска и отключения таймера с клавиатуры( рассматривался вариант как 4 кнопочной мебраны так и стандартной матрицы на 12 кнопок. Но оказалось что пинов банально не хватает на все мои хотелки и пищалки. От мебраны пришлось отказаться.
Исходя из общего планы и самого кода,сейчас возможно добавить мебрану и возможность запуска и отключения таймера? ( Желательно иметь админ доступ для простой смены пароля активации-дезактивации. ) Того человека который писал скетч и разрабатывал всю конструкцию сейчас банально нет,а вот улучшить конструкцию очень хотелось бы. Это вообще возможно?
( Пины 9-10-11-12 это провода на обрыв. При прерывании провода включается реле. Технически 3 пина не нужны,хватает оставить 1 )
Заранее благодарен за помощь.
/*
* Autorius: Donatas Juska
*/
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //LCD pinai (neliesti)
int timerSetup = 3600; //Laikas sekundemis 3600 = 1 valanda
int buzzerPin = 13; //Garsiakalbio pinas
int relayPin = 8; //Reles pinas
int wire1Pin = 9; //1 laido pinas
int wire2Pin = 10; //2 laido pinas
int wire3Pin = 11; //3 laido pinas
int wire4Pin = 12; //4 laido pinas
const int timeLeftScreen = 4; //Per kiek langeliu nuo kaires puses bus rodomas laikas (standartiskai 4)
const int timeRemainingScreen = 1; //Per kiek langeliu nuo kaires puses bus rodomas "Kiek liko laiko" (standartiskai 1)
int wire1State, wire2State, wire3State, wire4State; //Neliesti!
int run5sec = 1; //Neliesti turi buti 1!
int runTimer = 1; //Neliesti turi buti 1!
int hours, minutes, seconds;
void setup() {
pinMode(buzzerPin, OUTPUT);
pinMode(relayPin, OUTPUT);
pinMode(wire1Pin, INPUT);
pinMode(wire2Pin, INPUT);
pinMode(wire3Pin, INPUT);
pinMode(wire4Pin, INPUT);
lcd.begin(16, 2);
}
void loop() {
if(runTimer == 1){
digitalWrite(relayPin,HIGH); //Reles busena tik paleidus programa gali buti HIGH = Ijungta, LOW isjungta pvz.: digitalWrite(relayPin,LOW) arba digitalWrite(relayPin,HIGH)
lcd.clear();
lcd.setCursor(timeRemainingScreen,0);
lcd.print("TIME REMAINING"); //Tekstas kai eina laikas (butina pakeisti dar ir apacioje) (tekstas rasomas tarp dvigubu kabuciu)
timer();
} else {
if (run5sec == 1) {
digitalWrite(relayPin,LOW); //Reles busena kai pasibaigs laikas
delay(5000); //Laikas milisekundemis kiek laiko buna atidaryta arba uzdaryta rele 1000 = 1 sekunde
digitalWrite(relayPin,HIGH); //Reles busena kai praeis 5 sekundes
run5sec = 0;
}
}
runTimer = 0;
lcd.noDisplay();
delay(250);
for(int duration = 0; duration < 100; duration ++){
digitalWrite(buzzerPin, HIGH);
delayMicroseconds(500);
digitalWrite(buzzerPin, LOW);
delayMicroseconds(500);
}
lcd.display();
delay(250);
}
void timer() {
for(int timer = timerSetup;timer > 0; --timer){
hours = float (timer / 3600);
minutes = float ((timer - hours * 3600) / 60);
seconds = float (timer - hours * 3600 - minutes * 60);
//formuojam valandas (neliesti)
lcd.setCursor(0 + timeLeftScreen, 1);
lcd.print("0");
lcd.setCursor(1 + timeLeftScreen, 1);
lcd.print(hours);
//formuojam minutes (neliesti)
lcd.setCursor(2 + timeLeftScreen, 1);
lcd.print(":");
if(minutes < 10) {
lcd.setCursor(3 + timeLeftScreen, 1);
lcd.print("0");
lcd.setCursor(4 + timeLeftScreen, 1);
lcd.print(minutes);
} else {
lcd.setCursor(3 + timeLeftScreen, 1);
lcd.print(minutes);
}
//formuojam sekundes (neliesti)
lcd.setCursor(5 + timeLeftScreen, 1);
lcd.print(":");
if(seconds < 10) {
lcd.setCursor(6 + timeLeftScreen, 1);
lcd.print("0");
lcd.setCursor(7 + timeLeftScreen, 1);
lcd.print(seconds);
} else {
lcd.setCursor(6 + timeLeftScreen, 1);
lcd.print(seconds);
}
lcd.setCursor(timeRemainingScreen,0);
lcd.print("TIME REMAINING"); //Tekstas kai eina laikas (tekstas rasomas tarp dvigubu kabuciu)
delay(1000);
for(int duration = 0; duration < 100; duration ++){
digitalWrite(buzzerPin, HIGH);
delayMicroseconds(500);
digitalWrite(buzzerPin, LOW);
delayMicroseconds(500);
}
wire1State = digitalRead(wire1Pin);
wire2State = digitalRead(wire2Pin);
wire3State = digitalRead(wire3Pin);
wire4State = digitalRead(wire4Pin);
if((wire1State == HIGH) || (wire2State == HIGH) || (wire3State == HIGH) || (wire4State == HIGH)){ //HIGH laidas visada turi buti pajungtas, LOW laidas visada turi buti atjungtas, kad nebutu sprogimo
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("WRONG WIRE! =)"); //Tekstas kai perkerpa bloga laida (tekstas rasomas tarp dvigubu kabuciu)
delay(1000); //Laikas milisekundemis po kurio ivyksta sprogimas 1000 = 1 sekunde
timer = 0;
}
}
lcd.setCursor(0,0);
lcd.clear();
lcd.print("BOMB HAS BEEN"); //Tekstas kai bomba sprogsta pirma eilute (tekstas rasomas tarp dvigubu kabuciu)
lcd.setCursor(0,1);
lcd.print("EXPLODED!!"); //Tekstas kai bomba sprogsta antra eilute (tekstas rasomas tarp dvigubu kabuciu)
Слишком много проводов дисплей занимает. Будет сложно добавить если дисплей по i2c не подключить.
И весь проект переписать. У меня есть аналогичный проект на 4 провода, только там 2 провода не "фатальны" - детская версия.
Можно конечно и не по i2c подключить дисплей - клавиатуру паралельно дисплею: строки подключить к d2...d5 колонки к a0...a3.
Использовать стандартную библиотеку Keypad.
Слишком много проводов дисплей занимает. Будет сложно добавить если дисплей по i2c не подключить.
И весь проект переписать. У меня есть аналогичный проект на 4 провода, только там 2 провода не "фатальны" - детская версия.
Можно конечно и не по i2c подключить дисплей - клавиатуру паралельно дисплею: строки подключить к d2...d5 колонки к a0...a3.
Использовать стандартную библиотеку Keypad.
Значит в моем случае не вариант. Жаль...
Матричную клаву 4х4 можно подключить по I2C через PCF8574 или на аналоговый (один пин), применив резисторный делитель.
Для матричной клавиатуры 4х4 нужно 8 пинов. Там вроде все аналоговые свободны а также 0 и 1 можно задействовать.