Помогите с ошибкой
- Войдите на сайт для отправки комментариев
Ср, 04/04/2018 - 17:25
Всем привет!
Объясните, пожалуйста, как исправить ошибку? Вот код (извините, что без комментариев):
#include <MFRC522.h>
#include <SPI.h>
#define MAX_SS 2
int SS_PIN[MAX_SS] = {10, 6};
int RST_PIN[MAX_SS] = {9, 5};
MFRC522 *mfrc522[MAX_SS];
void setup() {
for (byte i = 0; i < MAX_SS; i++) mfrc522[i] = new mfrc522(SS_PIN[i], RST_PIN[i]);
Serial.begin(9600);
SPI.begin();
for (int i = 0; i < MAX_SS; i++) mfrc522[i]->PCD_Init();
}
void loop() {
// Look for new cards
for (byte i = 0; i < MAX_SS; i++){
if ( ! mfrc522[i]->PICC_IsNewCardPresent()) {
return;
}}
// Select one of the cards
for (byte i = 0; i < MAX_SS; i++){
if ( ! mfrc522[i]->PICC_ReadCardSerial()) {
return;
}}
// Dump debug info about the card; PICC_HaltA() is automatically called
for (byte i = 0; i < MAX_SS; i++){
mfrc522[i]->PICC_DumpToSerial(&(mfrc522[i]->uid));
}}
Выводит такую ошибку:
expected type-specifier before 'mfrc522' (что-то не так с new)
А вы можете объяснить звёздочку в 9 строке?
не должно ли выглядеть как
Вот Вы пришли сюда поиздеваться? Загадки позагадывать?
А полностью сообщение привести религия не позволяет?
Спасибо, помогло с компиляцией) Правда прога все равно не робит(
А смысл? Остальная часть - пути подключенных библиотек. А если не понятно было в какой строке ошибка, то она в 12 строке (new тем более только там и есть).
Как запрограммировали - так и работает. Оно что должно делать то? Мне кажется что дальше первого if'а оно и не проходит.
А смысл? Остальная часть - пути подключенных библиотек. А если не понятно было в какой строке ошибка, то она в 12 строке (new тем более только там и есть).
А смысл в том, что Евгений бы уже объяснил что ещё не так в вашей программе.
Теперь же Евгений видя новые сообщения в этой теме не за ходит сюда, справедливо полагая - "а смысл?"
полагая - "а смысл?"
Так и есть!
Вообще старая и избитая (как я понял) тема - подключение некскольких RFID считывателей. Лазил на огромном количестве форумов, пробовал все способы про которые писали, наткнулся на этот код. Решил попробовать, писали, что работает. Но нет. Впрочем, после замены
на
код стал хотя бы компилироваться, но все равно работал только один считыватель, тот, SS_PIN которого стоит на первом (точнее на нулевом) месте массива:
int SS_PIN[MAX_SS] = {10, 6}; //работает только считыватель с назначенным SS_PIN'ом на 10А if'ы - копипаст из прмера, но попробую поменять как-то.
ОК, вот весь лог:
А если вот так сделать - получше не будет? void loop() { // Look for new cards for (byte i = 0; i < MAX_SS; i++){ if ( mfrc522[i]->PICC_IsNewCardPresent() && mfrc522[i]->PICC_ReadCardSerial()) { mfrc522[i]->PICC_DumpToSerial(&(mfrc522[i]->uid)); } } }Вообще перестало работать. Увы.
А второй и не должен работать. Посмотрите логику своей программы. У Вас должен работать либо первый, либо два одновременно (свосем одновременно). Второй сам по себе работать и не должен - так программа написана.
Бывает. Как вариант - предлагаю накидать вывода в Serial и посмотреть что происходит
Mouflon,
просто ведите пальцем по своей программе. Прямо физически пальцем.
Итак, Вы подгнсли карту ко второму считывателю. Программа добрадалсь до строки 20. Что происходит?
void loop() { // Look for new cards for (byte i = 0; i < MAX_SS; i++){ if ( ! mfrc522[i]->PICC_IsNewCardPresent()) { return; }} ...i стало равным нулю и в строке 21 пошла проверка нет ли карты у первого (нулевого) считывателя. Её там нет, т.к. карта сейчас находится у второго.
И что происходит? В строке 21???
Всё понятно?
Если у первого считывателя нет карты, то второй Вы даже не проверяете. Никогда!
Понятно?
ЕвгенийП
для начала не я топикстартер. Поэтому менторский тон не туда направлен.
MizAL посмотри, что выходит в Serial.
#include <MFRC522.h> #include <SPI.h> #define MAX_SS 2 int SS_PIN[MAX_SS] = {10, 6}; int RST_PIN[MAX_SS] = {9, 5}; MFRC522 *mfrc522[MAX_SS]; void setup() { for (byte i = 0; i < MAX_SS; i++) mfrc522[i] = new MFRC522(SS_PIN[i], RST_PIN[i]); Serial.begin(9600); SPI.begin(); for (int i = 0; i < MAX_SS; i++) mfrc522[i]->PCD_Init(); } void loop() { // Look for new cards for (byte i = 0; i < MAX_SS; i++){ if ( mfrc522[i]->PICC_IsNewCardPresent()) { Serial.print('Card #'); Serial.print(i); if(mfrc522[i]->PICC_ReadCardSerial()) { Serial.println(' read completed'); mfrc522[i]->PICC_DumpToSerial(&(mfrc522[i]->uid)); } else { Serial.println(' read failed'); } } } }для начала не я топикстартер.
Блин, дейстивительно. И нафига ж было "ответом" делать? Я теперь поправить не могу :(
Я примерно это и подозревал. Спасибо, что ткнули пальцем)
Всегда выводит одну и ту же комбинацию цифр: 8227025956. Даже если приложить другую метку к считывателю
А как решить это? Просто у меня уже идеи кончились...
В одиночном режиме всё работает нормально?
Понял, почему цифры выводило. В Serial.println() надо в кавычках было текст писать) А так loop работает как надо, но через раз (точнее больше не работает).
С одним считывателем?
Да, работает.
А так loop работает как надо, но через раз (точнее больше не работает).
С одним считывателем?
Да, работает.
Ну, и разговор у вас, мужики :)))
Прошу ПОМОЩИ !!!
Написал небольшу програмку и собрал схему, работает очень странно, плиз может ктонибудь подсказать что не так,
Управляю четырьмя реле, при помощи четырёх сенсорных кнопок. Управление работает нормально, но при попытке управления с кнопки "четыре", происходит какая то чертовщина. То сработает нужное реле 4, а с ним вместе то 1 , то 2 , то 3 реле, а то вообще разные комбинации по три реле сразу. При упрвлении с кнопок 1,2,3, все проходит штатно.
реле 1,2,3 управляют включить-выключить нагрузку (свет)
реле 4 управляет катушкой электромагнитного замка.
boolean FLAG1=0; //установка FLAG1 в значение 0.для кнопки KN1. boolean FLAG2=0; //установка FLAG2 в значение 0.для кнопки KN2. boolean FLAG3=0; //установка FLAG3 в значение 0.для кнопки KN3. boolean FLAG4=0; //установка FLAG4 в значение 0.для кнопки KN4. boolean F1=0; //хранение нажатия кнопки KN1 boolean F2=0; //хранение нажатия кнопки KN2 boolean F3=0; //хранение нажатия кнопки KN3 boolean F4=0; //хранение нажатия кнопки KN4 int KN1=4; //устанавливаем порт подключения кнопки KN1 #4. int KN2=5; //устанавливаем порт подключения кнопки KN2 #5. int KN3=6; //устанавливаем порт подключения кнопки KN3 #6. int KN4=7; //устанавливаем порт подключения кнопки KN4 #7. boolean PUSH1=0; //переменная PUSH1 для хранения текущего состояния кнопки KN1. boolean PUSH2=0; //переменная PUSH2 для хранения текущего состояния кнопки KN2. boolean PUSH3=0; //переменная PUSH2 для хранения текущего состояния кнопки KN3. boolean PUSH4=0; //переменная PUSH2 для хранения текущего состояния кнопки KN4. //#include <Adafruit_Fingerprint.h> // подключаем библиотеку для работы с модулем отпечатков пальцев //#include <SoftwareSerial.h> // подключаем библиотеку для работы с программным UART //SoftwareSerial mySerial(2, 3);// объявляем объект mySerial для работы с библиотекой SoftwareSerial ИМЯ_ОБЪЕКТА( RX, TX ); // Можно указывать любые выводы, поддерживающие прерывание PCINTx //Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); // объявляем объект finger для работы с библиотекой Adafruit_Fingerprint ИМЯ_ОБЪЕКТА = Adafruit_Fingerprint(ПАРАМЕТР); // ПАРАМЕТР - ссылка на объект для работы с UART к которому подключен модуль, например: &Serial1 void setup(){ pinMode ((KN1), INPUT_PULLUP); // объявляем порт #4 входом. pinMode (8, OUTPUT); //порт выхода по кноке. pinMode ((KN2), INPUT_PULLUP); // объявляем порт #5 входом. pinMode (9, OUTPUT); //порт выхода по кноке. pinMode ((KN3), INPUT_PULLUP); // объявляем порт #6 входом. pinMode (10, OUTPUT); //порт выхода по кноке. pinMode ((KN4), INPUT_PULLUP); // объявляем порт #7 входом. pinMode (11, OUTPUT); //порт выхода по кноке. //while(!Serial); // Ожидание инициализации аппаратного UART //delay(500); // Ожидание инициализации модуля отпечатков пальцев //Serial.begin(9600); // Инициализация аппаратного UART на скорости 9600 //Serial.println("Scan sensor..."); // Вывод сообщения "Поиск сенсора" //finger.begin(57600); // Инициализация программного UART на скорости 57600 (скорость модуля по умолчанию) //if(finger.verifyPassword()){Serial.println("Found sensor!");} // Если модуль отпечатков обнаружен, выводим сообщение "сенсор обнаружен" //else{Serial.println("Did not find sensor :("); while(1); } // Если модуль отпечатков не обнаружен, выводим сообщение "сенсор не обнаружен" и входим в бесконечный цикл: while(1); //Serial.println("Please put your finger on the scanner ..."); } void loop(){ // кнопка КН1 и голосовая команда 1. PUSH1= !digitalRead(KN1); //присваеваем переменной PUSH инвертированое значение KN1. if (PUSH1 == 1 && FLAG1 == 0) { //если нажата кнопка и FLAG1 равен 0. FLAG1 = 1; //то присваиваем 1. F1=!F1; } if (PUSH1 == 0 && FLAG1 == 1){ //повторное нажатие KN1 возвращает значение FLAG1. FLAG1 = 0; } if ( F1 == 1 ) { //включение по кнопке. digitalWrite (8, HIGH); } else digitalWrite (8, LOW); // кнопка КН2 и голосовая команда 2. PUSH2= !digitalRead(KN2); //присваеваем переменной PUSH инвертированое значение KN2. if (PUSH2 == 1 && FLAG2 == 0) { //если нажата кнопка и FLAG2 равен 0. FLAG2 = 1; //то присваиваем 1. F2=!F2; } if (PUSH2 == 0 && FLAG2 == 1){ //повторное нажатие KN2 возвращает значение FLAG1. FLAG2 = 0; } if ( F2 == 1 ) { //включение по кнопке. digitalWrite (9, HIGH); } else digitalWrite (9, LOW); // кнопка КН3 и голосовая команда 3. PUSH3= !digitalRead(KN3); //присваеваем переменной PUSH инвертированое значение KN3. if (PUSH3 == 1 && FLAG3 == 0) { //если нажата кнопка и FLAG3 равен 0. FLAG3 = 1; //то присваиваем 1. F3=!F3; } if (PUSH3 == 0 && FLAG3 == 1){ //повторное нажатие KN3 возвращает значение FLAG3. FLAG3 = 0; } if ( F3 == 1 ) { //включение по кнопке. digitalWrite (10, HIGH); } else digitalWrite (10, LOW); // кнопка КН4 и голосовая команда 4. PUSH4=0; PUSH4= !digitalRead(KN4); //присваеваем переменной PUSH инвертированое значение KN4. if (PUSH4 == 1 ) { //если нажата кнопка . goto label; } else goto label1; // сканер пальца. // if(finger.getImage() == FINGERPRINT_OK){ // Захватываем изображение, если результат выполнения равен константе FINGERPRINT_OK (корректная загрузка изображения), то проходим дальше // if(finger.image2Tz() == FINGERPRINT_OK){ // Конвертируем полученное изображение, если результат выполнения равен константе FINGERPRINT_OK (изображение сконвертировано), то проходим дальше // if(finger.fingerFastSearch() == FINGERPRINT_OK){ // Находим соответствие в базе данных отпечатков пальцев, если результат выполнения равен константе FINGERPRINT_OK (найдено соответствие), то проходим дальше // Serial.print("Found ID="); // Serial.print(finger.fingerID); // Serial.print(", with confidence of "); // Serial.println(finger.confidence); label: digitalWrite (11, LOW); delay (2000); digitalWrite (11, HIGH); label1:;}
Есть куча титановых велосипедов для таких случаев. возьмите 4 штуки.
реле 1,2,3 управляют включить-выключить нагрузку (свет)
реле 4 управляет катушкой электромагнитного замка.
Т.е. не работает с индуктивной нагрузкой. Понятно. Осциллораф есть? И еще, в любом случае, схему и фото сборки давайте в студию. Чтобы было видно как собрано, от чего питается, какая защита стоит и т.п.
Уважаемый Евгений, прочитав Ваши вопросы, отбросил с реле 4 провод фазы 220В, который питал блок питания 12В для электромагнитного замка, проверил схему, ВСЁ работает. Сейчас попробую подключить к реле разрыв провода питания замка 12В. Благодарю за отзыв, который натолкнул копать в направлении железа, а не проги. Если есть интерес скину схему и фото.
без коментариев, потому что у меня нет слов
101if(PUSH4 == 1 ) {//если нажата кнопка .102gotolabel;103}104elsegotolabel1;114label:115digitalWrite (11, LOW);116delay (2000);117digitalWrite (11, HIGH);118label1:;без коментариев, потому что у меня нет слов
:-))))
Вот интересно, почему человек, у которо нет слов, не молчит?
Первый проект, по сути первая программа, зачем БЕЗ СЛОВ КОМЕНТИТЬ? Вы видимо на форуме находитесь что бы не помогать , а поглумиться? ЗАХОДЯ НА ФОРУМ, "ПОДУМАЙ, А НУЖЕН ЛИ ТЫ СДЕСЬ?"
Если есть интерес скину схему и фото.
Скинете если сами не раберётесь.
Я бы на Вашем месте сечас перекинул бы нидуктивную нагрузку на другое реле и посмотрел бы.
Если по прежнему глючит именно индуктивная нагрузка - значит сто пудов проблема во всплеске напряжения при её выключении - надо смотреть питание и защиту.
А если глючит тоже самое реле с любой нагрузкой, то искал бы сопли в пайке или ещё чего вокруг того реле.
Кстати, может через I2C будет легче? Или еще вариант использовать сдвиговый регистр 74HC595 (если это вообще возможно)?