Строго последовательные действия

Despot
Offline
Зарегистрирован: 04.10.2016

Всем привет. Подскажите структуру кода пожалуйста. Есть девять кнопок и один серво. Серво должен открыться лишь при нажатии строгой последовательности кнопок. Если же нажимаем другую - все с начала. Для индикации необходимо установить светодиоды возле каждой кнопки. Т е возле первой кнопки сразу горит светодиод. Возле след загорится лишь после нажатия первой и тд. Нажал не ту сначала. Весь код можно не писать. Хотя бы через какие операторы реализовать. Пробовал вложенные if else и для выхода goto. Но не вышло. Заранее спасибо.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

покажи код, который не работает.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

1. Светодиоды в данной конструкции облегчают силовой взлом шифра в 10000 раз, превращая трудновыполнимую задачку в тривиальную.

2. Алгоритм: нужны шаблон и счетчик. При нажатии кнопки происходит сравнение с очередным элементом шаблона. Если совпало - приращение счетчика, не совпало - сбрасываем в 0.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну это для затравки. Замени RFID_RC522 на клавиатуру и будет вам счастье.

/*
//#1
светодиод -> 8 (Led_pin) 0 горит/ 1 нет
       GND ->  GND
серва  -> 5 (servo_pin)
геркон -> A3 (gercon_pin) 0 дверь закрыта / 1 нет
//#2
кнопка1 -> A1 (btm1_pin) 0 нажата/ 1 нет
       GND ->  GND
кнопка2 -> A2 (btm2_pin) 0 нажата/ 1 нет
       GND ->  GND
//#3               Arduino Uno
RFID_RC522 RST -> 9 (RST_pin)
        SDA(SS)-> 10 (SDA_pin)
        MOSI   -> 11 (MOSI_pin)
        MISO   -> 12 (MISO_pin)
        SCK    -> 13 (SCK_pin)
        3,3В   -> 3,3В
        GND    -> GND

        Card UID: E6 38 FE 13  брелок
        Card UID: 5A 5D 39 D5  пластик
*/
//#1
const int Led_pin = 8 ; // нога светодиода
uint8_t Led ;
const int interval = 2000 ; // интервал после нажатия клавиши 2 сек

#include <Servo.h>
Servo myservo;
const int servo_pin = 5  ; // нога серво
const int servo_OFF = 0; // серва закрыта
const int servo_ON = 90; // серва открыта
const int gercon_pin = A3  ; // нога геркона
uint8_t gercon ;
//#2
const int btm1_pin = A1  ; // нога кнопки
const int btm2_pin = A2  ; // нога кнопки
//#3
byte uidCard1[4] = {0xE6, 0x38, 0xFE, 0x13};
byte uidCard2[4] = {0x5A, 0x5D, 0x39, 0xD5};
#include <SPI.h>
#include <MFRC522.h>
const int SDA_pin = 10;
const int RST_pin = 9;

MFRC522 rfid(SDA_pin, RST_pin); // Instance of the class

void setup() {
  //#1
  pinMode(Led_pin, OUTPUT);
  digitalWrite(Led_pin, Led = 0);
  myservo.attach(servo_pin);
  pinMode(gercon_pin, INPUT_PULLUP);
  //#2
  pinMode(btm1_pin, INPUT_PULLUP);
  pinMode(btm2_pin, INPUT_PULLUP);
  //#3
  SPI.begin(); // Init SPI bus
  rfid.PCD_Init(); // Init MFRC522
}

void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  //#1
  static uint32_t future1 = 0 ;
  gercon = digitalRead(gercon_pin); // опрос состояния двери
  if (!gercon && !Led && (MILLIS >= future1)) { // убеждаемся что дверь закрыта и подошло время закрывать на замок
    digitalWrite(Led_pin, Led = 1);
    myservo.write(servo_OFF);  // закрываем
  }
  //#2
  if (!digitalRead(btm1_pin)) { // первая открывающая кнопка
    digitalWrite(Led_pin, Led = 0);
    future1 = millis() + interval;
    myservo.write(servo_ON);
  }
  if (!digitalRead(btm2_pin)) { // вторая открывающая кнопка
    digitalWrite(Led_pin, Led = 0);
    future1 = millis() + interval;
    myservo.write(servo_ON);
  }
  //#3
  static uint32_t future3 = 0 ;
  if (MILLIS >= future3)   {
    future3 = MILLIS + 1000 ;
    if ( rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
      if (rfid.uid.uidByte[0] == uidCard1[0] ||
          rfid.uid.uidByte[1] == uidCard1[1] ||
          rfid.uid.uidByte[2] == uidCard1[2] ||
          rfid.uid.uidByte[3] == uidCard1[3] ) {
        digitalWrite(Led_pin, Led = 0);
        future1 = millis() + interval;
        myservo.write(servo_ON);
      }
      if (rfid.uid.uidByte[0] == uidCard2[0] ||
          rfid.uid.uidByte[1] == uidCard2[1] ||
          rfid.uid.uidByte[2] == uidCard2[2] ||
          rfid.uid.uidByte[3] == uidCard2[3] ) {
        digitalWrite(Led_pin, Led = 0);
        future1 = millis() + interval;
        myservo.write(servo_ON);
      }
    }
  }
}

 

