در آموزش های قبلی راجب به برد 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


