Рубрики
Схемы на Arduino

Электронные весы на Arduino с опцией предварительной установки веса и учетом веса упаковки

Электронные весы стали привычным предметом в современном мире, постепенно все больше вытесняя привычные старшему поколению механические весы. Мы практически каждый день видим электронные весы в различных магазинах и супермаркетах, но задумывались вы когда-нибудь о том, как они работают? Чтобы ответить на данный вопрос в этой статье мы рассмотрим создание электронных весов на основе платы Arduino, и датчике веса, который может взвешивать предметы массой до 10 кг.

Данные весы отлично подойдут для магазинов, в которых осуществляется упаковка каких-нибудь сыпучих материалов в пакеты для их последующей продажи. Наши весы будут иметь кнопку сброса, которая будет обнулять их показания. Также в них будет опция установки заранее определенного веса – как только вес измеряемой субстанции достигнет этой величины будет раздаваться сигнал зуммера. Таким образом, можно будет быстро упаковывать различные сыпучие материалы в пакеты одинакового веса даже не глядя на показания на ЖК дисплее, просто по звуку зуммера.

Ранее на нашем сайте мы уже рассматривали подключение датчика веса с модулем усиления HX711 к плате Arduino, но рассматриваемый в данной статье проект весов является более функциональным и пригодным для коммерческого использования.

Принцип работы электронных весов на основе Arduino

Основным компонентом нашего проекта является датчик веса и модуль усиления HX711 для него. Внешний вид датчика веса показан на рисунке ниже. Как вы можете видеть, на его торце стоит отметка 10 кг. Также вы можете заметить слой защитного клея сверху датчика и 4 выходящих из датчика провода различного цвета. Более подробно назначение этих компонентов датчика будет рассмотрено далее в статье.

Датчик веса представляет собой устройство, которое преобразует приложенные к нему силу или давление в электрический сигнал. Он состоит условно из двух сторон, назовем их правой и левой стороной. Они сделаны из алюминиевых блоков. Как вы видите из представленной картинки, в центре датчика просверлено достаточно большое отверстие. Это и есть та часть датчика, которая испытывает деформацию при приложении к датчику усилия (груза). Теперь представьте, что правая сторона датчика закреплена на основании, а к левой стороне приложено усилие (груз) – эта ситуация приводит к деформации датчика нагрузки вследствие наличия огромного отверстия в его центре.

Когда груз помещается на левую сторону датчика, то на верхнюю сторону датчика действует сила растяжения, а на его нижнюю сторону – сила сжатия. Поэтому брусок алюминия, из которого сделан датчик, начинает сгибаться вниз на левой стороне. Если мы измерим эту деформацию, мы сможем определить силу, приложенную к алюминиевому блоку и, следовательно, исходя из ее значения, и вес груза, находящегося на датчике.

Мы можем сделать это с помощью так называемого моста Уитстона (Wheatstone bridge). Мы соединяем измерители деформации (strain gauge) в моста Уитстона, если мост сбалансирован, то напряжение в его средней точке будет равно нулю. Когда сопротивление одного из измерителей деформации изменяется, это приводит к дисбалансу моста, и напряжение в нем также изменяется. Таким образом, мост Уитстона позволяет преобразовывать изменения сопротивления в значения напряжения.

Но эти изменения напряжения слишком малы чтобы непосредственно подавать их на плату Arduino, поэтому мы сначала подаем их на модуль усиления HX711. Модуль HX711 содержит в своем составе 24-битный дифференциальный АЦП (аналого-цифровой преобразователь), что позволяет ему измерять очень малые изменения напряжения. Диапазон значений на выходе подобного АЦП составляет от 0 до 224.

Необходимые компоненты

Для данного проекта мы подобрали по возможности простые и недорогие компоненты, которые можно приобрести в любом магазине электронных компонентов.

  1. Плата Arduino Nano (купить на AliExpress).
  2. Датчик веса/нагрузки (Load cell) с допустимой нагрузкой до 10 кг (купить на AliExpress).
  3. Модуль усиления HX711 (купить на AliExpress).
  4. ЖК дисплей 16х2 с модулем интерфейса I2C (купить на AliExpress).
  5. Резистор 1 кОм – 2 шт. (купить на AliExpress).
  6. Светодиод – 2 шт. (купить на AliExpress).
  7. Зуммер (Buzzer) (купить на AliExpress).
  8. Батарея на 7.4V (если вы хотите сделать весы портативными/переносными) (купить на AliExpress).
  9. Регулятор напряжения LM7805 (купить на AliExpress).

Внешний вид используемых в проекте компонентов показан на следующем рисунке.

Схема проекта

Схема электронных весов на основе платы Arduino и датчике веса представлена на следующем рисунке.

