Ввод числа в переменную.

sintaz
Offline
Зарегистрирован: 22.12.2018

Всем добрый вечер.

Не кидайте палками, мучаюсь, не могу разобраться.

Есть светодиод, матричная клавиатура и кнопка.

При нажатии кнопки светодиод мигает через delay. значение в delay берется из переменной "r"

Как до нажатия кнопки ввести другое значение в переменную "r"?

#include <Keypad.h>
const int s = 12;
int led = 2;
int r = 500;
const byte ROWS = 4;
const byte COLS = 4;
char button;
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {A0,A1,A2,A3}; // подключение к строкам клавиатуры
byte colPins[COLS] = {4,5,6,7};     // подключение к столбцам клавиатуры
Keypad customKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);

// Этот код выполняется только один раз: при включении платы
void setup() 
{
  pinMode(s, INPUT);
  pinMode(led, OUTPUT);
   button = customKeypad.getKey(); // Определение нажатой кнопки
Serial.print(button);  
  Serial.begin(9600);
}

// Этот код выполняется постоянно
void loop() { 

  if (digitalRead(s) == HIGH) {
   test:
  digitalWrite(led, HIGH);
delay(r);
digitalWrite(led, LOW);
delay(r);
goto test;
  }
}

 

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

Откуда ввести - из космоса?

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

Код Вы писали, или стащили где-то? Хоть букву в нём понимаете? Если да, то что означает значок "=" в строках 2, 3, 4, 5 и 6?

sintaz
Offline
Зарегистрирован: 22.12.2018

Значит, что переменным s, led, r, ROWS, COLS присваиваются значения 12 (пин к которому подключена кнопка), 2 (пин с диодом), 500, 4 и 4, (количество строк и столбцов). 

Код из примеров, только для того, что бы разобраться как в переменную ввести данные с клавиатуры до начала функции loop. 

Не прошу готового результата, хотя бы где об этом прочитать. 

Не претендую на звание "лучший код года", с ардуино пару недель всего, для завершения моего проекта только эта проблема и осталась. 

sintaz
Offline
Зарегистрирован: 22.12.2018

с матричной клавиатуры. или хотя бы с монитора порта.

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

Ключевое слово - parseInt()

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

sintaz пишет:
Как до нажатия кнопки ввести другое значение в переменную "r"?

sintaz пишет:
что бы разобраться как в переменную ввести данные с клавиатуры до начала функции loop.

Вы бы определились, вам до нажатия или после?

sintaz
Offline
Зарегистрирован: 22.12.2018

Так нажатие кнопки в функции loop происходит.
Я определился сразу.

sintaz
Offline
Зарегистрирован: 22.12.2018

Почитаю, спасибо.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

sintaz пишет:
Так нажатие кнопки в функции loop происходит. Я определился сразу.

Нажатие кнопки производится на клавиатуре человеком (ну или кем-то/чем-то еще) и от функции loop это событие никак не зависит. 

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

И скорее всего начинать надо так

/**/
const byte ledPin = 2;
bool led;
unsigned long time = 1000;
unsigned long past;
void standLed(bool l) {
  led = l;
  switch (led) {
    case 0:
      digitalWrite(ledPin, LOW);
      break;
    case 1:
      digitalWrite(ledPin, HIGH);
      break;
  }
}
//-------------------------------------------------
#include <Keypad.h>
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {A0, A1, A2, A3}; // подключение к строкам клавиатуры
byte colPins[COLS] = {4, 5, 6, 7};  // подключение к столбцам клавиатуры
Keypad customKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);

// Этот код выполняется только один раз: при включении платы
void setup()
{
  pinMode(ledPin, OUTPUT);
  standLed(1);
  Serial.begin(9600);
}

// Этот код выполняется постоянно
void loop() {
  switch (led) {
    case 0:
      if (millis() - past >= time) standLed(1);
      break;
    case 1:
      if (millis() - past >= time) standLed(0);
      break;
  }
  char button = customKeypad.getKey(); // Определение нажатой кнопки
  switch (button) {
    case '0':
      Serial.print(button);
      break;
    case '1':
      Serial.print(button);
      break;
    case '2':
      Serial.print(button);
      break;
    case '3':
      Serial.print(button);
      break;
    case '4':
      Serial.print(button);
      break;
    case '5':
      Serial.print(button);
      break;
    case '6':
      Serial.print(button);
      break;
    case '7':
      Serial.print(button);
      break;
    case '8':
      Serial.print(button);
      break;
    case '9':
      Serial.print(button);
      break;
    case 'C':/*очистка*/
      Serial.println("Clear");
      break;
    case 'D':/*ввод*/
      Serial.println("ENTER");
      break;
  }
}

 

sintaz
Offline
Зарегистрирован: 22.12.2018

До начала мигания светодиода. Так лучше?

sintaz
Offline
Зарегистрирован: 22.12.2018

Спасибо. Я понимаю, что мигать нужно без delay.
В итоге мне будет нужно с клавиатуры задавать количество шагов, которые должен сделать шаговый двигатель.
Мигание светодиода выбрал просто, чтоб меньше строк перед глазами было.

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

Ну да. Я просто показываю направление, как должен выглядить скетч. Ну по крайней мере один из вариантов.

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

sintaz пишет:

Значит, что переменным s, led, r, ROWS, COLS присваиваются значения 

Такзначит Вы знаете как присвоить перемнной значение. А в чём тогда Ваш вопрос, я что-то не понял?

sintaz
Offline
Зарегистрирован: 22.12.2018

Вопрос в том, как ей присвоить значение введя его с клавиатуры после подачи питания на плату.

вот так получилось. 

Но можно ли тоже самое проделать в void setup() ?

void loop() { 
  
 if (digitalRead(s) == HIGH) {
   test:
  digitalWrite(led, HIGH);
delay(r);
digitalWrite(led, LOW);
delay(r);
if (Serial.available() > 0) {
    r = Serial.parseInt();
    Serial.println(r);}
goto test;
  }

Вот такой метод нормальный?

void loop() { 
   for (r; r < 1;){
    r = Serial.parseInt();
    Serial.println(r);
    delay(100);
   }
 if (digitalRead(s) == HIGH) {
   test:
  digitalWrite(led, HIGH);
delay(r);
digitalWrite(led, LOW);
delay(r);

goto test;
  }

 

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

sintaz, Вы адекватный человек, или для вас программирование идет по приколу?

sintaz
Offline
Зарегистрирован: 22.12.2018

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