FastLED-driven strip ведет себя странно при использовании PN532
Светодиодная лента (WS2812B, 46 штук, PIN 8) и RFID-щит Adafruit PN532 (IRQ 2) прикреплены к моему Arduino Mega 2560.
Полоса на основе GRB, кажется, отлично работает с FastLED в начале, я могу подтвердить это, циклически прокручивая все три базовых цвета в setup()
.
Как только я вызываю nfc.readPassiveTargetID(...)
и использую на нем тег NFC, все начинает становиться странным. Всякий раз, когда я комментирую строку, она снова работает правильно.
Цвета RGB случайным образом меняются местами (как если бы я прошел другой цветовой заказ), яркость также может меняться случайным образом, и иногда несколько светодиодов в начале или конце полосы имеют другую яркость / цвет, чем остальные.
Поскольку я снизил яркость до 32, я уверен, что это не проблема с питанием.
Я предполагаю, что существует либо некоторое повреждение памяти, либо какое-то вмешательство контакта в две библиотеки, хотя я не знаю, почему это происходит. Пожалуйста, найдите мой код ниже, любая помощь приветствуется.
#include <FastLED.h>
#include <Adafruit_PN532.h>
#define LED_COUNT 46
#define LED_DATA_PIN 8
CRGB leds[LED_COUNT];
#define PN532_IRQ (2)
#define PN532_RESET (3) // Not connected
Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET);
void setLeds(CRGB color) {
Serial.print("setLeds("); Serial.print(color.r, DEC ); Serial.print(","); Serial.print(color.g, DEC ); Serial.print(","); Serial.print(color.b, DEC ); Serial.println(")");
for (int i = 0; i < LED_COUNT; i++) {
leds[i] = color;
}
FastLED.show();
}
void ledStartSequence() {
setLeds(CRGB::Black);
for (int crtLed = 0; crtLed < 23; crtLed++) {
leds[crtLed] = CRGB::Blue;
leds[crtLed + 23] = CRGB::Blue;
FastLED.show();
delay(20);
}
Serial.println("Red");
setLeds(CRGB::Red);
delay(1000);
Serial.println("Green");
setLeds(CRGB::Green);
delay(1000);
Serial.println("Blue");
setLeds(CRGB::Blue);
delay(1000);
Serial.println("Off");
setLeds(CRGB::Black);
}
void initLeds() {
FastLED.addLeds<WS2812B, LED_DATA_PIN, GRB>(leds, LED_COUNT);
FastLED.setBrightness(32);
}
void initSerial() {
Serial.begin(9600);
Serial.println("Hello!");
}
void initNFC() {
nfc.begin();
uint32_t versiondata = nfc.getFirmwareVersion();
Serial.print(versiondata);
if (! versiondata) {
Serial.print("Error: Didn't find PN53x board");
while (1); // halt
}
// Got ok data, print it out!
Serial.print("Found chip PN5"); Serial.println((versiondata >> 24) & 0xFF, HEX);
Serial.print("Firmware ver. "); Serial.print((versiondata >> 16) & 0xFF, DEC);
Serial.print('.'); Serial.println((versiondata >> 8) & 0xFF, DEC);
nfc.SAMConfig();
}
void setup() {
initSerial();
initLeds();
initNFC();
ledStartSequence();
}
void loop(void) {
Serial.println("Waiting for an ISO14443A Card ...");
setLeds(CRGB::Red); // only displayed correctly in the first iteration
uint8_t success;
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };
uint8_t uidLength;
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);
/*
* Here's where things start to go nuts!
*/
delay(1000);
setLeds(CRGB::Green); // usually not displayed correctly
delay(1000);
setLeds(CRGB::Blue); // usually not displayed correctly
delay(1000);
}
@Atmocreations, 👍1
Обсуждение1 ответ
Лучший ответ:
Потратив слишком много времени на код, я решил, что это связано с чем-то совершенно другим:
RFID-считыватель создавал радиочастотные помехи на проводе передачи данных по направлению к светодиодной ленте... Экранирование его должным образом сделало свое дело, независимо от того, какой контакт используется.
В любом случае, спасибо за помощь.
- Проверить переключатель уровня с помощью Arduino и некоторых данных
- Светодиод, управляемый Midi через USB
- Использовать светодиод или подтягивающий резистор для предотвращения «плавания» или «фантомного изображения» матричной клавиатуры?
- Проблема с SPI при использовании трансивера RF24 NRF24L01 со светодиодной матрицей MD_MAX72xx
- Назначение светодиодного индикатора
- Как преобразовать данные для столбца в данные для строки для светодиодной матрицы
- FastLED не работает должным образом
- подключение светодиода к DHT и кодовой комбинации
У вас есть массив "uid" с 7 байтами. Если после
nfc.readPassiveTargetID
значение uidLength будет> 7, у вас будет переполнение буфера. Знаете ли вы, сколько байтов содержит UID RFID-карты? Другая возможность заключается в том, что драйвер PN532 использует таймер (например, для аппаратного I2C), который также использует LED lib. Тогда это может помочь, если вы повторно инициализируете светодиодыinitLeds()
после вызоваreadPassiveTargetID
. И то, и другое - всего лишь догадки., @Peter Paul KieferЧто происходит, когда после задержки и до setLeds(CRGB::Green) вы отключаете прерывание 2? Или когда вы вообще не подключаете линию прерывания RFID-экрана? Просто из любопытства. См . https://www.arduino.cc/reference/en/language/functions/external-interrupts/detachinterrupt/, @ocrdu