Pętla while w loop - Wersja do druku +- Arduino Polska Forum (https://forum.arduinopolska.pl) +-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino) +--- Dział: Jak zacząć z Arduino (https://forum.arduinopolska.pl/dzial-jak-zacz%C4%85%C4%87-z-arduino) +--- Wątek: Pętla while w loop (/watek-p%C4%99tla-while-w-loop) |
Pętla while w loop - Jesion0102 - 01-11-2020 Witam dopiero zaczynam z arduino i mam pytani i prośbę o pomoc. Mam kod do drzwi z magnesem otwierany przez RFID, kod trochę czyjś trochę sam kombinowałem. Wszystko działa ok ale chciałem dołożyć do tego alarm z diodami które będą pokazywać czy załączony czy nie. i tak jak przyłożę kartę do czytnika warunek w pętli jest spełniony i chciałem ustawić tak a żeby sygnalizowała to dioda migając, wiedź stworzyłem pętle while poza pętlą loop i tam ustawiłem miganie diody i odnośnik w warunku pętli loop do pętli while. wszystko idzie do momentu kiedy odczyta odnośnik do diody,- dioda zaczyna migać i pętla loop nie kończy się i nie mogę już drugi raz przyłożyć karty , wydaje mi się że dla tego że while się nie kończy i nie pozwala zakończyć pętli loop. Jak wstawić miganie dioda w pętli żeby jej nie blokowała. #include <SeeedRFID.h> #include <SeeedRFID.h> #include <SPI.h> #include <MFRC522.h> #define SS_PIN 10 #define RST_PIN 9 #define LED_G 4 //define green LED pin #define LED_R 5 //define red LED #define RELAY 6 //magnes pin #define ledPinBlue 7 //alarm pin #define buttonPin 3 //button to swich alarm ON MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance. int buttonState = 0; void setup() { Serial.begin(9600); // Initiate a serial communication SPI.begin(); // Initiate SPI bus mfrc522.PCD_Init(); // Initiate MFRC522 pinMode(LED_G, OUTPUT); pinMode(LED_R, OUTPUT); pinMode(RELAY, OUTPUT); pinMode(ledPinBlue, OUTPUT); pinMode(buttonPin, INPUT); digitalWrite(ledPinBlue, LOW); Serial.println("Put your card to the reader..."); Serial.println(); } void loop() { if (buttonState == HIGH) { delay(50); digitalWrite(ledPinBlue, LOW); } buttonState = digitalRead(buttonPin); // Look for new cards if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Select one of the cards if ( ! mfrc522.PICC_ReadCardSerial()) { return; } //Show UID on serial monitor Serial.print("UID tag :"); String content= ""; byte letter; for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ")); content.concat(String(mfrc522.uid.uidByte[i], HEX)); } Serial.println(); Serial.print("Message : "); content.toUpperCase(); if (content.substring(1) == "F3 3A 61 73") { Serial.println("Authorized access"); Serial.println(); digitalWrite(LED_R, LOW); delay(200); digitalWrite(LED_G, HIGH); digitalWrite(RELAY, HIGH); delay(2000); digitalWrite(RELAY, LOW); delay(500); digitalWrite(LED_G, LOW); delay(1000); dioda(); } else { Serial.println(" Access denied"); digitalWrite(LED_G, HIGH); delay(100); digitalWrite(LED_G, LOW); delay(100); } } void dioda(){ while ("Authorized access"){ digitalWrite(ledPinBlue, HIGH); delay(30); digitalWrite(ledPinBlue, LOW); delay(500); } } RE: Pętla while w loop - kaczakat - 02-11-2020 Z delay to możesz sobie pomigać 1 led, z trudem kilkoma. Nie pisze się tak programów mających mieć jakąś faktyczną wartość użytkową. Naucz się wykorzystywać przynajmniej millis() i odmierzać czas. Na początek proponuję napisanie programu, który będzie sprawdzał wciśnięcie przycisku przez co najmniej 15ms i ewentualnie długie wciśnięcie przez ponad 100ms, eliminował drganie styków, po czym odpalał miganie 1 LED co 1000ms i dla długiego wciśnięcia innego led co 1500ms, na 10s, a jeśli wciśnięcie się ponowi to odliczanie czasu migania led startuje od nowa. |