Ответ SMS о температуре
Компоненты и расходные материалы
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Об этом проекте
Привет. Этот проект является частью гораздо более крупного проекта. Поскольку у меня было много проблем с этой частью и в конце концов я нашел решение, я решил поделиться им с сообществом и надеяться, что это поможет им в их проектах.
Описание проекта
Отправьте SMS на Arduino и узнайте температуру дома.
Программное обеспечение
Для модуля SIM800L я использовал библиотеку «Seeeduino_GPRS-master». Мне пришлось изменить следующие строки в библиотеке «sim800.h», чтобы она работала на MEGA:
#define SIM800_TX_PIN 8 # define SIM800_RX_PIN 7
... на TX_PIN 10 и RX_PIN 11. Изменить библиотеку с «SoftwareSerial» на один из портов Mega Serial, то есть Serial3, было слишком сложно, поэтому я выбрал простой выход.
Проблема
По сути, мой код - это вырезанные и вставленные примеры из двух библиотек:«DHT.h» и «Seeeduino_GPRS-master». Проблема, с которой я столкнулся, заключалась в том, что пример «gprs.h» только показал, как отправить заранее определенное сообщение в кавычках. Я не мог понять, как отправить значение переменной плавучести с моего датчика температуры. То же самое и с другими библиотеками, которые я пробовал:«GPRS_SIM900-master» и «SIM800L-master».
Я потратил недели на поиск в Интернете примеров решения моей проблемы, но не нашел. Я нашел на форуме сообщения на ту же тему, и я надеюсь, что вы найдете это сообщение для тех бедных заблудших душ, которые не получили ответов.
Ответ
Преобразуйте значение с плавающей запятой в String, а затем String в массив Char - просто!
Фрагмент кода
MyString =String (temp, 0); // Преобразование числа с плавающей точкой в StringMyString =(MyString + "Degrees C"); // преобразование строки в char, начинающейся здесь // Длина (с одним дополнительным символом для нулевого терминатора) int str_len =MyString.length () + 1; // Подготавливаем символьный массив (буфер) char char_array [str_len]; // Копируем его поверх MyString.toCharArray (char_array, str_len); // конвертируем строку в символьный конец здесь gprs.sendSMS ("04 +++++++ + ", char_array); // определяем номер телефона и текст.
Электропроводка
Я использовал батарею ULTRAFIRE 18650 для питания модуля sim. Позже добавлю в схему регулятор напряжения. См. Это руководство.
Справочные материалы
- http://www.ayomaonline.com/programming/quickstart-sim800-sim800l-with-arduino/
- https://www.sparkfun.com/datasheets/Sensors/Temperature/DHT22.pdf
Библиотеки
- https://github.com/Seeed-Studio/Seeeduino_GPRS
- https://github.com/adafruit/DHT-sensor-library
Код
- DHT_SIMPosting.ino
DHT_SIMPosting.ino Arduino
Отправить SMS «InTemp» запрашивает температуру и ответ Arduino в градусах C.// Пример тестового скетча для различных датчиков влажности / температуры DHT // Написано ladyada, общественное достояние # include «DHT.h» #define DHTPIN 2 // к какому цифровому выводу мы подключены # определить DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 // # определить DHTTYPE DHT21 // DHT 21 (AM2301) // Подключить контакт 1 (слева) датчика к + 5 В // Подключите контакт 2 датчика к любому вашему DHTPIN // Подключите контакт 4 (справа) датчика к ЗАЗЕМЛЕНИЮ // Подключите резистор 10 кОм от контакта 2 (данные) к контакту 1 (питание) sensor // Инициализирует датчик DHT.DHT dht (DHTPIN, DHTTYPE); # include#include #define TIMEOUT 5000GPRS gprs; bool ITemp =false; float temp; String MyString; #define LED_PIN 13bool ledStatus; // Переменная для хранения последней строки последовательного вывода от SIM800char currentLine [500] =""; int currentLineIndex =0; // Логическое значение должно быть установлено в true, если уведомление о сообщении было найдено, а следующая // строка последовательного вывода - это фактическое содержание SMS-сообщенияbool nextLineIsMessage =false; void Reply () // Здесь начинается функция {Serial.println ("GPRS - Отправить тестовое SMS ..."); gprs.preInit (); задержка (1000); в то время как (0! =gprs.init ()) {задержка (1000); Serial.print ("ошибка инициализации \ r \ n"); } Serial.println («Инициировать успешно, начать отправку SMS-сообщения ...»); если (ITemp ==true) {float t =dht.readTemperature (); temp =t; ITemp =false; } MyString =String (temp, 0); // Преобразование числа с плавающей точкой в String MyString =(MyString + "Degrees C"); // преобразование строки в символ начинается здесь // Длина (с одним дополнительным символом для нулевого терминатора) int str_len =MyString.length () + 1; // Подготавливаем символьный массив (буфер) char char_array [str_len]; // Копируем его поверх MyString.toCharArray (char_array, str_len); // преобразование строки в символ заканчивается здесь gprs.sendSMS ("04 ++++++++", char_array); // определение номера телефона и текста // Здесь функция заканчивается} void setup () {Serial.begin (9600); Serial.println («Тест DHTxx!»); dht.begin (); gprs.preInit (); задержка (1000); в то время как (0! =gprs.init ()) {задержка (1000); Serial.print ("ошибка инициализации \ r \ n"); // позже отобразить ОШИБКУ SIM-карты на домашней странице HMI Nextion} // Установите режим SMS в ASCII if (0! =gprs.sendCmdAndWaitForResp ("AT + CMGF =1 \ r \ n", "OK", TIMEOUT)) {ERROR ( «ОШИБКА:CNMI»); возвращение; } // Начать прослушивание новых сообщений SMS if (0! =Gprs.sendCmdAndWaitForResp ("AT + CNMI =1,2,0,0,0 \ r \ n", "OK", TIMEOUT)) {ERROR (" ОШИБКА:CNMI "); возвращение; } Serial.println ("Успешная инициализация");} void loop () {// Подождите несколько секунд между измерениями. задержка (2000); // Считывание температуры или влажности занимает около 250 миллисекунд! // Показания датчика также могут быть "старыми" до 2 секунд (это очень медленный датчик) float h =dht.readHumidity (); // Считываем температуру в градусах Цельсия (по умолчанию) float t =dht.readTemperature (); Serial.print ("Влажность:"); Серийный отпечаток (ч); Serial.println ("% \ t"); Serial.print ("Температура:"); Серийный принт (т); Serial.println ("* C"); SIM ();} void SIM () {// Записываем текущий статус на вывод светодиода digitalWrite (LED_PIN, ledStatus); Serial.println («Ищу SMS»); // Если есть последовательный вывод с SIM800 if (gprs.serialSIM800.available ()) {char lastCharRead =gprs.serialSIM800.read (); // Считываем каждый символ из последовательного вывода до тех пор, пока не будет достигнут \ r или \ n (что означает конец строки) if (lastCharRead =='\ r' || lastCharRead =='\ n') {String lastLine =String (currentLine); // Если последняя строка была прочитана + CMT, было получено новое сообщение SMS. // Следовательно, следующая строка - это содержание сообщения. если (lastLine.startsWith ("+ CMT:")) {Serial.println (lastLine); nextLineIsMessage =true; } иначе, если (lastLine.length ()> 0) {если (nextLineIsMessage) {Serial.println (lastLine); // Считываем содержимое сообщения и устанавливаем статус в соответствии с содержимым SMS if (lastLine.indexOf ("InTemp")> =0) {Serial.println ("InTemp"); ITemp =true; Отвечать (); // ledStatus =1; // Serial.println ("Включи свет"); //} else if (lastLine.indexOf ("LED OFF")> =0) {// ledStatus =0; // Serial.println («Выключить свет»); } nextLineIsMessage =false; }} // Очистить массив символов для следующей строки чтения for (int i =0; i
Схема
Производственный процесс
- Вентилятор с регулируемой температурой
- Регистратор температуры Raspberry Pi
- Считать температуру с помощью DS18B20 | Raspberry Pi 2
- Мониторинг температуры на Raspberry Pi
- Измерение температуры с помощью RASPBERRY PI
- Мониторинг температуры с помощью Raspberry Pi
- Проект IoT 101:потоковая температура с вашего Raspberry Pi
- Лаборатория «Метеостанция»
- Датчик температуры Raspberry Pi
- Rover