Помогите с программированием

jekjeker@gmail.com
Offline
Зарегистрирован: 19.01.2018
Программа заключается в том , чтобы на вопросы есть варианты ответа , человек нажимает на кнопку (Один из вариартов ответа ) и на дисплеи (OLED ) должно показать верно или не верно . Но на дисплеи выдает какую-то мигающею ерунду , помогите пж 
 
 
 
 
 
 
 
#include <OLED_I2C.h>
 
 
OLED disp(SDA, SCL, 8);
extern uint8_t SmallFont[];
 
const int bp0 = 7; //A
const int bp1 = 6; //Б
const int bp2 = 5; //В
const int bp3 = 4; //Г
const int bp4 = 3; //С
const int x = 0;
const int y = 0;
 
 
int bs0;
int bs1;
int bs2;
int bs3;
int bs4;
int question;
 
void setup() {
  disp.begin();
  disp.setFont(SmallFont);
  pinMode(bp0, INPUT_PULLUP);
  pinMode(bp1, INPUT_PULLUP);
  pinMode(bp2, INPUT_PULLUP);
  pinMode(bp3, INPUT_PULLUP);
  pinMode(bp4, INPUT_PULLUP);
}
 
void loop() {
  
  bs0 = digitalRead(bp0);
  bs1 = digitalRead(bp1);
  bs2 = digitalRead(bp2);
  bs3 = digitalRead(bp3);
  bs4 = digitalRead(bp4);
 
  Serial.println(bs0);
  Serial.println(bs1);
  Serial.println(bs2);
  Serial.println(bs3);
  Serial.println(bs4);
  
  if (bs4==HIGH && question==0) {
    question = 1 + (rand() % static_cast<int>(132 - 1 + 1));
    disp.clrScr();
    disp.print(question,x,y);
    disp.update();
    delay(50);
  } else if (bs0==HIGH && question!=0) {
    checkAnsver("A");
    delay(50);
  } else if (bs1==HIGH && question!=0) {
    checkAnsver("B");
    delay(50);
  } else if (bs2==HIGH && question!=0) {
    checkAnsver("C");
    delay(50);
  } else if (bs3==HIGH && question!=0) {
    checkAnsver("D");
    delay(50);
  }
}
 
void checkAnsver(String buttonLabel) {
  String ansver = getAnsver();
  if (ansver.equals(buttonLabel)) {
    disp.print("no!",x,y);
  } else {
    disp.print("yes!",x,y);
  }
  question = 0;
}
 
String getAnsver() {
  switch(question) {
    case 1: return "B";
    case 2: return "C";
    case 3: return "C";
    case 4: return "A";
    case 5: return "D";
    case 6: return "B";
    case 7: return "A";
    case 8: return "D";
    case 9: return "A";
    case 10: return "D";
    case 11: return "A";
    case 12: return "C";
    case 13: return "A";
    case 14: return "B";
    case 15: return "C";
    case 16: return "D";
    case 17: return "B";
    case 18: return "D";
    case 19: return "C";
    case 20: return "A";
    case 21: return "C";
    case 22: return "D";
    case 23: return "C";
    case 24: return "B";
    case 25: return "A";
    case 26: return "A";
    case 27: return "C";
    case 28: return "D";
    case 29: return "B";
    case 30: return "A";
    case 31: return "B";
    case 32: return "B";
    case 33: return "C";
    case 34: return "D";
    case 35: return "A";
    case 36: return "B";
    case 37: return "B";
    case 38: return "B";
    case 39: return "D";
    case 40: return "B";
    case 41: return "A";
    case 42: return "B";
    case 43: return "A";
    case 44: return "D";
    case 45: return "B";
    case 46: return "C";
    case 47: return "A";
    case 48: return "C";
    case 49: return "D";
    case 50: return "B";
    case 51: return "A";
    case 52: return "A";
    case 53: return "C";
    case 54: return "B";
    case 55: return "B";
    case 56: return "D";
    case 57: return "C";
    case 58: return "B";
    case 59: return "C";
    case 60: return "A";
    case 61: return "D";
    case 62: return "D";
    case 63: return "A";
    case 64: return "B";
    case 65: return "C";
    case 66: return "B";
    case 67: return "A";
    case 68: return "C";
    case 69: return "C";
    case 70: return "D";
    case 71: return "A";
    case 72: return "C";
    case 73: return "D";
    case 74: return "C";
    case 75: return "D";
    case 76: return "B";
    case 77: return "D";
    case 78: return "C";
    case 79: return "A";
    case 80: return "A";
    case 81: return "C";
    case 82: return "B";
    case 83: return "C";
    case 84: return "B";
    case 85: return "C";
    case 86: return "A";
    case 87: return "A";
    case 88: return "D";
    case 89: return "D";
    case 90: return "B";
    case 91: return "A";
    case 92: return "A";
    case 93: return "B";
    case 94: return "A";
    case 95: return "B";
    case 96: return "B";
    case 97: return "B";
    case 98: return "C";
    case 99: return "D";
    case 100: return "D";
    case 101: return "B";
    case 102: return "C";
    case 103: return "B";
    case 104: return "A";
    case 105: return "A";
    case 106: return "B";
    case 107: return "A";
    case 108: return "B";
    case 109: return "A";
    case 110: return "A";
    case 111: return "A";
    case 112: return "B";
    case 113: return "D";
    case 114: return "B";
    case 115: return "B";
    case 116: return "C";
    case 117: return "A";
    case 118: return "A";
    case 119: return "C";
    case 120: return "C";
    case 121: return "C";
    case 122: return "B";
    case 123: return "A";
    case 124: return "A";
    case 125: return "B";
    case 126: return "A";
    case 127: return "B";
    case 128: return "B";
    case 129: return "A";
    case 130: return "C";
    case 131: return "D";
    case 132: return "B";
  }
}
 