Датчик веса (load cell) имеет 4 провода: красный, черный, зеленый и белый. Цвета этих проводов могут изменяться в зависимости от производителя датчика, поэтому не стоит всецело доверять цвету проводов – лучше доверяйте даташиту на купленный вами датчик. Подключите красный провод датчика веса к контакту E+ модуля HX711, черный провод – к E-, белый – к A+, а зеленый – к A-. Выходной контакт модуля (Dout) HX711 и его контакт синхронизации подключите к контактам D4 и D5 платы Arduino. Одни концы кнопок подключите к контактам D3, D8, D9 платы Arduino, а другие их концы – к общему проводу схемы (ground). Мы используем ЖК дисплей 16х2 с модулем интерфейса I2C, поэтому подключите его контакты SDA и SCL к контактам A4 и A5 платы Arduino соответственно. Подключите общий провод (ground) ЖК дисплея и модуля HX711 к «земле» платы Arduino, а их контакты питания подключите к контакту 5V платы Arduino. Все компоненты нашей схемы работают от напряжения 5V, поэтому в схему мы добавили регулятор напряжения LM7805. Но если вы не хотите делать весы портативными, то вы можете просто запитать плату Arduino от компьютера с помощью USB кабеля.

Изготовление конструкции проекта

Мы спаяли все компоненты проекта с помощью перфорированной платы. Для подключения платы Arduino и модуля HX711 мы использовали соединители типа «мама» (female headers). Для подключения кнопок и светодиодов мы использовали соединительные провода. После того, как процесс пайки был закончен, мы убедились, что на выходе регулятора LM7805 напряжение равно 5V. И, наконец, мы добавили в схему выключатель питания. Когда все было закончено, электронная часть конструкции нашего проекта выглядела следующим образом:

Изготовление корпуса для весов

Корпус весов мы решили сделать из ПВХ, для этого мы нарезали из ПВХ четыре прямоугольника размером 20х5 см (боковые стенки), и основание весов размером 20х20 см. Эти части мы скрепили между собой с помощью клея.

Но не спешите фиксировать (закреплять) одну из боковых сторон поскольку на ней вам необходимо еще разместить кнопки, светодиоды и ЖК дисплей. Сверху корпуса весов мы использовали пластмассовую чашу – в нее мы будем класть взвешиваемые предметы. Также необходимо убедиться в том, что между датчиком веса и верхней частью корпуса весов есть достаточное пространство поскольку датчик веса будет изгибаться в процессе взвешивания грузов – для этого мы использовали болты с гайками как показано на следующем рисунке.

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

Разумеется, вы можете изготовить корпус весов по своему желанию, исходя из доступных вам материалов.

Объяснение программы Arduino для создания электронных весов

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Для упрощения программы мы будем использовать в ней библиотеки для работы с модулем HX711, с EEPROM (энергонезависимой памяти) и ЖК дисплеем. Библиотеку для ЖК дисплеем вы можете скачать по следующей ссылке. Библиотеку для работы с модулем HX711 вы можете скачать с GitHub, или вы можете сделать это в Arduino IDE, открыв там пункт меню include library > manage library, и запустив в нем поиск HX711, после ее нахождения запускаете процесс ее установки.

Первым делом нам необходимо откалибровать датчик веса и сохранить полученное калибровочное значение в EEPROM, для этого откройте пример в Arduino IDE по адресу file > examples > HX 711_ADC, затем выберите calibration code. Перед загрузкой кода программы в плату поместите весы на ровную устойчивую поверхность. После этого загрузите код программы в плату Arduino и откройте окно монитора последовательной связи (serial monitor). Затем измените бодовую скорость на 572600. После этого в окне монитора последовательной связи программа попросит вас нажать букву «t» и затем enter.

Затем необходимо поместить на весы груз с известным весом, в нашем случае мы поместили груз массой 194 грамма. После помещения этого груза на весы напечатайте значение веса этого груза в окне монитора последовательной связи и нажмите enter.

После этого окно монитора последовательной связи спросит вас хотите ли вы сохранить это значение в EEPROM или нет, нажмите Y чтобы выбрать вариант сохранить. После этого вы увидите значение веса в окне монитора последовательной связи.

Код программы для этого проекта (он приведен в конце данной статьи) мы написали на основе примера скетча из библиотеки для работы с модулем HX711.

Далее в коде программы мы подключили заголовочные файлы всех используемых нами библиотек. Библиотека HX711 будет использоваться для считывания значений с датчика нагрузки. EEPROM является встроенной в Arduino IDE библиотекой, которая будет использоваться нами для работы с памятью EEPROM, библиотека LiquidCrystal_I2C будет использоваться для работы с ЖК дисплеем по интерфейсу l2C.

После этого объявим в программе необходимые переменные и контакты. Функция HX711_ADC LoadCell будет использоваться для установки значений на контакте Dout и контакте синхронизации модуля HX711.

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

Далее мы инициализируем ЖК дисплей и покажем на нем приветственное сообщение с помощью функции LCD.print(). Через 2 секунды после этого мы очистим экран дисплея с помощью функции lcd.clear().

Затем мы начнем процесс считывания данных с датчика нагрузки (loadcell) с помощью функции loadCell.begin(). После этого мы считаем из EEPROM калибровочные значения с помощью функции EEPROM.get(). Ранее мы сохранили эти значения в EEPROM с помощью калибровочного скетча, теперь же нам необходимо просто их считать.

