Несколько кнопок на ардуино
- Войдите на сайт для отправки комментариев
Чт, 14/12/2017 - 23:27
Помогите!
Нужно сделать 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;
}
Что не так?
Как вы понимаете эту строку:
while(choice == 0) ?А, там у вас на external interrupt подвешено зануление choice... Стабильно ли вызывается ли обработчик данного прерывания?
Еще раз допишу... https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/ ->
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);(recommended)пропробуй
volatile intchoice = 0;Всем большое спасибо!!!
про vоlatile в прерываниях не знал, спасибо за наводку)
спасибо за ссылку на официальный сайт. Как-то забыл там посмотреть. Проблему обнаружил. Дело в кнопках((
После нажатия на них остается положительный сигнал. Типа они выключатели...
Всем СПАСИБО !!!