Как сократить этот код (потому что мой датчик читает медленно)?

Я делаю счетчик проезда для нашего школьного проекта. У меня слишком много ЖК-дисплея. Этот код еще не закончен. Моя единственная забота-как минимизировать использование lcd.print. Я думаю, что это тот, который делает мои показания датчиков медленными.

Я новичок в Arduino; извините, если у меня слишком много ошибок. Я ценю любой из ваших ответов. Спасибо!

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <virtuabotixRTC.h>

virtuabotixRTC myRTC(6, 7, 8);
float d[4] = {};
int x = 0;
int f = 0;
int dis = 0;
const uint8_t disBut = 13;
int input = A0;
int state = 0;
int disF = 0;
int buttonstate = 0;
LiquidCrystal_I2C lcd(0x27, 20, 4);
LiquidCrystal_I2C lcd1(0x26, 20, 4);

void setup() {
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  lcd1.init();
  lcd1.backlight();
  pinMode(disBut, INPUT);
  pinMode(buttonstate, OUTPUT);
}  

void loop() {  
  myRTC.setDS1302Time(18, 10, 10, 7, 18, 9, 2020);
  
  Serial.print("Current Date / Time: ");
  Serial.print(myRTC.dayofmonth);
  Serial.print("/");
  Serial.print(myRTC.month);
  Serial.print("/");
  Serial.print(myRTC.year);
  Serial.print("  ");
  Serial.print(myRTC.hours);
  Serial.print(":");
  Serial.print(myRTC.minutes);
  Serial.print(":");
  Serial.println(myRTC.seconds);
  delay(500);
  
  d[0] = (x * 1.73);
  d[1] = (x * 1.73);
  d[2] = (x * 1.73);
  d[3] = (x * 1.73);
  
  lcd.setCursor(8, 0);
  lcd.print(d[0]);
  lcd.setCursor(8, 1);
  lcd.print(d[1]);
  lcd.setCursor(8, 2);
  lcd.print(d[2]);
  lcd.setCursor(8, 3);
  lcd.print(d[3]);
  
  lcd.setCursor(0, 0);
  lcd.print(F("P1"));
  lcd.setCursor(0, 1);
  lcd.print(F("P1"));
  lcd.setCursor(0, 2);
  lcd.print(F("P1"));
  lcd.setCursor(0, 3);
  lcd.print(F("P1"));
  
  lcd.setCursor(6, 0);
  lcd.print(F("D="));
  lcd.setCursor(6, 1);
  lcd.print(F("D="));
  lcd.setCursor(6, 2);
  lcd.print(F("D="));
  lcd.setCursor(6, 3);
  lcd.print(F("D="));
  
  lcd1.setCursor(0, 0);
  lcd1.print(F("W="));
  lcd1.setCursor(0, 1);
  lcd1.print(F("W="));
  lcd1.setCursor(0, 2);
  lcd1.print(F("W="));
  lcd1.setCursor(0, 3);
  lcd1.print(F("W="));
  
  lcd1.setCursor(6, 0);
  lcd1.print(F("dscnt="));
  lcd1.setCursor(6, 1);
  lcd1.print(F("dscnt="));
  lcd1.setCursor(6, 2);
  lcd1.print(F("dscnt="));
  lcd1.setCursor(6, 3);
  lcd1.print(F("dscnt="));
  
  lcd1.setCursor(15, 0);
  lcd1.print(F("F="));
  lcd1.setCursor(15, 1);
  lcd1.print(F("F="));
  lcd1.setCursor(15, 2);
  lcd1.print(F("F="));
  lcd1.setCursor(15, 3);
  lcd1.print(F("F="));
  
  int counter=digitalRead(A0);
  if (state == 0) {
    switch (counter) {
      case 1:
        state = 1;
        lcd.setCursor(11, 0);
        x = x + 1; lcd.print(x);
        break;
      case 0:
        state = 0;
        break;
    }
  }

  if (counter == LOW)
    state = 0;
  if (state == 0) {
    switch (counter) {
      case 1:
        state = 1;
        x = x + 1;
        break;
      case 0:
        state = 0;
        break;
    }
  }
  
 if (counter == LOW)
   state = 0;
}

, 👍0

Обсуждение

удалите серийные отпечатки или, по крайней мере, используйте более высокую скорость передачи данных, @Juraj

Как вы думаете, почему показания датчика медленные? Медленно ли обновляются значения измерений? Как быстро вам это нужно? Обратите внимание, что если дисплей обновляется слишком быстро, вы не сможете его прочитать., @PMF

Выводите на дисплей только то, что меняется. Поместите статический текст один раз и только один раз в setup и отображайте изменяющиеся значения только тогда, когда они действительно изменяются, а не каждую отдельную итерацию цикла., @Majenko


1 ответ


2

Ваша медлительность заключается в том, что на каждой итерации loop() вы обновляете весь дисплей. Это плохо и расточительно.

Вам нужно сделать две вещи:

  1. Статическая информация (метки) отображается только один раз. Сделайте это в setup().
  2. Выводите переменные данные только в том случае, если они действительно изменились.

Первый прост: переместите любой статический текст в setup(). Это означает такие вещи, как lcd1.print(F("dscnt="));. Он никогда не меняется, и дисплей не "забывает" его, поэтому не нуждается в постоянном напоминании.

Второй немного сложнее. Вам нужно сохранить две копии данных. Тот, который является данными в данный момент, и тот, который является данными, которые отображаются. Затем вы сравниваете один с другим и для любых элементов, где они отличаются, отображаете их и обновляете сохраненную копию.

Итак, что-то вроде:

if (d[0] != d_saved[0]) {
    d_saved[0] = d[0];  
    lcd.setCursor(8, 0);
    lcd.print(d[0]);
}

Конечно, вы можете упростить программирование с помощью цикла:

for (uint8_t i = 0; i < 4; i++) {
    if (d[i] != d_saved[i]) {
        d_saved[i] = d[i];  
        lcd.setCursor(8, i);
        lcd.print(d[i]);
    }
}

Конечно, d_saved[4] необходимо создать либо в глобальной области видимости, либо в качестве локальной статической переменной и инициализировать некоторыми подходящими значениями "никогда не может быть" (например, -1 или что-то в этом роде), чтобы в первый раз он всегда отличался от реальных значений и отображал все правильно.

,