Я довольно новичок в Arduino и программировании, поэтому прошу вас о терпении. Я использую 2 RFID с Arduino Mega и 2 серводвигателя и один OLED-дисплей. Таким образом, идея состоит в том, что, когда я помещаю определенную метку RFID в первый RC522, он открывает первый серводвигатель и закрывает его через 4 секунды. Затем он сканирует второй RC522 для того же тега, и когда я его представляю, он открывает второй сервопривод, записывает сообщение на OLED-дисплей, а затем перемещает второй сервопривод назад и снова начинает сканирование первого RC522. Это все работает отлично, я сделал это с переключателем, но проблема в том, что после последнего шага он продолжает поднимать сервоприводы даже без представления тега, как будто он запоминает (читает более одного раза) тег. Я просто хочу сделать это один раз. Возможно ли это?
Вот код:
#include <Servo.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <MFRC522.h>
#define RST_PIN 5
#define SS_1_PIN 10
#define SS_2_PIN 8
#define MFRC522_SPICLOCK SPI_CLOCK_DIV16
MFRC522 mfrc5221(SS_1_PIN, RST_PIN);
MFRC522 mfrc5222(SS_2_PIN, RST_PIN);
Adafruit_SSD1306 display(-1);
Servo servo1;
Servo servo2;
unsigned long PreviousMillis = 0;
unsigned long CurrentMillis;
int atraso;
int state;
int pos1=95;
int pos2=90;
void setup ()
{
Serial.begin(9600);
SPI.begin();
servo1.attach(7);
servo2.attach(6);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(25,10);
display.println("Text 1");
display.display();
mfrc5221.PCD_Init();
mfrc5222.PCD_Init();
mfrc5221.PCD_DumpVersionToSerial();
mfrc5222.PCD_DumpVersionToSerial();
state=1;
}
void loop ()
{
CurrentMillis = millis();
atraso=CurrentMillis-PreviousMillis;
next_state_FSM();
output_FSM();
Serial.print("State = ");
Serial.print(state);
Serial.print("\n");
}
void output_FSM(){
switch (state){
case 1:
{
servo1.write(pos1);
servo2.write(pos2);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(25,10);
display.println("Text 1");
display.display();
if ( ! mfrc5221.PICC_IsNewCardPresent())
{
return;
}
if ( ! mfrc5221.PICC_ReadCardSerial())
{
return;
}
break;
}
case 2:
{
servo1.write(0);
}
break;
case 3:
{
servo1.write(95);
if ( ! mfrc5222.PICC_IsNewCardPresent())
{
return;
}
if ( ! mfrc5222.PICC_ReadCardSerial())
{
return;
}
break;
}
case 4:
{
servo2.write(0);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,5);
display.println("Text 2");
display.setCursor(50,10);
display.println("Text 3");
display.display();
}
}
}
void next_state_FSM(){
switch (state){
case 1:
{
Serial.print("UID tag :");
String content1= "";
byte letter1;
for (byte i = 0; i < mfrc5221.uid.size; i++)
{
Serial.print(mfrc5221.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc5221.uid.uidByte[i], HEX);
content1.concat(String(mfrc5221.uid.uidByte[i] < 0x10 ? " 0" : " "));
content1.concat(String(mfrc5221.uid.uidByte[i], HEX));
}
Serial.println();
content1.toUpperCase();
if (content1.substring(1) == "FB 5B 65 0A")
{
state=2;
PreviousMillis=CurrentMillis;
}
break;
}
case 2:
{
if(atraso>4000){
state=3;
PreviousMillis=CurrentMillis;
}
break;
}
case 3:
{
Serial.print("UID tag :");
String content2= "";
byte letter2;
for (byte j = 0; j < mfrc5222.uid.size; j++)
{
Serial.print(mfrc5222.uid.uidByte[j] < 0x10 ? " 0" : " ");
Serial.print(mfrc5222.uid.uidByte[j], HEX);
content2.concat(String(mfrc5222.uid.uidByte[j] < 0x10 ? " 0" : " "));
content2.concat(String(mfrc5222.uid.uidByte[j], HEX));
}
Serial.println();
content2.toUpperCase();
if (content2.substring(1) == "FB 5B 65 0A")
{
state=4;
PreviousMillis=CurrentMillis;
}
break;
}
case 4:
{
if(atraso>4000){
state=1;
PreviousMillis=CurrentMillis;
}
break;
}
}
}