Помогите с ошибкой

MizAL
Offline
Зарегистрирован: 04.04.2018

Всем привет!

Объясните, пожалуйста, как исправить ошибку? Вот код (извините, что без комментариев):

#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)
nik182
Offline
Зарегистрирован: 04.05.2015

А вы можете объяснить звёздочку в 9 строке?

Mouflon
Offline
Зарегистрирован: 17.01.2018
new mfrc522(SS_PIN[i], RST_PIN[i]);

не должно ли выглядеть как 
 

new MFRC522(SS_PIN[i], RST_PIN[i]);

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вот Вы пришли сюда поиздеваться? Загадки позагадывать?

MizAL пишет:

Выводит такую ошибку:
expected type-specifier before 'mfrc522' (что-то не так с new)

А полностью сообщение привести религия не позволяет?

MizAL
Offline
Зарегистрирован: 04.04.2018

Спасибо, помогло с компиляцией) Правда прога все равно не робит(

MizAL
Offline
Зарегистрирован: 04.04.2018

А смысл? Остальная часть - пути подключенных библиотек. А если не понятно было в какой строке ошибка, то она в 12 строке (new тем более только там и есть).

Mouflon
Offline
Зарегистрирован: 17.01.2018

Как запрограммировали - так и работает. Оно что должно делать то? Мне кажется что дальше первого if'а оно и не проходит.

ven-til
Offline
Зарегистрирован: 13.02.2018

MizAL пишет:

А смысл? Остальная часть - пути подключенных библиотек. А если не понятно было в какой строке ошибка, то она в 12 строке (new тем более только там и есть).

А смысл в том, что Евгений бы уже объяснил что ещё не так в вашей программе.
Теперь же Евгений видя новые сообщения в этой теме не за ходит сюда, справедливо полагая - "а смысл?"

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ven-til пишет:

полагая - "а смысл?"

Так и есть!

MizAL
Offline
Зарегистрирован: 04.04.2018

Вообще старая и избитая (как я понял) тема - подключение некскольких RFID считывателей. Лазил на огромном количестве форумов, пробовал все способы про которые писали, наткнулся на этот код. Решил попробовать, писали, что работает. Но нет. Впрочем, после замены 

new mfrc522(SS_PIN[i], RST_PIN[i]);

на

new MFRC522(SS_PIN[i], RST_PIN[i]);

код стал хотя бы компилироваться, но все равно работал только один считыватель, тот, SS_PIN которого стоит на первом (точнее на нулевом) месте массива:

int SS_PIN[MAX_SS] = {10, 6}; //работает только считыватель с назначенным SS_PIN'ом на 10

А if'ы - копипаст из прмера, но попробую поменять как-то.

MizAL
Offline
Зарегистрирован: 04.04.2018

ОК, вот весь лог:

Arduino: 1.8.4 (Windows 7), Плата:"Arduino/Genuino Uno"
 
C:\Users\Student\Documents\Arduino\sketch_apr04a\sketch_apr04a.ino: In function 'void setup()':
 
sketch_apr04a:12: error: expected type-specifier before 'mfrc522'
 
     mfrc522[i] =  new mfrc522(SS_PIN[i], RST_PIN);
 
                       ^
 
exit status 1
expected type-specifier before 'mfrc522'
Mouflon
Offline
Зарегистрирован: 17.01.2018
А если вот так сделать - получше не будет?
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));
    }
  }
}
MizAL
Offline
Зарегистрирован: 04.04.2018

Вообще перестало работать. Увы.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

MizAL пишет:
все равно работал только один считыватель, тот, SS_PIN которого стоит на первом 

А второй и не должен работать. Посмотрите логику своей программы. У Вас должен работать либо первый, либо два одновременно (свосем одновременно). Второй сам по себе работать и не должен - так программа написана.

Mouflon
Offline
Зарегистрирован: 17.01.2018

Бывает. Как вариант - предлагаю накидать вывода в Serial и посмотреть что происходит 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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???

Всё понятно?

Если у первого считывателя нет карты, то второй Вы даже не проверяете. Никогда!

Понятно?

Mouflon
Offline
Зарегистрирован: 17.01.2018

ЕвгенийП 

для начала не я топикстартер. Поэтому менторский тон не туда направлен.

Mouflon
Offline
Зарегистрирован: 17.01.2018

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');
      }
    }
  }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Mouflon пишет:

для начала не я топикстартер.

