#1 2018-09-24 23:13:08

Dem
Участник
Зарегистрирован: 2018-09-02
Сообщений: 4

Arduino и PROGMEM

Добрый вечер!
Прощу помощи у опытных юзеров!
Уже обращался с этим вопросом, получил пинок нужном направлении, однако усвоил не до конца.
Суть: Нужен проверщик ответов. Т.е. заранее прописываем правильные ответы, задаем вопросы, проверяем, и выводим на дисплей результат. Если ответ правильный - переходим к следующему. В арсенале ардуинка, LCD, мембранная клава.
Вот код:

#include <Keypad.h>
#include <LCD_1602_RUS.h>
#include <Password.h>
#include <Servo.h>
#include <avr/pgmspace.h>
#define Q_COUNT 4

Servo servo;

LCD_1602_RUS lcd(0x27, 16, 2);


const char asnwer_good[] PROGMEM = "Правильно";
const char answer_bad[] PROGMEM = "Неправильно!";
const char answers[] PROGMEM = { 'A', 'C', 'D', 'A' };// тут сидят правильные ответы

const char question01[] PROGMEM = "Первый вопрос?";
const char question02[] PROGMEM = "Второй вопрос?";
const char question03[] PROGMEM = "Третий вопрос?";
const char question04[] PROGMEM = "Четвертый вопрос?";


const char* const questions[] PROGMEM = { question01, question02, question03, question04 };

char buffer[90];
char key_answer;

const byte ROWS = 4; // 4 строки
const byte COLS = 4; // 4 столбца
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {12, 11, 10, 9}; // тут пишем диджитал пины к которым клава коннектится к ардуинке.
byte colPins[COLS] = {8, 7, 6, 5};   //  Просто тупо слева направо первые 4 это ROWS последние 4 COLS.

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup()
{
 
  servo.attach(2);
  lcd.begin();
}

void loop() {
   
  // Проходим по списку вопросов
  for (int i = 0; i < Q_COUNT; i++)
  {
    strcpy_P(buffer, (char*)pgm_read_word(&(questions[i])));
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(buffer);
    if (pgm_read_word_near(answers + i) == keypad.getKey())
    {
      strcpy_P(buffer, (char*)pgm_read_word(&(asnwer_good)));
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(buffer);
    } else {
      strcpy_P(buffer, (char*)pgm_read_word(&(answer_bad)));
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(buffer);

      // Выходим из цикла / начинаем сначала.
      break;
    }
  }

}

Суть проблеммы: не вижу свою ошибку. Вроде-бы умные люди мне показали как надо, я подправил под свои нужны, а все-равно не работает.
Как сделать "Проверщик ответов"?

Быстрое сообщение

Введите сообщение и нажмите Отправить

Подвал раздела