Реализация весов на Arduino с сигналом при перевесе/недовесе

max1m

✩✩✩✩✩✩✩
4 Апр 2024
2
0
Здравствуйте!
Требуется помощь по лабораторной работе.
Проблема с реализацией весов на Ардуино. Задача устройства таже, что и в заголовке. То есть надо задать начальный вес и сравнивать его со взвешиваемым, выводя значения на дисплей и производя сигнал при отклонении от заданного веса. В качестве эмулятора использовал сайт wokwi.com. Прошу помочь поправить код и указать на ошибки.
Срок до сдачи отчета: две недели.

Основной код выглядит так: (прошу не закидывать гнилыми помидорами, так как опыта в С++ и с Ардуино вообще нет)
C++:
#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <HX711.h>

#define buzzer 2  //пин пищалки

#define DT 0      //пин датчика веса
#define SCK 1     //пин датчика веса
HX711 scale;
float calibration_factor = -0.15;
float gramm;      //переменная для граммов
float delta;      //переменная для погрешности измерения веса, относительно введенных данных и фактических

LiquidCrystal_I2C lcd(0x27, 20, 4);  //адрес с пинами жкд

const byte ROWS = 4;      //ряды клавиатуры
const byte COLS = 4;     //колонки клавиатуры
char keys[ROWS][COLS] =  //массивы кнопок
{
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {14, 15, 16, 17};  //пины кнопок по рядам
byte colPins[COLS] = {18, 19, 20, 21};  //пины кнопок по колонкам
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

void setup()
{
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Enter weight:");  //с помощью курсора на первой строке задается фраза "ввести вес"
  lcd.setCursor(0, 2);
  lcd.print("Weight:");        //с помощью курсора на третьей строке задается фраза "вес"

  scale.begin(DT, SCK);        //пины датчика веса
  scale.set_scale();
  scale.tare();
  scale.set_scale(calibration_factor);   //для калибровочного значения
}

void loop()
{
  char key = keypad.getKey();    //получение значения нажатой кнопки
  if (key){
    lcd.setCursor(0, 1);
    lcd.print(key);              //вывод нажатых кнопок на второй строке дисплея
  }

  Serial.print("Reading: ");
  gramm *= 0.035274;             //перевод полученного значения с датчика HX711 в граммы
  Serial.print(gramm);            //вывод граммов в порт
  Serial.println(" grams");
  lcd.setCursor(0, 3);
  lcd.print(gramm);              //вывод граммов на дисплей 4 строкой

  delta = key - gramm;          //отклонение веса
    if(delta + 1 > 0)
  {
    tone(2, 1000, 3000);         //если вес больше заданного, то такая частота выводимого звука с длительностью
  }
  else if(delta - 1 < 0)
  {
    tone(2, 500, 3000);           //если вес меньше заданного, то такая частота
  }
  else
  {
    noTone(2);                          //в противном случае нет никаких звуков с пищалки
  }
}
Схема, которую я сделал на том сайте:
Screenshot 2024-04-04 124715.png

Также, если интересно, код этой схемы для того же wokwi.com:
C++:
{
  "version": 1,
  "author": "Anonymous maker",
  "editor": "wokwi",
  "parts": [
    { "type": "wokwi-arduino-mega", "id": "mega", "top": 154.2, "left": -70.8, "attrs": {} },
    {
      "type": "wokwi-membrane-keypad",
      "id": "keypad1",
      "top": -126.8,
      "left": 418.4,
      "attrs": {}
    },
    { "type": "wokwi-hx711", "id": "cell1", "top": 329, "left": 377, "attrs": { "type": "5kg" } },
    {
      "type": "wokwi-buzzer",
      "id": "bz1",
      "top": -84,
      "left": 299.4,
      "attrs": { "volume": "0.1" }
    },
    {
      "type": "wokwi-lcd2004",
      "id": "lcd1",
      "top": -137.6,
      "left": -109.6,
      "attrs": { "pins": "i2c" }
    }
  ],
  "connections": [
    [ "cell1:VCC", "mega:5V", "red", [ "h-288", "v0", "h-2.3" ] ],
    [ "keypad1:R1", "mega:14", "green", [ "v9.6", "h-105.6", "v-153.6", "h-213.1" ] ],
    [ "keypad1:R2", "mega:15", "green", [ "v19.2", "h-125.2", "v-153.6", "h-194" ] ],
    [ "keypad1:R3", "mega:16", "green", [ "v28.8", "h-144.3", "v-153.6", "h-174.9" ] ],
    [ "keypad1:R4", "mega:17", "green", [ "v38.4", "h-163.4", "v-153.6", "h-155.8" ] ],
    [ "keypad1:C1", "mega:18", "green", [ "v48", "h-182.5", "v-153.6", "h-136.7" ] ],
    [ "keypad1:C2", "mega:19", "green", [ "v57.6", "h-201.6", "v-153.6", "h-117.1" ] ],
    [ "keypad1:C4", "mega:21", "green", [ "v76.8", "h-240.3", "v-153.6", "h-78.9" ] ],
    [ "mega:20", "keypad1:C3", "green", [ "v-38.4", "h98", "v153.6", "h220.95" ] ],
    [ "cell1:DT", "mega:0", "green", [ "h-19.2", "v-0.5", "h-182.4", "v-201.6" ] ],
    [ "cell1:SCK", "mega:1", "gold", [ "h0" ] ],
    [ "cell1:GND", "mega:GND.3", "black", [ "v-0.3", "h-268.8", "v-16.5" ] ],
    [ "lcd1:VCC", "mega:5V", "red", [ "h-19.2", "v451.3", "h218.5" ] ],
    [ "lcd1:SDA", "mega:SDA", "#8f4814", [ "h-28.8", "v221", "h163.6" ] ],
    [ "lcd1:SCL", "mega:SCL", "gold", [ "h-38.4", "v221.1", "h163.2" ] ],
    [ "lcd1:GND", "mega:GND.1", "black", [ "h-9.6", "v230.4", "h163.4" ] ],
    [ "bz1:1", "mega:GND.1", "black", [ "v48", "h-172.8" ] ],
    [ "bz1:2", "mega:2", "red", [ "v57.6", "h-173.2" ] ]
  ],
  "dependencies": {}
}

В общем подсказали тут, что HX711 не к тем пинам подключил. Вроде заработал, но все равно заместо веса нули выдает и пищалка бесконечно пищит. Еще нажатые кнопки с клавиатуры только по одной на дисплей печатает.
 
Изменено:

Геннадий П

★★★★★★✩
14 Апр 2021
1,845
593
44
но все равно заместо веса нули выдает
Покажите строчку, где к gramm присваиваются данные из HX711, ну или хотя бы хоть что то из HX711 считывается... Уупс, этого ничего нет.

Вы сначала сделайте простенькую программу которая только считывает данные с весов и отправляет их в порт, чтобы убедиться что по аппаратной части все работает..
 
  • Лойс +1
Реакции: max1m

max1m

✩✩✩✩✩✩✩
4 Апр 2024
2
0
@Геннадий П, Да, мне про это уже сказали на другом форуме. Я это уже поправил,
похоже нужно с калибровкой разобраться, потому что на максимальном весе все же выдает какие-то малые значения на дисплей. Например на 5 кг выдает 14.82 грамма.