Практический замок на Arduino UNO и RDM6300

Тема в разделе "Посоветуйте детальки", создана пользователем AndroT, 17 июл 2017.

  1. AndroT

    AndroT Guest

    Можете подсказать надежный англоязычный сайт или форум?!
     
  2. AndroT

    AndroT Guest

    Да, именно на эту строку и ругается компилятор.
     
  3. b707

    b707 Гуру

    попробуйте подставить туда
    for (int i=0; i<64 ;i++)
    интересно, скомпилируется?
     
    AndroT нравится это.
  4. AndroT

    AndroT Guest

    Да, спасибо, так оно и есть, нашел на форуме рабочий вариант:
    arduino и rfid rdm-6300

    Но как быть с остальной частью, я имею в виду пример работы с памятью, кто-нибудь сталкивался с этим?
     
    Student нравится это.
  5. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    попробуйте для начала. может подойдет
    https://robom.ru/blog/svyaz/rdm6300-rabota-s-beskontaktnymi-kartami.html
    сильно не вникал, там по моему нужно чуть чуть подправить, чтобы считывание только 1 раз происходило. но это мелочи. ну или http://tronixstuff.com/2013/11/19/arduino-tutorials-chapter-15-rfid/ там вообще все написано как работает. а так ресурсов много.
     
    AndroT нравится это.
  6. b707

    b707 Гуру

    вбейте в гугль строчку
    prog_char tag_0[] PROGMEM
    найдете этот скетч в полном виде и примеры работы с ним
     
    AndroT нравится это.
  7. AndroT

    AndroT Guest

    Спасибо, первый я смотрел, там все понятно, но это не то что надо, а со вторым поработаю, посмотрю что получится.
     
    Student нравится это.
  8. AndroT

    AndroT Guest

    Нашел эту библиотеку на официальном сайте, только не понял как ее скачать:
    pgmspace.h
     
  9. b707

    b707 Гуру

    Если вы пользуетесь Ардуино IDE. скорее всего эта библиотека у вас уже есть. Для проверки вставьте в начало скетча
    #include <avr/pgmspace.h>
    и попробуйте скомпилировать
     
    AndroT нравится это.
  10. AndroT

    AndroT Guest

    Вставил я этот вариант скетча с данной библиотекой и на библиотеку компилятор больше не ругается, но выдает ошибки на тип. Посмотрел документацию на эту библиотеку, там вроде бы есть такое понятие, но почему компилятор не хочет признать его?

    Код (C++):
    #include <SoftwareSerial.h>

    #include <avr/pgmspace.h>//Библиотека работы с памятью

    prog_char tag_0[] PROGMEM = "565A1132E0CF";//Значение нулевого слота памяти

    prog_char tag_1[] PROGMEM = "000000000000";//Значение первого слота памяти

    prog_char tag_2[] PROGMEM = "000000000000";//Значение второго слота памяти

    prog_char tag_3[] PROGMEM = "000000000000";//Значение третьего слота памяти

    prog_char tag_4[] PROGMEM = "000000000000";//Значение четвертого слота памяти

    prog_char tag_5[] PROGMEM = "000000000000";//Значение пятого слота памяти

    prog_char tag_6[] PROGMEM = "000000000000";//Значение шестого слота памяти

    PROGMEM const char *tag_table[] ={tag_0,tag_1,tag_2,tag_3,tag_4,tag_5,tag_6};

    SoftwareSerial SoftSerial(2,3);// Подключение RDM6300 к 8 и 9 пинам

    unsigned char buffer[64]; //Описание 64-битного массива буфера

    int count=0;//Описание переменной для работы с массивом

    char tagNumber[14];

    boolean receivedTag;

    void setup(){

    SoftSerial.begin(9600);// Запуск RDM6300

      Serial.begin(9600);//Запуск СОМ-порта

      pinMode(10,OUTPUT);// Указываем порт светодиода "Свой"

      pinMode(11,OUTPUT);}// Указываем порт светодиода "Чужой"

      void loop(){

    if (SoftSerial.available()){//Если в RDM6300 есть данные - переписываем из в массив

    receivedTag=false;

      while(SoftSerial.available()){//Чтение данных из RDM6300

        int BytesRead = SoftSerial.readBytesUntil(3, tagNumber, 15);

      receivedTag=true;}

        Serial.print(tagNumber);//Если данных больше нет - записываем значение в порт

         if (checkTag(tagNumber)){// Запрос сравнения значения с тем, что хранится в памяти

          Serial.print(" Svoy");// Если значение есть, значит свой

        digitalWrite(10,HIGH);// Зажигаем диод "Свой"

      delay(1000);// Ждем секунду

      digitalWrite(10,LOW);}// Гасим диод "Свой"

        else{

          Serial.print(" Chuzhoy");// Если значения нет, значит чужой

            digitalWrite(11,HIGH);// Зажигаем диод "Чужой"

      delay(1000);// Ждем секунду

      digitalWrite(11,LOW);}// Гасим диод "Чужой"

        clearBufferArray();//Запуск подпрограммы очистки буфера

        count = 0;//Обнуление переменной массива

        Serial.println();}}//Перевод строки перед записью нового значения

         boolean checkTag(String tag){// Определение значения переменной

       char testTag[14];

       for (int i = 0; i < sizeof(tag_table)/2; i++)

      {strcpy_P(testTag, (char*)pgm_read_word(&(tag_table[i])));

        if(tag.substring(1,13)==testTag){

          return true;// Возвращаем значение "Истина"

          break;}}

       return false;}// Возвращаем значение "Ложь"

    void clearBufferArray(){//Подпрограмма очистки буфера

    for (int i=0; i<count;i++)

        { buffer[i]=NULL;}}//Обнуление ячейки массива
     
    Вот собственно сообщение компилятора:

    exit status 1
    'prog_char' does not name a type
     
  11. b707

    b707 Гуру

    Нашел в гугле, что Ардуино IDE версий после 1.5.8 больше не поддерживают prog_char
    Там же вычитал решение - заменить все prog_char на const char
     
  12. AndroT

    AndroT Guest

    Спасибо Вам, попробую.