Строго последовательные действия
- Войдите на сайт для отправки комментариев
Ср, 12/10/2016 - 02:20
Всем привет. Подскажите структуру кода пожалуйста. Есть девять кнопок и один серво. Серво должен открыться лишь при нажатии строгой последовательности кнопок. Если же нажимаем другую - все с начала. Для индикации необходимо установить светодиоды возле каждой кнопки. Т е возле первой кнопки сразу горит светодиод. Возле след загорится лишь после нажатия первой и тд. Нажал не ту сначала. Весь код можно не писать. Хотя бы через какие операторы реализовать. Пробовал вложенные if else и для выхода goto. Но не вышло. Заранее спасибо.
покажи код, который не работает.
1. Светодиоды в данной конструкции облегчают силовой взлом шифра в 10000 раз, превращая трудновыполнимую задачку в тривиальную.
2. Алгоритм: нужны шаблон и счетчик. При нажатии кнопки происходит сравнение с очередным элементом шаблона. Если совпало - приращение счетчика, не совпало - сбрасываем в 0.
Ну это для затравки. Замени 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); } } } }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; } }это пример на 3х герконах, который я сам коряво написал. и однозначно не верно. qwone конечно спасибо за код. но я толком не разобрался с ним. жду еще несколько посылок. дособираю схему и попробую. переписать уже с 9. герконами как и было задумано. вы просто подскажите в верном ли я направлении.
там не нужна сложность, это будет эл. головоломка. планируется 32 геркона. на счет счетчика - наверно хорошая идея. можно пример скетча?
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();Используя Ваш код я бы предложил другой вариант, посмотрите может подойдет
#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 или больше кнопок, герконов }Спасибо всем за советы. Чуть позже все проверю. На счет булина думал. Но не знал как реализовать.
Если не получится - пиши на почту ( TimurTelyaubaev@yandex.ru ). Где то у меня в закромах есть скетч под это))