В этом проекте мы рассмотрим создание электронных весов на основе технологии Интернета вещей с датчиком веса (тензодатчиком), модулем HX711 и платой NodeMCU ESP8266. Тензодатчик будет способен измерять любой вес до 40 кг. Мы будем отображать измеренный вес в приложении Blynk, а также удаленно отслеживать данные о весе на сервере Thingspeak.
Примечание: приложение Blynk раньше можно было использовать бесплатно, но сейчас, насколько я знаю, такой возможности нет. Но зато Thingspeak до сих пор бесплатный и при этом весьма удобный сервис.
В этом проекте IoT мы подключим датчик нагрузки 40 кг к NodeMCU ESP8266 с помощью модуля усилителя датчика нагрузки HX711. HX711 — это прецизионный 24-битный аналого-цифровой преобразователь (АЦП), разработанный для весов и промышленных приложений управления для прямого взаимодействия с мостовым датчиком. Усилитель датчика нагрузки HX711 используется для получения измеряемых данных с датчика веса/нагрузки (тензодатчика).
Электронные весы используют тензодатчик для измерения веса, создаваемого грузом. Большинство тензодатчиков работают по принципу преобразования давления (силы) в электрический сигнал. Эти тензодатчики имеют четыре датчика, которые соединены в мост Уитстона.
Мы сделаем весы, которые смогут измерять вес до достаточно высоких значений, например, 40 кг. Нам нужно откалибровать тензодатчик и найти коэффициент калибровки. После завершения калибровки мы можем включить этот коэффициент в наш код. Таким образом, это сделает наши весы точными и аккуратными. Чем больше масса, тем больше погрешность. Поэтому мы попытаемся устранить погрешность весов. Наконец, мы отобразим измеренный вес на ЖК -дисплее I2C 16×2. Мы отправим полученное таким образом значение веса на платформу IoT Cloud под названием Blynk Application. Таким образом, вес можно будет контролировать из любой точки мира, просто наблюдая на панели инструментов приложения Blynk. Мы также отправим данные на другую платформу IoT под названием Thingspeak. Графический и числовой анализ веса будет выполняться в Thingspeak. На нашем сайте мы рассматривали уже достаточно много проектов с использованием сервиса ThingSpeak - посмотрите их если хотите более подробно изучить работу с данным сервисом.
Также мы рассматривали проекты по измерению веса на основе других микроконтроллеров/плат:
- измерение веса с помощью Arduino и модуля HX711;
- электронные весы на Arduino с опцией предварительной установки веса и учетом веса упаковки;
- автоматические ворота на Raspberry Pi, датчике веса и модуле усиления HX711.
Необходимые компоненты
- NodeMCU ESP8266 (купить на AliExpress).
- Датчик веса + модуль HX711 (купить на AliExpress).
- ЖК дисплей 16x2 с интерфейсом I2C (купить на AliExpress).
- Кнопка (купить на AliExpress).
- Макетная плата
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Датчик веса (нагрузки)
Датчик веса/нагрузки (тензодатчик) — это тип преобразователя, который еще называют датчиком силы. Он преобразует силу, такую как растяжение, сжатие, давление или крутящий момент, в электрический сигнал, который можно измерить и стандартизировать. По мере увеличения силы, приложенной к датчику, электрический сигнал пропорционально изменяется. Датчики нагрузки используются для измерения веса.
Тензодатчики обычно состоят из пружинного элемента, на котором размещены датчики. Пружинный элемент обычно изготавливается из стали или алюминия. Это означает, что он очень прочный, но также минимально эластичный. Как следует из названия «пружинный элемент», сталь слегка деформируется под нагрузкой, но затем возвращается в исходное положение, упруго реагируя на каждую нагрузку. Эти чрезвычайно малые изменения можно уловить с помощью тензодатчиков. Затем, наконец, деформация тензодатчика интерпретируется аналитической электроникой для определения веса.
Модуль HX711
Модуль усилителя и АЦП (аналого-цифрового преобразователя) датчика веса HX711 (Dual-Channel 24 Bit Precision A/D Weight Pressure Tension Cell Amplifier and ADC) представляет собой небольшую плату для микросхемы HX711, которая позволяет вам легко считывать показания тензодатчиков для измерения веса. Подключив модуль к микроконтроллеру вы сможете считывать изменения сопротивления тензодатчика и с некоторой калибровкой сможете получать очень точные измерения веса.
Это может быть удобно для создания собственных промышленных весов, управления процессами или простого обнаружения присутствия. Датчик взвешивания HX711 использует двухпроводной интерфейс (Clock и Data) для связи с другими устройствами. Его можно подключить к любым выводам GPIO микроконтроллера, что упрощает считывание данных с HX711.
Каждый цвет соответствует общепринятой цветовой кодировке тензодатчиков:
1. Красный (возбуждение+ или VCC).
2. Черный (возбуждение- или GND).
3. Белый (усилитель+, сигнал+ или выход+).
4. Зеленый (A-, S- или O-).
5. Желтый (экран).
Контакт YLW действует как дополнительный вход, который не подключается к тензодатчику, а используется для заземления и экранирования от внешних ЭМИ (электромагнитных помех).
Соединения тензодатчика и HX711
Представлены на следующем рисунке.
1 2 3 4 |
- RED Wire is connected to E+ - BLACK Wire is connected to E- - WHITE Wire is connected to A- - GREEN Wire is connected to A+ |
Сборка основания весов
Также нам потребуется основание для фиксации тензодатчика с помощью гаек и болтов. Здесь мы использовали жесткую фанеру для каркаса, чтобы размещать на нем вещи, и легкую деревянную доску в качестве основания. Это необходимо, поскольку тензодатчик слегка прогибается, когда на него помещается какой-либо вес.
Схема проекта
Схема подключения датчика веса и модуля HX711 к плате NodeMCU ESP8266 представлена на следующем рисунке.
Соединение между тензодатчиком и HX711 было объяснено выше. Подключите выводы DT и SCK тензодатчика к выводам D5 и D6 платы ESP8266 соответственно. Я использовал кнопочный тактовый переключатель для сброса веса на ноль. Кнопочный переключатель — это подключенный цифровой вывод D4 ESP8266. Я использовал ЖК-дисплей 16X2 I2C чтобы минимизировать соединения. Поэтому подключите выводы SDA и SCL ЖК-дисплея с интерфейсом I2C к выводам D2 и D1 Nodemcu соответственно.
Печатная плата для проекта
Печатная плата для наших весов на основе IoT разработана с использованием онлайн-инструмента EasyEDA Circuit Schematics & PCB designing. Передняя и задняя стороны печатной платы показаны ниже.
Скачать файл Gerber для изготовления данной печатной платы вы можете по следующей ссылке.
Настройка приложения Blynk IoT для удаленного мониторинга веса
Blynk — это приложение, работающее на устройствах Android и IOS для управления любым приложением на базе IoT с помощью смартфонов. Оно позволяет вам создать графический пользовательский интерфейс для приложения IoT. Здесь мы настроим приложение Blynk для мониторинга измеренного веса по Wi-Fi с помощью NodeMCU ESP8266.
Итак, загрузите и установите приложение Blynk из магазина Google Play. Пользователи iOS могут загрузить его из App Store. После завершения установки откройте приложение и зарегистрируйтесь, используя свой идентификатор электронной почты и пароль.
Теперь следуйте фотографиям ниже, чтобы настроить приложение Blynk.
Итак, создайте калибровку и отображение значений. После успешного создания проекта вернитесь к настройкам и нажмите Send Email («Отправить письмо»). Вы получите идентификатор аутентификации в этом письме. Сохраните идентификатор аутентификации. Вам нужно будет ввести этот код.
Исходный код программы для калибровки тензодатчика
После подключения тензодатчика, как указано выше, вам необходимо сначала откалибровать его, прежде чем переходить к окончательному проектированию. Поэтому сначала откалибруйте весь собранный узел. Вам нужно будет добавить библиотеку HX711, чтобы скомпилировать код. Загрузите библиотеку HX711 по следующей ссылке.
1. Библиотека Blynk ESP8266
2. Библиотека Liquid Crystal I2C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
#include "HX711.h" //You must have this library in your arduino library folder #define DOUT D5 #define CLK D6 HX711 scale(DOUT, CLK); //Change this calibration factor as per your load cell once it is found you many need to vary it in thousands float calibration_factor = -109525; //-106600 worked for my 40Kg max scale setup //============================================================================================= // SETUP //============================================================================================= void setup() { Serial.begin(9600); Serial.println("HX711 Calibration"); Serial.println("Remove all weight from scale"); Serial.println("After readings begin, place known weight on scale"); Serial.println("Press a,s,d,f to increase calibration factor by 10,100,1000,10000 respectively"); Serial.println("Press z,x,c,v to decrease calibration factor by 10,100,1000,10000 respectively"); Serial.println("Press t for tare"); scale.set_scale(); scale.tare(); //Reset the scale to 0 long zero_factor = scale.read_average(); //Get a baseline reading Serial.print("Zero factor: "); //This can be used to remove the need to tare the scale. Useful in permanent scale projects. Serial.println(zero_factor); } //============================================================================================= // LOOP //============================================================================================= void loop() { scale.set_scale(calibration_factor); //Adjust to this calibration factor Serial.print("Reading: "); Serial.print(scale.get_units(), 3); Serial.print(" kg"); //Change this to kg and re-adjust the calibration factor if you follow SI units like a sane person Serial.print(" calibration_factor: "); Serial.print(calibration_factor); Serial.println(); if(Serial.available()) { char temp = Serial.read(); if(temp == '+' || temp == 'a') calibration_factor += 10; else if(temp == '-' || temp == 'z') calibration_factor -= 10; else if(temp == 's') calibration_factor += 100; else if(temp == 'x') calibration_factor -= 100; else if(temp == 'd') calibration_factor += 1000; else if(temp == 'c') calibration_factor -= 1000; else if(temp == 'f') calibration_factor += 10000; else if(temp == 'v') calibration_factor -= 10000; else if(temp == 't') scale.tare(); //Reset the scale to zero } } |
После загрузки кода калибровки откройте последовательный монитор и настройте коэффициент масштабирования с известным весом, пока не увидите правильные показания. Нажмите a,s,d,f, чтобы увеличить коэффициент калибровки на 10,100,1000,10000 соответственно. Нажмите z,x,c,v, чтобы уменьшить коэффициент калибровки на 10,100,1000,10000 соответственно.
Как только вы увидите, что установленный вес совпадает с показанным весом, запишите коэффициент калибровки и используйте его в окончательном коде для весов.
Исходный код программы для весов с передачей данных в Blynk
Как только вы найдете коэффициент калибровки, обновите его в коде ниже. Затем вы можете просто загрузить код, и ваши весы IoT готовы. Не забудьте также изменить WiFi SSID, пароль и код аутентификации Blynk в коде.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
#include <ESP8266WiFi.h> #include "HX711.h" #define BLYNK_PRINT Serial #include <Blynk.h> #include <BlynkSimpleEsp8266.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); #define BLYNK_PRINT Serial const char *ssid = "Alexahome"; // replace with your wifi ssid and wpa2 key const char *pass = "12345678"; char auth[] = "hePTG-hzhuAzU2h59R90SjQUc98u2Kpb"; // You should get Auth Token in the Blynk App. WiFiClient client; HX711 scale(D5, D6); int rbutton = D4; // this button will be used to reset the scale to 0. float weight; float calibration_factor = -101525; // for me this vlaue works just perfect 419640 void setup() { Serial.begin(115200); pinMode(rbutton, INPUT_PULLUP); scale.set_scale(); scale.tare(); //Reset the scale to 0 long zero_factor = scale.read_average(); //Get a baseline reading Blynk.begin(auth, ssid, pass); Wire.begin(D2, D1); lcd.begin(); lcd.setCursor(6,0); lcd.print("IOT"); lcd.setCursor(1,1); lcd.print("Weighing Scale"); delay(3000); lcd.clear(); lcd.print("Connecting Wifi"); WiFi.begin(ssid, pass); { delay(1000); Serial.print("."); lcd.clear(); } Serial.println(""); Serial.println("WiFi connected"); lcd.clear(); lcd.print("WiFi connected"); delay(2000); } void loop() { Blynk.run(); scale.set_scale(calibration_factor); //Adjust to this calibration factor weight = scale.get_units(5); lcd.setCursor(0, 0); lcd.print("Measured Weight"); lcd.setCursor(0, 1); lcd.print(weight); lcd.print(" KG "); Blynk.virtualWrite(V3, weight); delay(2000); lcd.clear(); Serial.print("Weight: "); Serial.print(weight); Serial.println(" KG"); Serial.println(); if ( digitalRead(rbutton) == LOW) { scale.set_scale(); scale.tare(); //Reset the scale to 0 } } |
Тестирование работы кода (с отправкой данных в Blynk)
Если грузы не установлены, на дисплее будет отображаться вес, практически равный нулю.
При размещении грузов на дисплее будет отображаться вес, практически равный весу объекта.
Теперь вы можете запустить приложение Blynk и увидеть изменения параметров веса как на этикетке, так и на шкале.
Исходный код программы для весов с передачей данных на Thingspeak
Аналогично, если вы хотите отслеживать вес онлайн на платформе Thingspeak, вы можете использовать код ниже.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
#include "HX711.h" #include <ESP8266WiFi.h>; #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); String apiKey = "3DHYLTJBZOF4DFTO"; // Enter your Write API key from ThingSpeak const char *ssid = "BYNARK"; // replace with your wifi ssid and wpa2 key const char *pass = "bynark@123"; const char* server = "api.thingspeak.com"; WiFiClient client; HX711 scale(D5, D6); int rbutton = D4; // this button will be used to reset the scale to 0. float weight; float calibration_factor = -101525; // for me this vlaue works just perfect 419640 void setup() { Serial.begin(115200); pinMode(rbutton, INPUT_PULLUP); scale.set_scale(); scale.tare(); //Reset the scale to 0 long zero_factor = scale.read_average(); //Get a baseline reading Wire.begin(D2, D1); lcd.begin(); lcd.setCursor(6,0); lcd.print("IOT"); lcd.setCursor(1,1); lcd.print("Weighing Scale"); delay(3000); lcd.clear(); lcd.print("Connecting Wifi"); lcd.setCursor(0,1); lcd.print("& Thingspeak"); WiFi.begin(ssid, pass); { delay(500); Serial.print("."); lcd.clear(); } Serial.println(""); Serial.println("WiFi connected"); lcd.clear(); lcd.print("WiFi connected"); delay(3000); } void loop() { scale.set_scale(calibration_factor); //Adjust to this calibration factor weight = scale.get_units(5); lcd.setCursor(0, 0); lcd.print("Measured Weight"); lcd.setCursor(0, 1); lcd.print(weight); lcd.print(" KG "); delay(1500); lcd.clear(); Serial.print("Weight: "); Serial.print(weight); Serial.println(" KG"); Serial.println(); if ( digitalRead(rbutton) == LOW) { scale.set_scale(); scale.tare(); //Reset the scale to 0 } if (client.connect(server, 80)) // "184.106.153.149" or api.thingspeak.com { String postStr = apiKey; postStr +="&field1="; postStr += String(weight); postStr += "\r\n\r\n"; client.print("POST /update HTTP/1.1\n"); client.print("Host: api.thingspeak.com\n"); client.print("Connection: close\n"); client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n"); client.print("Content-Type: application/x-www-form-urlencoded\n"); client.print("Content-Length: "); client.print(postStr.length()); client.print("\n\n"); client.print(postStr); } client.stop(); Serial.println("Waiting..."); //delay(1500); // thingspeak needs minimum 15 sec delay between updates. } |
После загрузки кода с правильным ключом API вы сможете отслеживать данные онлайн на Thingspeak.