#1 Проекти » Arduino и PROGMEM » 2018-09-24 23:13:08

Dem
відповідей: 0

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

}

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

#2 Re: Проекти » Выбор правильного варианта из предложенных ардуино » 2018-09-03 10:31:16

Dem

Спасибо, идею понял. Объявляем int, присваиваем ему правильный ответ, затем через if else сравниваем с получиным от пользователя?

Гость, спасибо за руку помощи, вайбер есть?

#3 Re: Проекти » Выбор правильного варианта из предложенных ардуино » 2018-09-02 22:32:03

Dem

Проблемма в том, как сделать чтоб програма сравнивала полученный от пользователя с клавы символ и совершала действие. Если ответ правильный - написать ПРАВИЛЬНО на дисплее (это я научился) и вывести на экран второй вопрос и т.д. А если вариант неправильный - чтоб величина, отвечающая за жизни, стала меньше на 1. С  else и if знаком. Вот только проверку правильного ответа допилить не могу...

#4 Проекти » Выбор правильного варианта из предложенных ардуино » 2018-09-02 22:19:32

Dem
відповідей: 5

Добрый вечер!
Прощу помощи у опытных ардуищиков!
Имеется код, но не могу докумекать как заставить его работать как нужно.

Идея вот какая: на LCD (1602 подключен по I2C к ардуино нано) выводится вопрос: "Первый ответ, выберите A, B,C,D". Затем с клавы (клавиатура мембранная, 4х4) вводится  нужная буковка и, если ответ правильный, вылазит что-то вроде "ПРАВИЛЬНО" и после этого выводится "Второй ответ, выберите A, B, C, D" ну и дальше четвертый, пятый и т.д. Если неправильный, сгорает одна жизнь (заранее задается количество). Если сгорает последняя жизнь, то на дисплее что-то вроде: ГЕЙМ ОВЕР и дисплей гаснет, на кнопки не реагирует.

ПРОБЛЕМА: не могу додуматься, как сравнивать букву (нажатую кнопку на клаве), полученную от пользователя, с уже зашитым (правильным) вариантом для каждого из вопросов. Т.е. как сделать так, чтоб после получения правильного ответа от пользователя, програма сравнивала его с извесным. Если полученный ответ правильный, на экран выводить (ПРАВИЛЬНО) и показывать следующий вопрос. Если неправильный - чтоб величина, отвечающая за "жизни" стала меньше на 1. Если жизни закончатся - гейм овер. Если все ответы правильные и жизни не закончились - победа.

На сколько мне хватило знаний, написал, дальше прошу Вашей помощи... Матчасть читал, но додуматься как довести идею до финиша - немогу...
С програмированием дело имел только в школе, сейчас решил занятся так как преподаю деткам английский на дому. Решил сделать "умного робота", в какой заранее забиваю правильные ответы, а детки с ним взаимодействуют. Типо решил задание, выбрал вариант, а робот проверил. Сами понимаете, заитересовывать и учить молодое поколение нужно любыми средствами. По образованию - инженер строитель, по призванию учитель английсого языка. Ардуинка - хобби. Прошу прощения за много лишнего текста, вот код (вроде его правильно вставил, но если нет, поправьте, пожалуйста).


#include <Keypad.h>
#include <Servo.h>
#include <LCD_1602_RUS.h>

Servo servo; // в конце, если все ответы правильные, севра открывает лючок где лежит конфетка. Но до этого еще далеко

char question1 = 'A'; // тут вводятся правильные ответы.
char question2 = 'B';
char question3 = 'B';
char question4 = 'D';
char question5 = 'C';

LCD_1602_RUS lcd(0x27, 16, 2);

int ilosc; // number of clicks

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()
{
  Serial.begin(9600);

  servo.attach(2);
  lcd.begin();
  lcd.setCursor(0, 0);
  lcd.print("ПЕРВЫЙ ОТВЕТ:");
  lcd.setCursor(0, 1);
  lcd.print("Выберите A,B,C,D");
}
void loop() {

  lcd.setCursor(0, 0);
  lcd.print("ПЕРВЫЙ ОТВЕТ:");
  lcd.setCursor(0, 1);
  lcd.print("Выберите A,B,C,D");

  char key = keypad.getKey();
  if (key == 'A')
  {
    lcd.setCursor(9, 1);
    lcd.cursor();                 // показываем курсор
    lcd.blink();                  // заставляем его мигать
    delay(3000);
    lcd.noBlink();
  }
  else if (key == 'B')
  {
    lcd.setCursor(11, 1);
    lcd.cursor();                 // показываем курсор
    lcd.blink();                  // заставляем его мигать
    delay(3000);
    lcd.noBlink();
  }
  else if (key == 'C')
  {
    lcd.setCursor(13, 1);
    lcd.cursor();                 // показываем курсор
    lcd.blink();                  // заставляем его мигать
    delay(3000);
    lcd.noBlink();
  }
  else if (key == 'D')
  {
    lcd.setCursor(15, 1);
    lcd.cursor();                 // показываем курсор
    lcd.blink();                  // заставляем его мигать
    delay(3000);
    lcd.noBlink();

    lcd.setCursor(0, 0);
    lcd.print("ВТОРОЙ ОТВЕТ:");
    lcd.setCursor(0, 1);
    lcd.print("Выберите A,B,C,D");
    delay(3000);
    if (key == 'A')
    {
      lcd.setCursor(9, 1);
      lcd.cursor();                 // показываем курсор
      lcd.blink();                  // заставляем его мигать
      delay(3000);
      lcd.noBlink();
    }
    else if (key == 'B')
    {
      lcd.setCursor(11, 1);
      lcd.cursor();                 // показываем курсор
      lcd.blink();                  // заставляем его мигать
      delay(3000);
      lcd.noBlink();
    }
    else if (key == 'C')
    {
      lcd.setCursor(13, 1);
      lcd.cursor();                 // показываем курсор
      lcd.blink();                  // заставляем его мигать
      delay(3000);
      lcd.noBlink();
    }
    else if (key == 'D')
    {
      lcd.setCursor(15, 1);
      lcd.cursor();                 // показываем курсор
      lcd.blink();                  // заставляем его мигать
      delay(3000);
      lcd.noBlink();
    }
    else if (key == '1', '2', '3', '4', '5', '6', '7', '8', '9')
    {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Цифры не трогать");
      lcd.noCursor();
      delay(1000);
      lcd.noBlink();
    }
  }
}

Підвал форуму