در آموزش های قبلی راجب به برد TTGO T Call توضیح دایم . این برد یک پلتفرم قوی جهت اجرای پروژه های مبتنی بر ESP32 است . در این آموزش قصد داریم از این ماژول برای ارسال دمای اندازه گیری شده توسط سنسور DS18B20 از طریق SMS از این برد استفاده کنیم . شما می توانید با اتصال یک باتری لیپو به این برد ، برد را در هر مکانی بذارید تا دما محیط را ارسال کند . برای راه اندزای SIM800 موجود بر روی این برد در ابتدا لازم است یک سری پیکر بندی ها را انجام دهید که در این اموزش به آن خواهیم پرداخت .
دیاگرام عملکرد پروژه در تصویر زیر نشان داده شده است . با بالا رفتن یا پایین آمدن دما از یک حد معیین LilyGo یک SMS به کاربر ارسال خواهد کرد :
کد های پروژه :
const char simPIN[] = ""; // Your phone number to send SMS: + (plus sign) and country code, for Portugal +351, followed by phone number // SMS_TARGET Example for Portugal +351XXXXXXXXX #define SMS_TARGET "+351XXXXXXXXX" // Define your temperature Threshold (in this case it's 28.0 degrees Celsius) float temperatureThreshold = 28.0; // Flag variable to keep track if alert SMS was sent or not bool smsSent = false; // Configure TinyGSM library #define TINY_GSM_MODEM_SIM800 // Modem is SIM800 #define TINY_GSM_RX_BUFFER 1024 // Set RX buffer to 1Kb #include <Wire.h> #include <TinyGsmClient.h> #include <OneWire.h> #include <DallasTemperature.h> // GPIO where the DS18B20 is connected to const int oneWireBus = 13; // Setup a oneWire instance to communicate with any OneWire devices OneWire oneWire(oneWireBus); // Pass our oneWire reference to Dallas Temperature sensor DallasTemperature sensors(&oneWire); // TTGO T-Call pins #define MODEM_RST 5 #define MODEM_PWKEY 4 #define MODEM_POWER_ON 23 #define MODEM_TX 27 #define MODEM_RX 26 #define I2C_SDA 21 #define I2C_SCL 22 // Set serial for debug console (to Serial Monitor, default speed 115200) #define SerialMon Serial // Set serial for AT commands (to SIM800 module) #define SerialAT Serial1 // Define the serial console for debug prints, if needed //#define DUMP_AT_COMMANDS #ifdef DUMP_AT_COMMANDS #include <StreamDebugger.h> StreamDebugger debugger(SerialAT, SerialMon); TinyGsm modem(debugger); #else TinyGsm modem(SerialAT); #endif #define IP5306_ADDR 0x75 #define IP5306_REG_SYS_CTL0 0x00 bool setPowerBoostKeepOn(int en){ Wire.beginTransmission(IP5306_ADDR); Wire.write(IP5306_REG_SYS_CTL0); if (en) { Wire.write(0x37); // Set bit1: 1 enable 0 disable boost keep on } else { Wire.write(0x35); // 0x37 is default reg value } return Wire.endTransmission() == 0; } void setup() { // Set console baud rate SerialMon.begin(115200); // Keep power when running from battery Wire.begin(I2C_SDA, I2C_SCL); bool isOk = setPowerBoostKeepOn(1); SerialMon.println(String("IP5306 KeepOn ") + (isOk ? "OK" : "FAIL")); // Set modem reset, enable, power pins pinMode(MODEM_PWKEY, OUTPUT); pinMode(MODEM_RST, OUTPUT); pinMode(MODEM_POWER_ON, OUTPUT); digitalWrite(MODEM_PWKEY, LOW); digitalWrite(MODEM_RST, HIGH); digitalWrite(MODEM_POWER_ON, HIGH); // Set GSM module baud rate and UART pins SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX); delay(3000); // Restart SIM800 module, it takes quite some time // To skip it, call init() instead of restart() SerialMon.println("Initializing modem..."); modem.restart(); // use modem.init() if you don't need the complete restart // Unlock your SIM card with a PIN if needed if (strlen(simPIN) && modem.getSimStatus() != 3 ) { modem.simUnlock(simPIN); } // Start the DS18B20 sensor sensors.begin(); } void loop() { sensors.requestTemperatures(); // Temperature in Celsius degrees float temperature = sensors.getTempCByIndex(0); SerialMon.print(temperature); SerialMon.println("*C"); // Temperature in Fahrenheit degrees /*float temperature = sensors.getTempFByIndex(0); SerialMon.print(temperature); SerialMon.println("*F");*/ // Check if temperature is above threshold and if it needs to send the SMS alert if((temperature > temperatureThreshold) && !smsSent){ String smsMessage = String("Temperature above threshold: ") + String(temperature) + String("C"); if(modem.sendSMS(SMS_TARGET, smsMessage)){ SerialMon.println(smsMessage); smsSent = true; } else{ SerialMon.println("SMS failed to send"); } } // Check if temperature is below threshold and if it needs to send the SMS alert else if((temperature < temperatureThreshold) && smsSent){ String smsMessage = String("Temperature below threshold: ") + String(temperature) + String("C"); if(modem.sendSMS(SMS_TARGET, smsMessage)){ SerialMon.println(smsMessage); smsSent = false; } else{ SerialMon.println("SMS failed to send"); } } delay(5000); }
نحوه اتصال DS18B20 به ESP32 :
شرح برخی از قسمت های برنامه :
در خط اول برنامه یک آرایه کاراکتری برای PIN کد سیم کارت نوشته شده است . در صورتی که سیمکارت شما PIN کد دارد می توانید در این قسمت وارد کنید در غیر اینصورت نیازی به تغییر این قسمت نیست :
const char simPIN[] = "";
در خط بعد شماره تلفن خود را داخل دابل کوتیشن ها وارد کنید :
#define SMS_TARGET "شماره موبایل"
سپس آستانه دمای تعیین شده است که با رسیدن دما به این مقدار SMS ارسال می شود :
float temperatureThreshold = 28.0;
پس از تعریف متغییر هایی برای برسی ارسال صحیص و همچنین مقدار بافر UART ، کتابخانه های مورد نیاز به برنامه اضافه شده است که باید این کتابخانه ها را دانلود و نصب کیند :
#include <Wire.h> #include <TinyGsmClient.h> #include <OneWire.h> #include <DallasTemperature.h>
در قسمت بعد پیکر بندی های ارتباط 1Wire برای ارتباط با DS18B20 است . همچنین ماکرو هایی برای پین های ماژول SIM800 که به ESP32 متصل است تعریف شده اند :
const int oneWireBus = 13; // Setup a oneWire instance to communicate with any OneWire devices OneWire oneWire(oneWireBus); // Pass our oneWire reference to Dallas Temperature sensor DallasTemperature sensors(&oneWire); // TTGO T-Call pins #define MODEM_RST 5 #define MODEM_PWKEY 4 #define MODEM_POWER_ON 23 #define MODEM_TX 27 #define MODEM_RX 26 #define I2C_SDA 21 #define I2C_SCL 22 // Set serial for debug console (to Serial Monitor, default speed 115200) #define SerialMon Serial // Set serial for AT commands (to SIM800 module) #define SerialAT Serial1 // Define the serial console for debug prints, if needed //#define DUMP_AT_COMMANDS #ifdef DUMP_AT_COMMANDS #include <StreamDebugger.h> StreamDebugger debugger(SerialAT, SerialMon); TinyGsm modem(debugger); #else TinyGsm modem(SerialAT); #endif #define IP5306_ADDR 0x75 #define IP5306_REG_SYS_CTL0 0x00
از تابع زیر برای پیکر بندی IP5306 استفاده می شود :
bool setPowerBoostKeepOn(int en){ Wire.beginTransmission(IP5306_ADDR); Wire.write(IP5306_REG_SYS_CTL0); if (en) { Wire.write(0x37); // Set bit1: 1 enable 0 disable boost keep on } else { Wire.write(0x35); // 0x37 is default reg value } return Wire.endTransmission() == 0; }
منبع : https://randomnerdtutorials.com