Приветствую, почтенные)
Есть скетч, который делает следующее:
читает уид карты, сравнивает его с заданным, если уид совпадает и карта находится в зоне действия считывателя достаточное время - зажигает диод на ленте, задорно бибикает, и пишет цвет и номер диода в eprom
Скетч работает, все ок, но беда в том, что для того, чтобы очистить энергонезависимую память, приходится раскомментировать в нем строчку и шить девайсину по новой, а потом снова эту строчку комментировать. и еще раз шить.
Есть желание добавить несколько уидов карт, которые при попадании в зону считывания очищали бы энергонезависимую память.
Т.е., кмк, должен появиться второй массив и где-то в цикле сравнения должно быть условие с clearstate ().
Но вот как это реализовать в уже имеющемся продукте (увы, автор не я, автор исчез с горизонта и вообще абонент не абонент) - дотумкать не могу, в ардуино си делаю не то, что первые шаги, и даже не ползаю, а, пожалуй, учусь держать голову прямо и сидеть)
Так что прошу помощи у отцов и корифеев этого дела
Есть скетч, который делает следующее:
читает уид карты, сравнивает его с заданным, если уид совпадает и карта находится в зоне действия считывателя достаточное время - зажигает диод на ленте, задорно бибикает, и пишет цвет и номер диода в eprom
Скетч работает, все ок, но беда в том, что для того, чтобы очистить энергонезависимую память, приходится раскомментировать в нем строчку и шить девайсину по новой, а потом снова эту строчку комментировать. и еще раз шить.
Есть желание добавить несколько уидов карт, которые при попадании в зону считывания очищали бы энергонезависимую память.
Т.е., кмк, должен появиться второй массив и где-то в цикле сравнения должно быть условие с clearstate ().
Но вот как это реализовать в уже имеющемся продукте (увы, автор не я, автор исчез с горизонта и вообще абонент не абонент) - дотумкать не могу, в ардуино си делаю не то, что первые шаги, и даже не ползаю, а, пожалуй, учусь держать голову прямо и сидеть)
Так что прошу помощи у отцов и корифеев этого дела
C++:
#include <SPI.h>
#include <MFRC522.h>
#include <JC_Button.h>
#include <Adafruit_NeoPixel.h>
#include <arduino-timer.h>
#include <EEPROM.h>
#include "pitches.h"
#define RST_PIN 9
#define SS_PIN 10
#define LEDPIN 5
#define NUMPIXELS 10
MFRC522 mfrc522(SS_PIN, RST_PIN);
Adafruit_NeoPixel leds = Adafruit_NeoPixel(NUMPIXELS, LEDPIN, NEO_GRB + NEO_KHZ800);
auto timer = timer_create_default();
int cardPresenceflag = 0;
String cardSerials[10] = {"12211254187", "17018859187", "58111114174", "1793824364", "527216717118162192", "52215889206219208", "", "", "", ""}; //МАССИВ СЕРИЙНЫХ НОМЕРОВ МЕТОК
int spotsStatus[10] = {0,0,0,0,0,0,0,0,0,0};
int spotsColor[10][3] = {{100,0,0}, {0,100,0}, {0,0,100}, {100,100,100}, {0,0,255}, {46,43,95}, {139,0,255}, {255,0,0}, {255,127,0}, {255,255,0}}; // ЦВЕТА ТОЧЕК R,G,B
int currentCardId = -1;
unsigned long captureStartTime = 0;
unsigned long captureDurationTime = 50; // Необходимое время удержания карты в зоне действия считывателя
int brightness = 0;
bool brightnessDirection = true;
int brightLedId = -1;
void setup() {
Serial.begin(115200);
SPI.begin();
mfrc522.PCD_Init();
leds.begin();
leds.clear();
leds.show();
//clearState(); // СБРОС EPROM
loadState();
timer.every(1000, visualize);
timer.every(10, brightnessCycle);
pinMode(7, OUTPUT);
}
void loop()
{
timer.tick();
cardPresenceflag = 0;
if (mfrc522.PICC_IsNewCardPresent())
{
cardPresenceflag = 1;
}
else
{
if (mfrc522.PICC_IsNewCardPresent())
{
cardPresenceflag = 1;
}
}
if (cardPresenceflag)
{
if (mfrc522.PICC_ReadCardSerial())
{
//Serial.println(getCardSerial(mfrc522.uid.uidByte, mfrc522.uid.size)); // ОТОБРАЖЕНИЕ uid КАРТЫ В ЗОНЕ ДЕЙСТВИЯ СЧИТЫВАТЕЛЯ
int cardId = getCardId(getCardSerial(mfrc522.uid.uidByte, mfrc522.uid.size));
if(cardId == -1)
{
captureStartTime = 0;
return;
}
if(cardId != currentCardId)
{
captureStartTime = millis();
currentCardId = cardId;
}
}
}
else
{
captureStartTime = 0;
currentCardId = -1;
}
}
String getCardSerial(byte *buffer, byte bufferSize) {
String cardId = "";
for (byte i = 0; i < bufferSize; i++)
{
cardId += String((buffer[i]));
}
return cardId;
}
int getCardId(String cardSerial)
{
int cardId = -1;
for(int i = 0; i < 10; i++)
{
if(cardSerials[i] == cardSerial)
{
cardId = i;
break;
}
}
return cardId;
}
bool visualize()
{
if(captureStartTime != 0)
{
unsigned long captureTime = (millis() - captureStartTime)/1000;
if(captureTime <= captureDurationTime && spotsStatus[currentCardId] == 0)
{
leds.clear();
for(int i = 0; i < captureTime/(captureDurationTime/10); i++)
{
leds.setPixelColor(i, leds.Color(spotsColor[currentCardId][0], spotsColor[currentCardId][1], spotsColor[currentCardId][2]));
}
brightLedId = captureTime/(captureDurationTime/10);
}
else
{
if(spotsStatus[currentCardId] == 0)
{
captureStartTime = 0;
brightLedId = -1;
spotsStatus[currentCardId] = 1;
playSound();
saveState();
}
}
}
else
{
brightLedId = -1;
leds.clear();
for(int i = 0; i < 10; i++)
{
if(spotsStatus[i] == 1)
{
leds.setPixelColor(i, leds.Color(spotsColor[i][0],spotsColor[i][1],spotsColor[i][2]));
}
}
leds.show();
}
return true;
}
bool brightnessCycle()
{
if(brightnessDirection)
{
if(brightness < 200)
{
brightness += 10;
} else {
brightnessDirection = false;
brightness -= 10;
}
} else {
if(brightness > 0)
{
brightness -= 10;
} else {
brightnessDirection = true;
brightness += 10;
}
}
if(brightLedId != -1)
{
leds.setPixelColor(brightLedId, leds.Color(brightness, brightness, brightness));
leds.show();
}
return true;
}
void saveState()
{
for(int i = 0; i < 10; i++)
{
EEPROM.write(i, spotsStatus[i]);
}
}
void loadState()
{
for(int i = 0; i < 10; i++)
{
byte value = EEPROM.read(i);
if(value <= 1)
{
spotsStatus[i] = value;
}
}
}
void clearState()
{
for(int i = 0; i < 10; i++)
{
EEPROM.write(i, 0);
}
}
void playSound()
{
tone(7,NOTE_E6,70);
delay(130);
tone(7,NOTE_G6,70);
delay(130);
tone(7,NOTE_E7,70);
delay(130);
tone(7,NOTE_C7,70);
delay(130);
tone(7,NOTE_D7,70);
delay(130);
tone(7,NOTE_G7,70);
delay(125);
noTone(7);
}
Изменено: