В данном руководстве мы рассмотрим, как подключать плату TTGO T-Call ESP32 SIM800L к интернету с помощью мобильной сети и подписываться/опубликовывать данные через брокер MQTT. Используемый брокер MQTT Mosquitto будет устанавливаться на сервер Digital Ocean. Также будем использовать NodeRED для визуализации показаний датчика и управления выходами платы. Плату программируем в Arduino IDE.
С этой платой возможно следить за работой платы из любой точки мира, к тому же плате не требуется подключение к Wi-Fi, так как она использует мобильный интернет.
Плата TTGO T-Call ESP32 SIM800L
Данная плата является модификацией платы ESP32 с модулем SIM800L GSM/GPRS.
Взаимодействовать с данной платой возможно не только по Wi-Fi и Bluetooth, но также с помощью СМС и мобильных звонков. Также возможно использовать мобильный интернет, что может быть очень удобным для IoT-проектов.
Важно: SIM800L работает в сети 2G, а она, в свою очередь, работает не везде. Проверьте покрытие вашего мобильного оператора.
Для использования данной платы вам потребуется nano-SIM карта и кабель USB Type-C для загрузки скетча.
В комплекте с платой идут несколько штыревых разъемов, коннектор питания и внешняя антенна, которую надо присоединить к плате.
Однако, антенна из комплекта плохо работала и мы заменили ее другой.
Обзор
Суть проекта заключается в подключении платы к облачному брокеру для подписки на топик MQTT и публикации показаний датчика в топик.
В предыдущем проекте мы создали сервер с базой данных и графиком. Здесь мы займемся публикацией данных на сервер по протоколу MQTT через брокер Mosquitto.
Кратко о том, как работает проект:
- Плата T-Call ESP32 SIM800L подключена к серверу через мобильный интернет;
- Плата публикует показания датчика по протоколу MQTT, данные отображаются в консоли NodeRED;
- В консоли NodeRED можно управлять выходами GPIO платы.
Мы используем датчик BME280, вы, конечно же, можете использовать любой другой.
Брокер MQTT
Рекомендуется использовать брокер MQTT на сервере Digital Ocean, так как сервер поддерживает все необходимые требования к проекту. Также мы используем NodeRED для визуализации показания датчика в шкалах и отправки сообщений ESP32.
Что нам потребуется?
- Надстройка ESP32 для среды разработки Arduino
- Подготовить брокер MQTT
Если вы хотите в точности следовать пунктам в этом проекте, вам сначала потребуется создать свой сервер. Это выполнено здесь.
В проекте наша плата будет публиковать показания температуры и влажности каждые 30 секунд в топиках esp/temperature и esp/humidity. Сама плата подписана на топики esp/output1 и esp/output2 для изменения статуса светодиодов.
Запустив на сервере NodeRED перейдите на IP вашего сервера с добавкой :1880
http://cloud-mqtt-broker-ip-address:1880
Соедините ноды как показано ниже:
Загрузите схему (нажмите кнопку в правом верхнем углу)
Также вы можете перейти в Menu > Import и скопировать следующий скрипт в Clipboard:
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 |
[{"id":"a2c394d8.1544e8","type":"mqtt in","z":"537cca59.c4a014","name":"","topic": "esp/temperature","qos":"2","datatype":"auto","broker":"18f874c0.4a464b", "x":140,"y":1020,"wires":[["6907217e.f39bf"]]},{"id":"b83c2ecf.8ab94","type":"mqtt in","z":"537cca59.c4a014","name":"","topic":"esp/humidity","qos":"2","datatype": "auto","broker":"18f874c0.4a464b","x":130,"y":1100,"wires":[["c92e354e.a27d48"]]}, {"id":"ee844c66.3eda2","type":"mqtt out","z":"537cca59.c4a014","name":"", "topic":"esp/output1","qos":"1","retain":"","broker":"18f874c0.4a464b", "x":330,"y":1180,"wires":[]},{"id":"54540fba.e5877","type":"mqtt out","z": "537cca59.c4a014","name":"","topic":"esp/output2","qos":"1","retain":"", "broker":"18f874c0.4a464b","x":330,"y":1260,"wires":[]},{"id":"56080a9a.c7bba4", "type":"ui_switch","z":"537cca59.c4a014","name":"","label":"Output 1","tooltip":"", "group":"1539f836.ed9378","order":0,"width":0,"height":0,"passthru":true,"decouple": "false","topic":"","style":"","onvalue":"true","onvalueType":"bool","onicon":"", "oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"", "x":120,"y":1180,"wires":[["ee844c66.3eda2"]]},{"id":"417bd6d1.1d1468","type": "ui_switch","z":"537cca59.c4a014","name":"","label":"Output 2","tooltip":"", "group":"1539f836.ed9378","order":0,"width":0,"height":0,"passthru":true,"decouple": "false","topic":"","style":"","onvalue":"true","onvalueType":"bool","onicon":"", "oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"", "x":120,"y":1260,"wires":[["54540fba.e5877"]]},{"id":"6907217e.f39bf","type": "ui_gauge","z":"537cca59.c4a014","name":"","group":"1539f836.ed9378","order":2 ,"width":0,"height":0,"gtype":"gage","title":"Temperature","label":"Celsius Degrees", "format":"{{value}}","min":"-10","max":"40","colors":["#00b500","#e6e600","#ca3838"], "seg1":"","seg2":"","x":350,"y":1020,"wires":[]},{"id":"c92e354e.a27d48","type": "ui_gauge","z":"537cca59.c4a014","name":"","group":"1539f836.ed9378","order":2,"width":0, "height":0,"gtype":"gage","title":"Humidity","label":"%","format":"{{value}}", "min":"0","max":"100","colors":["#93dae6","#0074cc","#002561"],"seg1":"","seg2":"", "x":340,"y":1100,"wires":[]},{"id":"18f874c0.4a464b","type":"mqtt-broker","z":"","name":"", "broker":"localhost","port":"1883","clientid":"","usetls":false,"compatmode":false, "keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"", "closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0", "willPayload":""},{"id":"1539f836.ed9378","type":"ui_group","z":"","name":"Dashboard", "tab":"38becbd0.c13714","order":1,"disp":true,"width":"6","collapse":false},{"id":"38becbd0.c13714", "type":"ui_tab","z":"","name":"Home","icon":"dashboard","disabled":false,"hidden":false}] |
- SIM-карта
Для использования платы вам потребуется nano-SIM с подключенным тарифом.
- Настройки APN
Для подключения SIM-карты к интернету вам потребуется настроить APN. Обычно настройки выставляются автоматически при подключении SIM-карты к смартфону. Если это не там, то можно обратиться на сайт ОПСОСа или перейти на этот сайт для поиска настроек.
- Библиотеки
Потребуется установить библиотеки для работы проекта – Adafruit_BME280, Adafruit_sensor, TinyGSM и PubSubClient. Следуйте инструкции по их установке.
Установка библиотек
Откройте IDE Arduino и выберите Скетч> Подключить библиотеку> Управлять библиотеками. Должен открыться менеджер библиотек.
Найдите adafruit bme280 в поле поиска и установите библиотеку.
Чтобы использовать библиотеку BME280, также необходимо установить Adafruit Unified Sensor. Выполните следующие шаги, чтобы установить библиотеку в вашу среду разработки Arduino:
Найдите Adafruit Unified Sensor в поле поиска. Прокрутите до конца, найдите библиотеку и установите ее.
В менеджере библиотек найдите библиотеку TinyGSM и установите её:
Найдите в менеджере библиотек PubSubClient и установите её.
После установки всех библиотек перезапустите Arduino IDE.
Требуемые детали
- TTGO T-Call ESP32 SIM800L
- Кабель USB Type-C
- Антенна (не обязательно)
- Датчик BME280
- 2 светодиода;
- 2 резистора на 220 Ом;
- Макетная плата
- Провода DuPont
Схема
Соедините датчик BME280 с платой согласно следующей схеме:
Мы подключаем пин SDA к выходу GPIO18 и SCL к GPIO19, выходы I2C не используем потому, что они нужны для регулятора батареи платы.
Код
Скопируйте следующий код в скетч Arduino, но пока не загружайте. Потребуется внести некоторые изменения.
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 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 |
/* Rui Santos Complete project details at https://RandomNerdTutorials.com/esp32-cloud-mqtt-broker-sim800l/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. */ // Выбор модема: #define TINY_GSM_MODEM_SIM800 // Модем - SIM800L // Установка последовательного порта для консоли отладки (для монитора Serial, скорость по умолчанию 115200) #define SerialMon Serial // Установка последовательного порта для AT-команд #define SerialAT Serial1 // Определение последовательного порта для вывода отладочных сообщений, если необходимо #define TINY_GSM_DEBUG SerialMon // Установка PIN-кода для GSM, если есть #define GSM_PIN "" // Ваши учетные данные GPRS, если они есть const char apn[] = ""; // APN (пример: internet.vodafone.pt) см. https://wiki.apnchanger.org const char gprsUser[] = ""; const char gprsPass[] = ""; // PIN-код SIM-карты (оставьте пустым, если не определен) const char simPIN[] = ""; // Детали MQTT const char* broker = "XXX.XXX.XXX.XXX"; // Публичный IP-адрес или имя домена const char* mqttUsername = "REPLACE_WITH_YOUR_MQTT_USER"; // Имя пользователя MQTT const char* mqttPassword = "REPLACE_WITH_YOUR_MQTT_PASS"; // Пароль MQTT const char* topicOutput1 = "esp/output1"; const char* topicOutput2 = "esp/output2"; const char* topicTemperature = "esp/temperature"; const char* topicHumidity = "esp/humidity"; // Определение последовательного порта для вывода отладочных сообщений, если необходимо //#define DUMP_AT_COMMANDS #include <Wire.h> #include <TinyGsmClient.h> #ifdef DUMP_AT_COMMANDS #include <StreamDebugger.h> StreamDebugger debugger(SerialAT, SerialMon); TinyGsm modem(debugger); #else TinyGsm modem(SerialAT); #endif #include <PubSubClient.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> TinyGsmClient client(modem); PubSubClient mqtt(client); // Пины TTGO T-Call #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 // Пины BME280 #define I2C_SDA_2 18 #define I2C_SCL_2 19 #define OUTPUT_1 2 #define OUTPUT_2 15 uint32_t lastReconnectAttempt = 0; // I2C для SIM800 (для поддержания работы при питании от батареи) TwoWire I2CPower = TwoWire(0); TwoWire I2CBME = TwoWire(1); Adafruit_BME280 bme; #define IP5306_ADDR 0x75 #define IP5306_REG_SYS_CTL0 0x00 float temperature = 0; float humidity = 0; long lastMsg = 0; bool setPowerBoostKeepOn(int en){ I2CPower.beginTransmission(IP5306_ADDR); I2CPower.write(IP5306_REG_SYS_CTL0); if (en) { I2CPower.write(0x37); // Установите бит1: 1, чтобы включить, 0, чтобы отключить сохранение усиления } else { I2CPower.write(0x35); // 0x37 - значение регистра по умолчанию } return I2CPower.endTransmission() == 0; } void mqttCallback(char* topic, byte* message, unsigned int len) { Serial.print("Получено сообщение по теме: "); Serial.print(topic); Serial.print(". Сообщение: "); String messageTemp; for (int i = 0; i < len; i++) { Serial.print((char)message[i]); messageTemp += (char)message[i]; } Serial.println(); // Если получено сообщение в теме esp/output1, проверьте, является ли сообщение "true" или "false". // Измените состояние вывода в соответствии с сообщением. if (String(topic) == "esp/output1") { Serial.print("Изменение состояния вывода на "); if(messageTemp == "true"){ Serial.println("true"); digitalWrite(OUTPUT_1, HIGH); } else if(messageTemp == "false"){ Serial.println("false"); digitalWrite(OUTPUT_1, LOW); } } else if (String(topic) == "esp/output2") { Serial.print("Изменение состояния вывода на "); if(messageTemp == "true"){ Serial.println("true"); digitalWrite(OUTPUT_2, HIGH); } else if(messageTemp == "false"){ Serial.println("false"); digitalWrite(OUTPUT_2, LOW); } } } boolean mqttConnect() { SerialMon.print("Подключение к "); SerialMon.print(broker); // Подключение к MQTT Broker без имени пользователя и пароля //boolean status = mqtt.connect("GsmClientN"); // Или, если вы хотите аутентифицироваться в MQTT: boolean status = mqtt.connect("GsmClientN", mqttUsername, mqttPassword); if (status == false) { SerialMon.println(" не удалось"); ESP.restart(); return false; } SerialMon.println(" успешно"); mqtt.subscribe(topicOutput1); mqtt.subscribe(topicOutput2); return mqtt.connected(); } void setup() { // Установка скорости последовательного порта для консоли SerialMon.begin(115200); delay(10); // Начало работы с I2C I2CPower.begin(I2C_SDA, I2C_SCL, 400000); I2CBME.begin(I2C_SDA_2, I2C_SCL_2, 400000); // Поддержание питания при работе от батареи bool isOk = setPowerBoostKeepOn(1); SerialMon.println(String("IP5306 KeepOn ") + (isOk ? "OK" : "FAIL")); // Установка пинов для сброса, включения и питания модема 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); pinMode(OUTPUT_1, OUTPUT); pinMode(OUTPUT_2, OUTPUT); SerialMon.println("Подождите..."); // Установка скорости модуля GSM и пинов UART SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX); delay(6000); // Перезапуск модема занимает некоторое время // Для его пропуска вызовите init() вместо restart() SerialMon.println("Инициализация модема..."); modem.restart(); // modem.init(); String modemInfo = modem.getModemInfo(); SerialMon.print("Информация о модеме: "); SerialMon.println(modemInfo); // Разблокируйте SIM-карту с помощью PIN-кода, если необходимо if ( GSM_PIN && modem.getSimStatus() != 3 ) { modem.simUnlock(GSM_PIN); } // Возможно, вам потребуется изменить адрес I2C для BME280, в нашем случае это 0x76 if (!bme.begin(0x76, &I2CBME)) { Serial.println("Не удалось найти датчик BME280, проверьте подключение!"); while (1); } SerialMon.print("Подключение к APN: "); SerialMon.print(apn); if (!modem.gprsConnect(apn, gprsUser, gprsPass)) { SerialMon.println(" не удалось"); ESP.restart(); } else { SerialMon.println(" OK"); } if (modem.isGprsConnected()) { SerialMon.println("GPRS подключено"); } // Настройка брокера MQTT mqtt.setServer(broker, 1883); mqtt.setCallback(mqttCallback); } void loop() { if (!mqtt.connected()) { SerialMon.println("=== MQTT НЕ ПОДКЛЮЧЕНО ==="); // Переподключение каждые 10 секунд uint32_t t = millis(); if (t - lastReconnectAttempt > 10000L) { lastReconnectAttempt = t; if (mqttConnect()) { lastReconnectAttempt = 0; } } delay(100); return; } long now = millis(); if (now - lastMsg > 30000) { lastMsg = now; // Температура в градусах Цельсия temperature = bme.readTemperature(); // Раскомментируйте следующую строку, чтобы установить температуру в градусах Фаренгейта // (и закомментируйте предыдущую строку температуры) //temperature = 1.8 * bme.readTemperature() + 32; // Температура в градусах Фаренгейта // Преобразование значения в массив символов char tempString[8]; dtostrf(temperature, 1, 2, tempString); Serial.print("Температура: "); Serial.println(tempString); mqtt.publish(topicTemperature, tempString); humidity = bme.readHumidity(); // Преобразование значения в массив символов char humString[8]; dtostrf(humidity, 1, 2, humString); Serial.print("Влажность: "); Serial.println(humString); mqtt.publish(topicHumidity, humString); } mqtt.loop(); } |
Как работает код?
Указываем настройки APN в следующих переменных:
1 2 3 |
const char apn[] = ""; const char gprsUser[] = ""; const char gprsPass[] = ""; |
Указываем пин-код от SIM-карты, если требуется:
1 |
const char simPIN[] = ""; |
Вам также потребуется указать данные сервера MQTT в следующих переменных:
1 2 3 |
const char* broker = "178.XXX.XXX.XXX"; // IP брокера или доменное имя const char* mqttUsername = "REPLACE_WITH_YOUR_MQTT_USERNAME"; const char* mqttPassword = "REPLACE_WITH_YOUR_MQTT_PASSWORD"; |
Плата ESP32 подписана на топики esp/output1 и esp/output2, указываем это:
1 2 |
const char* topicOutput1 = "esp/output1"; const char* topicOutput2 = "esp/output2"; |
В коде достаточно много комментариев, так что можно понять суть каждой строки.
Следующие строки определяют пины, используемые платой SIM800L:
1 2 3 4 5 6 7 |
#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 |
Определяем пины BME280 (в нашем случае – GPIO18 и GPIO19):
1 2 |
#define I2C_SDA_2 18 #define I2C_SCL_2 19 |
Указываем порты для монитора порта и для обмена данными с модулем SIM800L:
1 2 |
#define SerialMon Serial #define SerialAT Serial1 |
Конфигурируем библиотеку TinyGSM для работы с нашей платой:
1 |
#define TINY_GSM_MODEM_SIM800 |
Подключаем библиотеки для работы с SIM800L:
1 2 |
#include <Wire.h> #include <TinyGsmClient.h> |
И библиотеки для работы датчика и протокола MQTT:
1 2 3 |
#include <PubSubClient.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> |
Инициализируем протокол I2C для SIM800L
1 |
TwoWire I2CPower = TwoWire(0); |
И еще один для датчика BME280:
1 2 |
TwoWire I2CBME = TwoWire(1); Adafruit_BME280 bme; |
Запускаем TinyGsmClient для подключения интернета:
1 |
TinyGsmClient client(modem); |
setup()
В этой функции запускаем монитор порта на скорости 115200 бод.
1 |
SerialMon.begin(115200); |
Запускаем протоколы I2C для датчика и платы:
1 2 |
I2CPower.begin(I2C_SDA, I2C_SCL, 400000); I2CBME.begin(I2C_SDA_2, I2C_SCL_2, 400000); |
Выставляем пины SIM800L в нужные состояния для корректной работы:
1 2 3 4 5 6 |
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); |
Запускаем последовательное соединение с модулем SIM800L:
1 |
SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX); |
Запускаем модуль и вводим пин-код, если требуется:
1 2 3 4 5 6 7 |
SerialMon.println("Initializing modem..."); modem.restart(); if (strlen(simPIN) && modem.getSimStatus() != 3 ) { modem.simUnlock(simPIN); } |
Запускаем датчик BME280:
1 2 3 4 |
if (!bme.begin(0x76, &I2CBME)) { Serial.println("Could not find a valid BME280 sensor, check wiring!"); while (1); } |
Ну и, наконец, подключаемся к интернету. Следующие строки подключают модуль к интернету:
1 2 3 4 5 6 7 8 9 |
SerialMon.print("Connecting to APN: "); SerialMon.print(apn); if (!modem.gprsConnect(apn, gprsUser, gprsPass)) { SerialMon.println(" fail"); ESP.restart(); } else { SerialMon.println(" OK"); } |
mqttConnect()
Данная функция отвечает за подключение платы к брокеру с помощью логина и пароля. Также она подписывает плату ESP32 на топики esp/output1 и esp/output2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
boolean mqttConnect() { SerialMon.print("Connecting to "); SerialMon.print(broker); // Подключение без логина и пароля //boolean status = mqtt.connect("GsmClientN"); // Если хотите авторизоваться, то boolean status = mqtt.connect("GsmClientN", mqttUsername, mqttPassword); if (status == false) { SerialMon.println(" fail"); ESP.restart(); return false; } SerialMon.println(" success"); mqtt.subscribe(topicOutput1); mqtt.subscribe(topicOutput2); return mqtt.connected(); } |
loop()
В этой функции создаем таймер, который публикует данные температуры и влажности в брокер каждые 30 секунд.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
long now = millis(); if (now - lastMsg > 30000) { lastMsg = now; temperature = bme.readTemperature(); // Конвертируем значения в символьный массив char tempString[8]; dtostrf(temperature, 1, 2, tempString); Serial.print("Temperature: "); Serial.println(tempString); mqtt.publish(topicTemperature, tempString); humidity = bme.readHumidity(); // Конвертируем значения в символьный массив char humString[8]; dtostrf(humidity, 1, 2, humString); Serial.print("Humidity: "); Serial.println(humString); mqtt.publish(topicHumidity, humString); } |
mqttCallback()
В этой функции описываем, как плата получает сообщения по протоколу MQTT. Согласно полученной информации, она изменяет состояние светодиода:
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 |
void mqttCallback(char* topic, byte* message, unsigned int len) { Serial.print("Message arrived on topic: "); Serial.print(topic); Serial.print(". Message: "); String messageTemp; for (int i = 0; i < len; i++) { Serial.print((char)message[i]); messageTemp += (char)message[i]; } Serial.println(); if (String(topic) == "esp/output1") { Serial.print("Changing output to "); if(messageTemp == "true"){ Serial.println("true"); digitalWrite(OUTPUT_1, HIGH); } else if(messageTemp == "false"){ Serial.println("false"); digitalWrite(OUTPUT_1, LOW); } } else if (String(topic) == "esp/output2") { Serial.print("Changing output to "); if(messageTemp == "true"){ Serial.println("true"); digitalWrite(OUTPUT_2, HIGH); } else if(messageTemp == "false"){ Serial.println("false"); digitalWrite(OUTPUT_2, LOW); } } } |
Загружаем код
После внесения необходимых изменений, можете загрузить скетч в плату.
Для загрузки кода перейдите в Инструменты > Плата и выберите ESP32 Dev module, т.к. в настоящее время в среде разработки Arduino не предусмотрена плата T-Call ESP32 SIM800L.
Демонстрация
Откройте монитор порта на скорости 115200 бод и нажмите кнопку RST на плате.
Сначала модуль инициализируется и пытается подключиться к интернету. Это может занять некоторое время (в районе 1 минуты).
После подключения к интернету плата начнет подключение к брокеру MQTT.
В нашем примере плата публикует показания датчика каждые 30 секунд, но для теста вы можете выставить любой другой интервал.
Затем откройте браузер введите доменное имя сервера с добавкой /ui. Вы должны увидеть шкалы с последними снятыми показаниями датчика, а также два регулятора для изменения состояния светодиодов на плате.
Возможные неисправности
Если не получилось подключиться к интернету. то возможны следующие неисправности:
- Настройки APN неправильные;
- Антенна плохо работает. В нашем случае пришлось ее заменить;
- Возможно, потребуется выйти из здания для лучшей работы сети;
- Также возможно, что плате не хватает питания. Если вы подключаете плату к компьютеру через USB-хаб без внешнего источника питания, может не хватать тока для корректной работы платы.
Заключение
Мы надеемся, что вам понравился данный проект. По нашему мнению, плата T-Call SIM800 ESP32 может быть очень полезной для IoT проектов, которые не имеют доступа к роутеру Wi-Fi. а с помощью этой платы легко подключить девайс к интернету.
Вопросы по прошивке и работе с кодом лучше писать напрямую автору в комментариях к статье (на англ. языке)
6 комментариев. Оставить новый
Спасибо!
Хорошо новичку изучать это добро с коментами на русском языке.
Только вот было-бы гораздо удобнее, когда код в скетче ПОЛНЫЙ с источника, а то не хватает хорошей части в середине, благо переписывал для использования esp32+sim800l (не TTGO T-Call).
Большое спасибо за корректировку. Поправили!
Здравствуйте подскажите как решить проблему с загрузкой скетча на плату.
ошибка:
/Users/user/Documents/Arduino/esp32_CAL/esp32_CAL.ino: In function ‘void mqttCallback(char*, byte*, unsigned int)’:
esp32_CAL:115:30: error: ‘t’ was not declared in this scope
lastReconnectAttempt = t;
^
esp32_CAL:116:23: error: ‘mqttConnect’ was not declared in this scope
if (mqttConnect()) {
^
/Users/user/Documents/Arduino/esp32_CAL/esp32_CAL.ino: At global scope:
esp32_CAL:120:10: error: expected constructor, destructor, or type conversion before ‘(‘ token
delay(100);
^
esp32_CAL:121:5: error: expected unqualified-id before ‘return’
return;
^
esp32_CAL:122:3: error: expected declaration before ‘}’ token
}
^
exit status 1
‘t’ was not declared in this scope
Компилятор ругается что в скетче зачем- то пять штук пустых #include.
Большое спасибо за замечание. Исправили!
Все отлично заливается и начинает работать. Только после непродолжительного времени перестают передаваться данные на mqqt. MQQT брокер показывает, что соединение есть, но данные не идут. В скетче нет проверки по обратной связи включился-отключился или действительно выход 1 и 2