• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Pętla while w loop
#1
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);
  }
}
 
Odpowiedź
#2
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.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości