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

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

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

Внешний вид электронных весов на Arduino с опцией предварительной установки веса

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

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

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

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

Внешний вид датчика веса

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

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

Схема моста Уитстона применительно к датчику веса

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

Внешний вид модуля усиления HX711

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

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

  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 и датчике веса представлена на следующем рисунке.

Схема электронных весов на основе платы 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

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

(Проголосуй первым!)
Загрузка...
914 просмотров

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

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