Блин, дейстивительно. И нафига ж было "ответом" делать? Я теперь поправить не могу :(

MizAL
Offline
Зарегистрирован: 04.04.2018

Я примерно это и подозревал. Спасибо, что ткнули пальцем)

MizAL
Offline
Зарегистрирован: 04.04.2018

Всегда выводит одну и ту же комбинацию цифр: 8227025956. Даже если приложить другую метку к считывателю

 
MizAL
Offline
Зарегистрирован: 04.04.2018

А как решить это? Просто у меня уже идеи кончились...

Mouflon
Offline
Зарегистрирован: 17.01.2018

В одиночном режиме всё работает нормально? 

 

MizAL
Offline
Зарегистрирован: 04.04.2018

Понял, почему цифры выводило. В Serial.println() надо в кавычках было текст писать) А так loop работает как надо, но через раз (точнее больше не работает).

MizAL
Offline
Зарегистрирован: 04.04.2018

С одним считывателем? 

MizAL
Offline
Зарегистрирован: 04.04.2018

Да, работает.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

MizAL пишет:

А так loop работает как надо, но через раз (точнее больше не работает).

MizAL пишет:

С одним считывателем? 

MizAL пишет:

Да, работает.

Ну, и разговор у вас, мужики :)))

- Беня, Вы случаем не играете на скрипке?
- Я? Да, конечно!
- Играете?
- Нет. Не играю. А вот мой сын Изя, тот таки да!
- Играет?
- Нет, тоже не играет.
 
dimon261070
Offline
Зарегистрирован: 06.01.2018

Прошу ПОМОЩИ  !!!

Написал небольшу програмку и собрал схему, работает очень странно, плиз может ктонибудь подсказать что не так,

Управляю четырьмя реле, при помощи четырёх сенсорных кнопок. Управление работает нормально, но при попытке управления с кнопки "четыре", происходит какая то чертовщина. То сработает нужное реле 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:;

}

Mouflon
Offline
Зарегистрирован: 17.01.2018

Есть куча титановых велосипедов для таких случаев. возьмите 4 штуки. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

dimon261070 пишет:
При упрвлении с кнопок 1,2,3, все проходит штатно.

реле 1,2,3 управляют включить-выключить нагрузку (свет)

реле 4 управляет катушкой электромагнитного замка.

Т.е. не работает с индуктивной нагрузкой. Понятно. Осциллораф есть? И еще, в любом случае, схему и фото сборки давайте в студию. Чтобы было видно как собрано, от чего питается, какая защита стоит и т.п.

dimon261070
Offline
Зарегистрирован: 06.01.2018

Уважаемый Евгений, прочитав Ваши вопросы, отбросил с реле 4 провод фазы 220В, который питал блок питания 12В для электромагнитного замка, проверил схему, ВСЁ работает. Сейчас попробую подключить к реле разрыв провода питания замка 12В. Благодарю за отзыв, который натолкнул копать в направлении железа, а не проги. Если есть интерес скину схему и фото.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

без коментариев, потому что у меня нет слов

101  if (PUSH4 == 1 ) {    //если нажата кнопка .
102  goto label;
103 }
104  else goto label1;
114   label:
115     digitalWrite (11, LOW);
116     delay (2000);
117     digitalWrite (11, HIGH);
118   label1:;

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

qwone пишет:

без коментариев, потому что у меня нет слов

:-))))

Вот интересно, почему человек, у которо нет слов, не молчит?

dimon261070
Offline
Зарегистрирован: 06.01.2018

Первый проект, по сути первая программа, зачем БЕЗ СЛОВ КОМЕНТИТЬ? Вы видимо на форуме находитесь что бы не помогать , а поглумиться? ЗАХОДЯ НА ФОРУМ, "ПОДУМАЙ, А НУЖЕН ЛИ ТЫ СДЕСЬ?"

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

dimon261070 пишет:

 Если есть интерес скину схему и фото.

Скинете если сами не раберётесь.

Я бы на Вашем месте сечас перекинул бы нидуктивную нагрузку на другое реле и посмотрел бы.

Если по прежнему глючит именно индуктивная нагрузка - значит сто пудов проблема во всплеске напряжения при её выключении - надо смотреть питание и защиту.

А если глючит тоже самое реле с любой нагрузкой, то искал бы сопли в пайке или ещё чего вокруг того реле.

MizAL
Offline
Зарегистрирован: 04.04.2018

Кстати, может через I2C будет легче? Или еще вариант использовать сдвиговый регистр 74HC595 (если это вообще возможно)?