В функции loop мы первым делом будем проверять поступают ли какие либо данные от датчика веса с помощью функции LoadCell.update(), если поступают, то мы считываем их с помощью функции LoadCell.getData() и сохраняем их в переменной. Далее мы отображаем эти данные на экране ЖК дисплея с помощью функции LCD.print(), также на экране ЖК дисплея мы отображаем установленное значение веса, которое устанавливается далее в программе.

Далее мы устанавливаем вес тары (упаковки) измеряемого груза, для этого мы считываем состояние кнопки tare pushbutton с помощью функции digitalRead(). Если ее состояние low, то вес тары (упаковки) мы устанавливаем равным нулю. Функция установки веса тары необходима для приведения шкалы отсчета измерения веса к нулю. К примеру, если мы измеряем вес каких либо сыпучих веществ в какой-нибудь чашке, то измеряемый вес будет суммой веса чашки и сыпучего вещества. Если же мы перед взвешиванием нажмем tare button и поставим пустую чашку на весы, то потом вес этой чашки будет отниматься от общего измеренного веса и, таким образом, мы получим возможность измерения веса только сыпучего вещества.

Теперь нам необходимо запрограммировать условия для различных индикаций – зуммера и светодиодов. Всего мы запрограммируем 3 таких условия. Первым делом мы будем измерять разницу между установленным и измеренными значениями веса, мы будем сохранять эту разницу в переменной k.

1. Если разница между установленным и измеренными значениями веса больше или равна 50 грамм, то зуммер будет издавать звуковой сигнал с задержкой 200 мс (то есть звучать медленно).

2. Если разница между установленным и измеренными значениями веса меньше 50 и больше 1 грамма, то зуммер будет издавать звуковой сигнал с задержкой 50 мс (звучать более быстро).

3. Если измеренное значение веса больше или равно установленного значения веса, то мы будем включать светодиод зеленого цвета и выключать зуммер и светодиод красного цвета.

Для установки установленного значения веса мы будем использовать две функции. В первой из них мы будем увеличивать значение установленного значения веса на 10 грамм при каждом нажатии кнопки. Состояние кнопки мы будем считывать при помощи функции digitalRead, если оно low, это значит что кнопка нажата и мы будем увеличивать значение на 10 грамм.

Аналогичным образом мы будем поступать и для уменьшения установленного значения веса на 10 грамм.

Спроектированные нами электронные весы способны измерять вес до 10 кг (это значение можно увеличить при помощи использования другого датчика веса) и обеспечивают точность измерений 99%.

Исходный код программы (скетча)

Видео, демонстрирующее работу электронных весов на основе Arduino

Источник статьи

20 ответов к “Электронные весы на Arduino с опцией предварительной установки веса и учетом веса упаковки”

Загружаю скетч для калибровки.Включаю монитор. Появляется надпись
Starting…
Timeout,chek MCU>HX711 wiring and pin designations
Заменил плату HX711.Но ничего не изменилось.4 провода невозможно перепутать.

А в скетче для калибровки какие контакты платы используются для работы с модулем HX711? Проверьте плз, они могут не совпадать с теми контактами, которые используются в основной программе.

Контакты на обоих скетчах совпадают: dout=4 , sck=5.И еще,в скетче указано 56200, а в мониторе надо указывать 115200.

У меня возникла проблема при подключения 16х2 LCD (с I2C модулем) и подаче питания светодиод на модуле горит а сам дисплей нет

Просто вставьте строку:
HX711_ADC LoadCell (HX711_dout, HX711_sck);
ниже (а не раньше)
линии:
const int HX711_dout = 4; //mcu > HX711 doout pin
const int HX711_sck = 5; //mcu > контакт HX711 sck
Итак, это должен быть правильный порядок:

const int HX711_dout = 4; //mcu > выходной контакт HX711
const int HX711_sck = 5; //mcu > контакт HX711 sck
HX711_ADC LoadCell (HX711_dout, HX711_sck);

Спасибо вам за конструктивный комментарий для нашего проекта

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

Добрый день. Напишите через 2-3 дня, постараюсь подсказать

добрый день. пишу через 2дня. мне нужно добавить в схему модуль реле и в скетч включение реле при появлении груза на весах и отключение когда груз убрали с весов.

Добрый вечер. Подключите модуль реле к одному из свободных цифровых контактов. В коде программы задайте константу MIN — присвойте ей значение минимального веса, при превышении которого должно срабатывать реле. В программе добавьте условие что если считанное значение веса больше MIN, то подаем высокий уровень на контакт, к которому подключено реле, иначе на этот контакт подаем низкий уровень.

почему не получается загрузить скетч, выдает ошибку по библиотеке HX711. скачивал по ссылке и другие пробовал, все равно ошибку выдает

А какой текст ошибки? А другие скетчи нормально загружает?

diyengineers.com/2022/05/19/load-cell-with-hx711-how-to-use-with-examples/
вот ссылка на рабочий скетч!

А почему вы считаете что приведенный в статье скетч нерабочий

Не обратил внимание при переводе. Скорее всего его нужно подключить к контакту 5 В Ардуино

Здравствуйте не могу понять как вы подвязали вывод информации на дисплей

Добрый вечер. ЖК дисплей здесь подключен с помощью модуля I2C

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *