Несколько кнопок на ардуино

codingMike
Offline
Зарегистрирован: 14.12.2017

Помогите!

Нужно сделать 5 режимов работы устройства. Для этого использую 5 кнопок + 1 для изменения значения переменной.

Что не так с кодом?? Я подключил кнопки с подтягивающим резистором на 10кОм.

В любом случае выбирается один режим и больше не меняется! С 1 кнопкой все работало!

Помогите, пожалуйста!

#include <HX711.h>                                  // Подключаем библиотеку HX711 для работы с АЦП hx711
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <LiquidCrystal.h>

LiquidCrystal_I2C lcd(0x27,16,2);                   // Устанавливаем дисплей

HX711 scale(A1, A0);                                // Указываем в какие пины подключен АЦП hx711 (DT(DOUT)  - pin A1, SCK - pin A0)

//===============Mode =============
int choice = 0;
//=========================================

//=============== BUTTONS =================
int tara = 2;
int cMode = 3;

int normalB = 4;
int khB = 5;
int rxB = 6;
int assembleCase = 7;
int receiveCase = 8;
//=========================================

float myScale;                                      // Инициализируем переменную в которой будем хранить текущий вес
float myScale2;
float count_KH;
float count_RX;




void setup() {
  int choice = 0;
  Serial.begin(9600);                               // Инициализируем монитор порта, как устройство вывода
  Serial.println("Calibration...");                 // Выводим надпись

  
  scale.set_scale(-90.59);                          // Устанавливаем калибровочный коэффициент 
  scale.tare();                                     // Сбрасываем весы на 0
  myScale = round(scale.get_units(10));             // Запоминаем среднее значение без груза, но с учетом тары 
  
  Serial.println(0.00);                             // Обнуляем значение веса на мониторе порта (-1)
  
  
  //================ Кнопки с прерываниями =================
  pinMode(tara, INPUT);
  attachInterrupt(1, whenTare, RISING);
  
  pinMode(cMode, INPUT);
  attachInterrupt(2, changeMode, RISING);
  //========================================================
  
  
  //================ Подулючение кнопок ====================
  pinMode(normalB, INPUT);
  pinMode(khB, INPUT);
  pinMode(rxB, INPUT);
  pinMode(assembleCase, INPUT);
  pinMode(receiveCase, INPUT);
  //========================================================
  
  
}

void loop() {
  Serial.println(choice);
  
  while (choice == 0) {
    
    if (digitalRead(normalB) == 1) {
      choice = 2;
      Serial.println("Normal mode!");
      
    }
    
    else if (digitalRead(khB) == 1) {
      choice = 3;
      Serial.println("KH mode!");
    }
    
    else if (digitalRead(rxB) == 1) {
      choice = 4;
      Serial.println("RX mode!");
    }
    
    else if (digitalRead(assembleCase) == 1) {
      choice = 5;
      Serial.println("Case assembly mode!");
    }
    
    else if (digitalRead(receiveCase) == 1) {
      choice = 6;
      Serial.println("Receiving Case mode!");
    }
    
  }
  
 
  
    

  
  scale.power_up();                                 // Отключаем энергосберегающий режим hx711
  
  if (round(scale.get_units(10)) != myScale) {      // Условие выполняется, если округленный до граммов вес отличается от последнего
     
     
     
    
  }
  
  scale.power_down();                               // Включаем энергосберегающий режим hx711
  delay(500);                                     // Пауза на половину сек.
}









void normal() {
  
  myScale = scale.get_units(20);                  // Запоминаем текущий вес
  //Serial.println(myScale);
  myScale = round(myScale);                       // Запоминаем округленный текущий вес (для сравнения)
  myScale2 = myScale;

}

void whenTare() {
   
   scale.tare();
   Serial.println(myScale);
   
}

void kh() {
  
  count_KH = round(myScale / 18);
  Serial.println(int(count_KH));

}


void rx() {
  
  count_RX = round(myScale / 100);
  Serial.println(int(count_RX));

}

void changeMode() {
  choice = 0;
}






 

codingMike
Offline
Зарегистрирован: 14.12.2017

Что не так?

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

Как вы понимаете эту строку:  while (choice == 0) ?

А, там у вас на external interrupt подвешено зануление choice... Стабильно ли вызывается ли обработчик данного прерывания?

 

Еще раз допишу... https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/ -> 

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); (recommended)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

пропробуй 

volatile int choice = 0;

codingMike
Offline
Зарегистрирован: 14.12.2017

Всем большое спасибо!!!

про vоlatile в прерываниях не знал, спасибо за наводку)

спасибо за ссылку на официальный сайт. Как-то забыл там посмотреть. Проблему обнаружил. Дело в кнопках((

После нажатия на них остается положительный сигнал. Типа они выключатели...

Всем СПАСИБО !!!