b707
Offline
Зарегистрирован: 26.05.2017

почему все "новЕчки" так любят оператор switch? - без него процедуру getanswer можно было бы записать раз в 20 короче.

По делу в вопрос не вникал - сначала выложите код как положено в форуме, правила в прикремпленной теме вверху.

5N62V
Offline
Зарегистрирован: 25.02.2016

OLED disp(SDA, SCL, 8); - а SDA и  SCL точно не надо дефайнить?

bwn
Offline
Зарегистрирован: 25.08.2014

b707 пишет:

почему все "новЕчки" так любят оператор switch? - без него процедуру getanswer можно было бы записать раз в 20 короче.

ЧСУ повышает, гляньте сколько строк напрогмячил.

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

почему все "новЕчки" так любят оператор switch? - без него процедуру getanswer можно было бы записать раз в 20 короче.

switch короче, чем if ;)

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

sadman41 пишет:
switch короче, чем if ;)
А использовать структуру или массив ума маловато.

char answers[] = {
  'B', 'C', 'C', 'A', 'D', 'B', 'A', 'D', 'A', 'D', /*1-10*/
  'A', 'C', 'A', 'B', 'C', 'D', 'B', 'D', 'C', 'A', /*11-20*/
  'C', 'D', 'C', 'B', 'A', 'A', 'C', 'D', 'B', 'A', /*21-30*/
  'B', 'B', 'C', 'D', 'A', 'B', 'B', 'B', 'D', 'B', /*31-40*/
  'A', 'B', 'A', 'D', 'B', 'C', 'A', 'C', 'D', 'B', /*41-50*/
  'A', 'A', 'C', 'B', 'B', 'D', 'C', 'B', 'C', 'A', /*51-60*/
  'D', 'D', 'A', 'B', 'C', 'B', 'A', 'C', 'C', 'D', /*61-70*/
  'A', 'C', 'D', 'C', 'D', 'B', 'D', 'C', 'A', 'A', /*71-80*/
  'C', 'B', 'C', 'B', 'C', 'A', 'A', 'D', 'D', 'B', /*81-90*/
  'A', 'A', 'B', 'A', 'B', 'B', 'B', 'C', 'D', 'D', /*91-100*/
  'B', 'C', 'B', 'A', 'A', 'B', 'A', 'B', 'A', 'A', /*111-120*/
  'A', 'B', 'D', 'B', 'B', 'C', 'A', 'A', 'C', 'C', /*121-130*/
  'C', 'B', 'A', 'A', 'B', 'A', 'B', 'B', 'A', 'C', /*131-140*/
  'D', 'B'/*141-142*/
};

 

sadman41
Offline
Зарегистрирован: 19.10.2016

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

b707
Offline
Зарегистрирован: 26.05.2017

