Arduino+LCD+тензодатчик+клава

pdmitrya
Offline
Зарегистрирован: 28.02.2017

Здравствуйте. Подскажите, если не трудно. У меня lcd1602+тензодатчик+клавиатура. На первую строку экрана выводится вес, на вторую значение с клавиатуры. С весом проблем нет, а с клавиатуры считываются не все нажатия, примерно 1 из 10. Если поменять scale.get_units() на 1, то считывается лучше, но все равно не все нажатия. В чем дело?

void loop() {
  scale.power_up();                                 // Отключаем энергосберегающий режим hx711
  if (round(scale.get_units(10)) != myScale) {      // Условие выполняется, если округленный до граммов вес отличается от последнего
    myScale = scale.get_units(10);                  // Запоминаем текущий вес   
    if (myScale > 0.5)                              // Если вес не ничтожно мал
     {
      lcd.setCursor(0,0);                      // то выводим его
      lcd.print(myScale/1000);
     }
    else                                          
    {
      lcd.setCursor(0,0);
      lcd.print("0.00    ");                        
    }   
    myScale = round(myScale);                       // Запоминаем округленный текущий вес (для сравнения)
    scale.power_down();                               // Включаем энергосберегающий режим hx711
    delay(500);  
  }
                              

  char key = keypad.getKey();  
   if (key=='A') // Если пользователь хочет сбросить набор первого числа
    {
      num1=0; 
      lcd.createChar(0,cl);
    for (int i=0; i<8; i++)  
     {lcd.setCursor(i,1);
      lcd.print(' ');            
      }
     lcd.setCursor(0,1);
      lcd.print('0');  
    }
    if (key >='0' && key <='9') 
    { num1 = num1*10 + (key -'0');  
      lcd.setCursor(0,1); 
      lcd.print(num1);    
      }    
}

т.е. я объединил два скетча. по отдельности работают. вместе - только вес корректно работает

 

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

Я клавиатуру подключаю так . Здесь полный скетч https://yadi.sk/d/qeTjJlF83Em8U4

Головной выкладываю 

/* class_module_keys_4_4.ino
  #1 клавиатура 4x4
          строки->2,3,4,5 выхода
          колонки->6,7,8,9 входа
           {'1','2','3','A'},
           {'4','5','6','B'},
           {'7','8','9','C'},
           {'*','0','#','D'}
  Принцип кода:При нажатии на соответствующую кнопку выполняется соответсвующее действие
*/
//#1 клавиатура 4x4
#include "Cl_module_keys_4x4.h"
void func_1(void) {
  Serial.println("do Func 1");
}
void func_2(void) {
  Serial.println("do Func 2");
}
void func_3(void) {
  Serial.println("do Func 3");
}
void func_4(void) {
  Serial.println("do Func A");
}
void func_5(void) {
  Serial.println("do Func 4");
}
void func_6(void) {
  Serial.println("do Func 5");
}
void func_7(void) {
  Serial.println("do Func 6");
}
void func_8(void) {
  Serial.println("do Func B");
}
void func_9(void) {
  Serial.println("do Func 7");
}
void func_10(void) {
  Serial.println("do Func 8");
}
void func_11(void) {
  Serial.println("do Func 9");
}
void func_12(void) {
  Serial.println("do Func C");
}
void func_13(void) {
  Serial.println("do Func *");
}
void func_14(void) {
  Serial.println("do Func 0");
}
void func_15(void) {
  Serial.println("do Func #");
}
void func_16(void) {
  Serial.println("do Func D");
}
void setup() {
  Serial.begin(9600);
  //#1 клавиатура 4x4
  Keys_4x4.setup();
}
void loop() {
  //#1 клавиатура 4x4
  Keys_4x4.loop(& func_1, & func_2, & func_3, & func_4,
                & func_5, & func_6, & func_7, & func_8,
                & func_9, & func_10, & func_11, & func_12,
                & func_13, & func_14, & func_15, & func_16);
}

 

Волшебник
Offline
Зарегистрирован: 22.12.2016

Похоже что измерения отнимают много времени. Чтобы это определеть надо нафаршировать скетч измерениями времени, или хотя бы определить как

часто программа пробегает опрос клавы. Для этого есть функции миллисек() и микросек() , ну и гугл естественно

Скорее всего придётся разводить на прерываниях, или искать неблокирующую библиотеку для весов, или искать библиотеку клавы использующую прерывания. Кто-то должен был их написать

pdmitrya
Offline
Зарегистрирован: 28.02.2017

Ну я так и понял, что придется использовать прерывания. Пока ждал ответов, погуглил. Нашел инфу про потоки (типа потоки). Попробовал. Результат конечно лучше чем был, но все равно не очень корректно работает. Так что прерывания последняя надежда))