این آموزش نحوه استفاده از سنسور فشارسنج BMP180 بوسیله ماژول ESP32 برای خواندن فشار، دما و تخمین ارتفاع و همچنین مانیتور داده های آن در نرم افزار Node-Red را به شما نشان می دهد.
سنسور بارومتریک فشار و دما (BMP180)
BMP180 یک سنسور فشارسنج دیجیتالی بسیار کم مصرف است و فشار مطلق هوای اطراف را اندازه گیری می کند. دارای محدوده اندازه گیری از 300hPa تا 1100 با دقت تا 0.02hPa است. از آنجا که دما بر فشار تأثیر می گذارد، این قطعه دارای یک سنسور اندازه گیری دما است. علاوه بر این، به علت تغییر فشار با ارتفاع، می توانید ارتفاع را بر اساس اندازه گیری فشار فعلی تخمین بزنید. یک نکته مهم در مورد سنسورها کالیبراسیون آن است. یک سنسور باید به درستی کالیبره شود تا نتایج قابل قبولی تولید کند. خوشبختانه همه سنسورهای فشارسنج BMP180 شرکت بوش به صورت کارخانه ای کالیبره هستند.
راه اندازی سنسور بارومتریک فشار و دما (BMP180) بوسیله ماژول ESP32
سنسور فشارسنج BMP180 از پروتکل ارتباطی SPI یا I2C جهت اتصال به میکروکنترلر استفاده می کند. برای ارتباط با ماژول ESP32 از پروتکل I2C استفاده می شود. بنابراین، باید از پین های SDA و SCL ماژول ESP32 استفاده کرد. جدول زیر نحوه سیم کشی سنسور را نشان می دهد.
برنامه نویسی سنسور فشارسنج BMP180
برای نوشتن برنامه این سنسور و برقراری ارتباط صحیح با ماژول، کتابخانه <Adafruit_BMP085.h> و <Wire.h> را دانلود می کنیم. کد مورد نیاز به شکل زیر می باشد. نتایج آن را می توان در سریال مانیتور مشاهده کرد که شامل دما، فشار و ارتفاع تخمینی است.
#include <Wire.h> #include <Adafruit_BMP085.h> Adafruit_BMP085 bmp; void setup() { Serial.begin(115200); if (!bmp.begin()) { Serial.println("Could not find a valid BMP085/BMP180 sensor, check wiring!"); while (1) {} } } void loop() { Serial.print("Temperature = "); Serial.print(bmp.readTemperature()); Serial.println(" *C"); Serial.print("Pressure = "); Serial.print(bmp.readPressure()); Serial.println(" Pa"); // Calculate altitude assuming 'standard' barometric // pressure of 1013.25 millibar = 101325 Pascal Serial.print("Altitude = "); Serial.print(bmp.readAltitude()); Serial.println(" meters"); Serial.print("Pressure at sealevel (calculated) = "); Serial.print(bmp.readSealevelPressure()); Serial.println(" Pa"); // you can get a more precise measurement of altitude // if you know the current sea level pressure which will // vary with weather and such. If it is 1015 millibars // that is equal to 101500 Pascals. Serial.print("Real altitude = "); Serial.print(bmp.readAltitude(102000)); Serial.println(" meters"); Serial.println(); delay(500); }
ارسال اطلاعات سنسور فشار سنج بارومتریک به سرور MQTT و مانیتور آن ها در Node-Red
در این پروژه نشان می دهیم که چگونه می توان دما، فشار و ارتفاع را (با استفاده از مقادیر دقیق) با کمک ارتباط بی سیم (Wi-fi) با ماژول ESP32 و سنسور فشارسنج اندازه گیری و در Node-Red مانیتور کرد.
سخت افزار مورد نیاز در این پروژه ماژول ESP32، سنسور فشار بارومتریک (BMP180)، یک کابل USB و چند عدد سیم جامپر است. همچنین نرم افزارهای مورد نیاز شامل Arduino IDE، Node-Red و پلتفرم های لازم پروتکل MQTT و JSON می باشند.
شروع پروژه
برای شروع پروژه ابتدا کد آردوینو را بر روی ماژول ESP32 آپلود کنید. در این کد به کتابخانه های <WiFi.h>، <PubSubClient.h ،<Adafruit_BMP085.h> و <Wire.h> احتیاج داریم. پس از آپلود کد، پروتکل MQTT را بر روی سرور Start کنید. سپس Node-Red را باز کنید و شماتیک بلوکی را همانند شکل طراحی کنید. در این طراحی به نودهای MQTT، json function، join و debug و همچنین جهت مانیتور داده ها در داشبود به نودهای gauge و chart نیاز داریم. برای دیدن داشبورد در قسمت آدرس مرورگر، آی پی که با آن وارد Node-Red شده اید را وارد کرده و در انتهای آن ui/ را اضافه کنید. همانطور که در نتایج مشاهده می کنید، امکان دیدن داده های سنسور در سریال مانیتور و در نرم افزار Node-Red فراهم است. همچنین جهت مانیتورینگ و کنترل داده ها می توان از ابزار داشبورد استفاده کرد.
#include <WiFi.h> #include <PubSubClient.h> #include <Adafruit_BMP085.h> #include <Wire.h> Adafruit_BMP085 bmp;; WiFiClient espClient; PubSubClient client(espClient); const char* mqtt_username = "cdavid"; // MQTT username const char* mqtt_password = "1qaz"; // MQTT password void reconnectmqttserver() { while (!client.connected()) { Serial.print("Attempting MQTT connection..."); String clientId = "ESP32Client-"; clientId += String(random(0xffff), HEX); if (client.connect(clientId.c_str())) { Serial.println("connected"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); delay(5000); } } } char msgmqtt[50]; void callback(char* topic, byte* payload, unsigned int length) { String MQTT_DATA = ""; for (int i=0;i<length;i++) { MQTT_DATA += (char)payload[i];} } void setup() { Serial.begin(115200); WiFi.disconnect(); delay(3000); Serial.println("START"); WiFi.begin("ClientP3G","P@rt3G2o2o!%"); if (!bmp.begin()) { Serial.println("Could not find a valid BMP085/BMP180 sensor, check wiring!"); } while ((!(WiFi.status() == WL_CONNECTED))){ delay(300); Serial.print("00"); } Serial.println("Connected"); Serial.println("Your IP is"); Serial.println((WiFi.localIP().toString())); client.setServer("172.30.224.145", 1883); client.setCallback(callback); } void loop() { if (!client.connected()) { reconnectmqttserver(); } client.loop(); Serial.print("Temperature = "); Serial.print(bmp.readTemperature()); Serial.println(" *C"); Serial.print("Pressure = "); Serial.print(bmp.readPressure()); Serial.println(" Pa"); Serial.print("Altitude = "); Serial.print(bmp.readAltitude()); Serial.println(" meters"); snprintf (msgmqtt, 50, "%f ",bmp.readTemperature()); client.publish("TempC", msgmqtt); snprintf (msgmqtt, 50, "%d ",bmp.readPressure()); client.publish("Pressur", msgmqtt); snprintf (msgmqtt, 50, "%f ",bmp.readAltitude()); client.publish("FAltitude", msgmqtt); delay(3000); Serial.println("Your IP is"); Serial.println((WiFi.localIP().toString())); }
4 دیدگاه