Добавление Клавиатуры и кода в проект.

Mahaon
Offline
Зарегистрирован: 01.02.2017

Доброго времени суток камрады! Возник вопрос по техническому проекту. Есть готовый и прекрасно работающий проект. Таймер который работает на убывание ( по умолчанию установлен час ). Когда собирался данный проект сразу встал вопрос и возможности запуска и отключения таймера с клавиатуры( рассматривался вариант как 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)

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Слишком много проводов дисплей занимает. Будет сложно добавить если дисплей по i2c не подключить.

И весь проект переписать. У меня есть аналогичный проект на 4 провода, только там 2 провода не "фатальны" - детская версия.

Можно конечно и не по i2c подключить дисплей - клавиатуру паралельно дисплею: строки подключить к d2...d5 колонки к a0...a3.

Использовать стандартную библиотеку Keypad.

 

Mahaon
Offline
Зарегистрирован: 01.02.2017

NeiroN пишет:

Слишком много проводов дисплей занимает. Будет сложно добавить если дисплей по i2c не подключить.

И весь проект переписать. У меня есть аналогичный проект на 4 провода, только там 2 провода не "фатальны" - детская версия.

Можно конечно и не по i2c подключить дисплей - клавиатуру паралельно дисплею: строки подключить к d2...d5 колонки к a0...a3.

Использовать стандартную библиотеку Keypad.

 

Значит  в моем случае не вариант. Жаль...

Pyotr
Offline
Зарегистрирован: 12.03.2014

Матричную клаву 4х4 можно подключить по I2C через PCF8574 или на аналоговый (один пин), применив резисторный делитель.

phoenixoid
Offline
Зарегистрирован: 14.07.2015

Для матричной клавиатуры 4х4 нужно 8 пинов. Там вроде все аналоговые свободны а также 0 и 1 можно задействовать.