Despot
Offline
Зарегистрирован: 04.10.2016
int ledPin1 = 5;
int ledPin2 = 6;
int ledPin3 = 7;
int ledPin4 = 12;
int switchPin1 = 9;
int switchPin2 = 10;
int switchPin3 = 11;


void setup() {
 pinMode(switchPin1, INPUT);
 pinMode(switchPin2, INPUT);
 pinMode(switchPin3, INPUT);
 digitalWrite(switchPin1,HIGH);
 digitalWrite(switchPin2,HIGH);
 digitalWrite(switchPin3,HIGH);
 pinMode(ledPin1, OUTPUT);
 pinMode(ledPin2, OUTPUT);
 pinMode(ledPin3, OUTPUT);
 pinMode(ledPin4, OUTPUT);
}

void loop() {
 int g3 = digitalRead(switchPin1);
 int g2 = digitalRead(switchPin2);
 int g1 = digitalRead(switchPin3);
 first:
 digitalWrite(ledPin1,HIGH);
if (g1 == LOW)
  {
    digitalWrite(ledPin2, HIGH); 
     {
         if (g2 == LOW)
         {
          digitalWrite(ledPin3, HIGH); 
              if (g3 == LOW)
              {
              digitalWrite(ledPin4, HIGH); 
              }
              else if (g1 == LOW && g2 == LOW) 
              { goto first;
              }
         }
         else if (g1 == LOW && g3 == LOW)  
         { goto first;
         }
     }
  }
else if (g3 == LOW && g2 == LOW) 
{ goto first;
    }
}

 

Despot
Offline
Зарегистрирован: 04.10.2016

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

Despot
Offline
Зарегистрирован: 04.10.2016

там не нужна сложность, это будет эл. головоломка. планируется 32 геркона. на счет счетчика - наверно хорошая идея. можно пример скетча? 

GarryC
Offline
Зарегистрирован: 08.08.2016
int KeyWait[]={1,3,5,7,-1}; //какую кнопку ждем
int Svd[] = {1,2,5,7,0}; // какой светодиод должен гореть
int Sost=0;
int Tmp;
while (KeyWait[Sost]!=-1) {
 OnSvd(Svd[Sost]);
 Tmp=ReadKey();
 OffSvd(Svd[Sost]);
 if (Tmp==KeyWait[Sost]) Sost=Sost+1; else Sost=0;
};
OnSolenoid();

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Используя Ваш код я бы предложил другой вариант, посмотрите может подойдет

#define ledPin1 5
#define ledPin2 6
#define ledPin3 7
#define ledPin4 12
#define switchPin1 9
#define switchPin2 10
#define switchPin3 11
bool f_kn1=0;
bool f_kn2=0;
bool f_kn3=0;
int value = 0;


void setup() {
	pinMode(switchPin1, INPUT);
	pinMode(switchPin2, INPUT);
	pinMode(switchPin3, INPUT);
	digitalWrite(switchPin1, HIGH);
	digitalWrite(switchPin2, HIGH);
	digitalWrite(switchPin3, HIGH);
	pinMode(ledPin1, OUTPUT);
	pinMode(ledPin2, OUTPUT);
	pinMode(ledPin3, OUTPUT);
	pinMode(ledPin4, OUTPUT);
}

void loop() {
	if (value == 0)
	{
	  digitalWrite(ledPin1, LOW);
	  digitalWrite(ledPin2, LOW);
	  digitalWrite(ledPin3, LOW);
	}

	if (digitalRead(switchPin1) == LOW && f_kn1==0) {
		f_kn1=1;
		if (value == 0)value = 1, digitalWrite(ledPin1, HIGH);
		else value = 0;		
	}
	if(f_kn1 && digitalRead(switchPin1)==HIGH)f_kn1=0;

	if (digitalRead(switchPin2)==LOW && f_kn2==0){
		f_kn2=1;
		if (value == 1)value = 2, digitalWrite(ledPin2, HIGH);
		else value = 0;
	}
	if(f_kn2 && digitalRead(switchPin2)==HIGH)f_kn2=0;
	
	if (digitalRead(switchPin3)==LOW && f_kn3==0){
		f_kn3==1;
		if (value == 2)value = 3, digitalWrite(ledPin3, HIGH);
		else value = 0;
	}
	if(f_kn3 && digitalRead(switchPin3)==HIGH)f_kn3=0;

// И так все 9 или больше кнопок, герконов
}

 

Despot
Offline
Зарегистрирован: 04.10.2016

Спасибо всем за советы. Чуть позже все проверю. На счет булина думал. Но не знал как реализовать.

DedNomto
Offline
Зарегистрирован: 19.10.2016

Если не получится - пиши на почту ( TimurTelyaubaev@yandex.ru ). Где то у меня в закромах есть скетч под это))