#1 Re: Програмування Arduino » Не меняется переменная » 2019-08-17 21:52:28

Спасибо, вопрос решен заменой библиотеки.
Ув. г0сть таки был прав)

#2 Re: Програмування Arduino » Не меняется переменная » 2019-08-17 20:41:44

ИМХО, где-то просто глупая ошибка новичка, ведь все остальное работает нормально.

#3 Програмування Arduino » Не меняется переменная » 2019-08-17 20:01:58

Darrel
відповідей: 3

День (вечер-ночь-утро) добрый уважаемое сообщество!

Делаю мини-комп на велик (с кучей всего)
Теперь собственно вопрос.
- при зажатии клавиши переменная режима (mode) скачет туда-сюда
- не изменяется переменная меню экрана (screen), кнопки точно рабочие)

#include <GyverTimer.h>
GTimer_ms blinc;
GTimer_ms stopl;

#include <iarduino_RTC.h>
iarduino_RTC time(RTC_DS1302, 3, 9, 4);

#include <GyverButton.h>
GButton butt_r(10); //кнопка право
GButton butt_l(11); //кнопка лево
GButton butt_c(12); //кнопка центр
GButton butt_s(A2); //кнопка stop
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);

#include <EEPROM.h>


unsigned long lastturn, time_press; //переменные хранения времени
float SPEED; //переменная хранения скорости в виде десятичной дроби
float DIST; //переменная хранения расстояния в виде десятичной дроби
float w_length = 2.060; //длина окружности колеса в метрах
byte light = 0; //режим работы габаритов
int screen = 0; //режим работы дисплея
bool mode = 0; //режим работы кнопок
bool alarm = 0; // сигнализация

void setup() {
  // настройки пинов
  pinMode(5, OUTPUT); //свет середина
  pinMode(6, OUTPUT); //свет право
  pinMode(7, OUTPUT); //свет центр
  pinMode(8, OUTPUT); //свет лево
  pinMode(13, OUTPUT); //свет лево контрол
  pinMode(A0, OUTPUT); //свет центр контрол
  pinMode(A1, OUTPUT); //свет право контрол
  pinMode(A3, OUTPUT); //зуммер

  time.begin();
  lcd.init();
  lcd.init();
  lcd.backlight();
  blinc.setInterval(777);
  stopl.setInterval(7777);

  Serial.begin(9600);  //открыть порт

  attachInterrupt(0, sens, RISING); //подключить прерывание на 2 пин при повышении сигнала

  //--------------
  DIST = (float)EEPROM.read(0) / 10.0; //вспоминаем пройденное расстояние при запуске системы (деление на 10 нужно для сохранения десятых долей расстояния, см. запись)
}

void sens() {
  if (millis() - lastturn > 80) { //защита от случайных измерений (основано на том, что велосипед не будет ехать быстрее 120 кмч)
    SPEED = w_length / ((float)(millis() - lastturn) / 1000) * 3.6; //расчет скорости, км/ч
    lastturn = millis(); //запомнить время последнего оборота
    DIST = DIST + w_length / 1000; //прибавляем длину колеса к дистанции при каждом обороте оного
  }
}

void loop() {
  // отработка кнопок
 Serial.print(screen); 
 Serial.println(mode);
  butt_l.tick();
  butt_c.tick();
  butt_r.tick();
  butt_s.tick();
  if (butt_l.isClick() && mode == 0) light = 1;
  if (butt_l.isClick() && mode == 1) {screen--;}
  if (butt_r.isClick() && mode == 0) light = 2;
  if (butt_r.isClick() && mode == 1) {screen++;}
  if (butt_c.isClick() && mode == 0) light = 3;
  if (butt_c.isDouble() && mode == 0) light = 4;
  if (butt_c.isHold()) mode = !mode;
  if (butt_s.isPress()) light = 5;
  if (butt_s.isRelease()) light = 0;

  // отработка кнопок

  // отработка габаритов
  switch (light) {
    case 0: off();
      break;
    case 1: left();
      break;
    case 2: right();
      break;
    case 3: stop_1();
      break;
    case 4: stop_2();
      break;
  }

  // отработка экрана
  switch (screen) {
    case 0: def();
      break;
    case 1: date();
      break;
    case 2: max_s();
      break;
    case 3: max_d();
      break;
    case 4: alrm();
      break;
  }
}

// функции габаритов
void off() {
  digitalWrite (5, 0);
  digitalWrite (6, 0);
  digitalWrite (7, 0);
  digitalWrite (8, 0);
  digitalWrite (A0, 0);
  digitalWrite (A1, 0);
  digitalWrite (13, 0);
}
void left() {
  digitalWrite (8, 1);
  digitalWrite (7, 1);
  digitalWrite (13, 1);
  digitalWrite (5, 0);
  digitalWrite (6, 0);
  digitalWrite (A0, 0);
  digitalWrite (A1, 0);
  if (blinc.isReady()) {
    digitalWrite (8, !digitalRead(8));
  }
  if (butt_l.isDouble()) light = 0;
}
void right() {
  digitalWrite (6, 1);
  digitalWrite (7, 1);
  digitalWrite (A1, 1);
  digitalWrite (5, 0);;
  digitalWrite (8, 0);
  digitalWrite (A0, 0);
  digitalWrite (13, 0);
  if (blinc.isReady()) {
    digitalWrite (6, !digitalRead(6));
  }
  if (butt_r.isDouble()) light = 0;
}
void stop_1() {
  digitalWrite (8, 1);
  digitalWrite (6, 1);
  digitalWrite (5, 0);
  digitalWrite (7, 1);
  digitalWrite (A0, 1);
  digitalWrite (A1, 0);
  digitalWrite (13, 0);
  if (butt_c.isTriple()) light = 0;
  }
void stop_2() {
  digitalWrite (5, 0);
  digitalWrite (7, 0);
  digitalWrite (A1, 0);
  digitalWrite (13, 0);  
  if (blinc.isReady()) {
    digitalWrite (8, !digitalRead(8));
    digitalWrite (6, !digitalRead(6));
    digitalWrite (A0, !digitalRead(A0));
  }
  if (butt_c.isTriple()) light = 0;
}

// функции экрана
void def() {
  lcd.setCursor(2, 1);
  lcd.print(time.gettime("H:i:s D"));
}
void date() {
  lcd.setCursor(3, 0);
  lcd.print(time.gettime("d-m-Y"));
  lcd.setCursor(2, 1);
  lcd.print(time.gettime("H:i:s D"));
}
void max_s() {
  lcd.setCursor(3, 0);
  lcd.print("MAX SPEED");
}
void max_d() {
  lcd.setCursor(3, 0);
  lcd.print("MAX DIST");
}
void alrm() {
  lcd.setCursor(3, 0);
  lcd.print("ALARM");
  lcd.setCursor(2, 1);
  lcd.print(alarm);
  if (butt_c.isClick()) alarm = !alarm;
}

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