qwone пишет:

sadman41 пишет:
switch короче, чем if ;)
А использовать структуру или массив ума маловато.

char answers[] = {
  'B', 'C', 'C', 'A', 'D', 'B', 'A', 'D', 'A', 'D', /*1-10*/
  'A', 'C', 'A', 'B', 'C', 'D', 'B', 'D', 'C', 'A', /*11-20*/
  'C', 'D', 'C', 'B', 'A', 'A', 'C', 'D', 'B', 'A', /*21-30*/
  'B', 'B', 'C', 'D', 'A', 'B', 'B', 'B', 'D', 'B', /*31-40*/
  'A', 'B', 'A', 'D', 'B', 'C', 'A', 'C', 'D', 'B', /*41-50*/
  'A', 'A', 'C', 'B', 'B', 'D', 'C', 'B', 'C', 'A', /*51-60*/
  'D', 'D', 'A', 'B', 'C', 'B', 'A', 'C', 'C', 'D', /*61-70*/
  'A', 'C', 'D', 'C', 'D', 'B', 'D', 'C', 'A', 'A', /*71-80*/
  'C', 'B', 'C', 'B', 'C', 'A', 'A', 'D', 'D', 'B', /*81-90*/
  'A', 'A', 'B', 'A', 'B', 'B', 'B', 'C', 'D', 'D', /*91-100*/
  'B', 'C', 'B', 'A', 'A', 'B', 'A', 'B', 'A', 'A', /*111-120*/
  'A', 'B', 'D', 'B', 'B', 'C', 'A', 'A', 'C', 'C', /*121-130*/
  'C', 'B', 'A', 'A', 'B', 'A', 'B', 'B', 'A', 'C', /*131-140*/
  'D', 'B'/*141-142*/
};

 

Квон, массив символов - это же строка, зачем же ты так пишешь строку?

Вот так надо:

char answers[] = "BCCADBADADACABCDBDCA.... DB" ; /*141-142*/
b707
Offline
Зарегистрирован: 26.05.2017

Более того, раз в строке только 4 варианта символов, то использовать на каждый по байту - расточительно. Можно кодировать каждый символ двумя битами и упаковать строку в 4 раза плотнее :)

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

b707 пишет:
Вот так надо:

char answers[] = "BCCADBADADACABCDBDCA.... DB" ; /*141-142*/

А вот так не надо. Человек к примеру сделал эту программу и сдал заказчику. Но потом заказчик пришел с новой аналогичной задачей. И надо переделать программу под новые тесты. И что опять разбираться что и куда пихать. А если еще и плотно упаковано. Убивать время на распаковку.

5N62V
Offline
Зарегистрирован: 25.02.2016

qwone пишет:

 А вот так не надо. Человек к примеру сделал эту программу и сдал заказчику. Но потом заказчик пришел с новой аналогичной задачей. И надо переделать программу под новые тесты. И что опять разбираться что и куда пихать. А если еще и плотно упаковано. Убивать время на распаковку.

Да фиг с ним, с заказчиком! Новая задача - новый прайс :))

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

5N62V пишет:

 Да фиг с ним, с заказчиком! Новая задача - новый прайс :))

Почему Моисей водил евреев 40 лет по пустыне, хотя там напрямки месяц ходу. Так новая задача. Евреи багатыми были и надо все эти деньги освоить. Но заказчик может сказать, нафиг такие программисты.У них что бы поправить код стоимость как новый проект.

b707
Offline
Зарегистрирован: 26.05.2017

qwone пишет:

[А вот так не надо. Человек к примеру сделал эту программу и сдал заказчику. Но потом заказчик пришел с новой аналогичной задачей. И надо переделать программу под новые тесты. И что опять разбираться что и куда пихать. А если еще и плотно упаковано. Убивать время на распаковку.

Если данные вручную кодировать - то ты прав. Но это плохой подход. Я вообще удивляюсь, как тебе не лень было массив из 144 символов набивать - я вон на третьем десятке сдался.

Если говорить "как не надо" - не нвдо заполнять такие таблицы вручную. А если заполнять вспомогательной программой. то совершенно одинаково - либо как у тебя, либо в одну строку, как у меня или даже упаковано по 4 символа в байт. Зато чем плотнее - тем меньше места займет, а для контроллеров это важно.