Весы с звуковым сигналом на Ардуино

Всем доброго времени суток!
Проблема такая, нужно реализовать весы со звуковой сигнализацией на Ардуино. Должно все работать так, чтобы значение с датчика HX711 сравнивалось с введенным весом с клавиатуры и был звуковой сигнал, если этот вес меньше или больше введенного ± 1 грамм. Для эмуляции Ардуино использовал сайт “wokwi.com”.
Нерабочий код моего исполнения дальше: (просьба не бить, в первый раз имею дело с Ардуино и С++)

#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);                   //в противном случае нет никаких звуков с пищалки
  }
}


Схема составленная мной на сайте wokwi.com для эмуляции Ардуино:

Скрин схемы

Код этой схемы, если интересно
{
  "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": {}

Прошу помочь исправить код и указать на ошибки.

вы точно уверены в такой цифре?

1 лайк

Не верно описал, ± 1 - это погрешность. Если с датчика вес будет неточный, чтобы звуковая сигнализация не срабатывала сразу, если будет не ровно 0.

ладно, строка 56, переводишь, теперь покажи где ты вес получил

1 лайк

А вот это хороший вопрос, про это я забыл.

это тоже исправить, на них серийный порт висит

	_BV( 0 )	, // PE 0 ** 0 ** USART0_RX	
	_BV( 1 )	, // PE 1 ** 1 ** USART0_TX	
	_BV( 4 )	, // PE 4 ** 2 ** PWM2	
	_BV( 5 )	, // PE 5 ** 3 ** PWM3	
	_BV( 5 )	, // PG 5 ** 4 ** PWM4	
	_BV( 3 )	, // PE 3 ** 5 ** PWM5	
1 лайк

Ну по крайней мере пищалка заработала, сейчас посижу еще подумаю)

ссылкой на проект на wokwi поделись, провода от компорта поправил?

1 лайк

у тебя датчик весов на wokwi имеет минимальное разрешение 10 грамм, значит дельту надо ставить грамм 50 хотя бы и вес - килограмма 2 взвешиваем, для пробы…а вообще ты в самом начале пути, сначала надо определится с количеством значащих вводимых цифр

1 лайк

Прощу объяснить для особо одаренных, вроде меня. У меня “delta” - это значение с клавиатуры (эталонный вес на который ориентируюсь) минус граммы с датчика.

ищи пример кодового замка, там есть работа с клавиатурой

1 лайк

Спасибо! Сейчас почитаю про это