Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

SMS-управляемое чтение температуры DHT22 на Arduino Mega 2560

Компоненты и материалы

Arduino Mega 2560 1
Датчик температуры/влажности DHT22 1
SIM800L (GSM-модуль) 1
Резистор 10 кОм 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 на один из аппаратных Serial портов Mega (Serial3) было слишком сложно, поэтому пошел простым путем.

Проблема

Мой код — копипаст из примеров двух библиотек: DHT.h и Seeeduino_GPRS-master. Проблема: пример gprs.h показывал только отправку заранее заданного сообщения в кавычках. Не мог разобраться, как отправить переменную float от датчика температуры. То же с другими библиотеками: GPRS_SIM900-master и SIM800L-master.

Недели искал в вебе примеры — нигде. Нашел форумные посты с той же проблемой, но без ответов. Надеюсь, те потерянные души найдут этот пост.

Решение

Преобразовать float в String, затем String в char array — просто!

Фрагмент кода решения

MyString = String(temp, 0); // float в String
MyString = (MyString + " Degrees C"); 
// String в char array:
int str_len = MyString.length() + 1;
char char_array[str_len];
MyString.toCharArray(char_array, str_len);

gprs.sendSMS("04++++++++", char_array); // номер телефона и текст

Подключение

Питание SIM-модуля от ULTRAFIRE 18650. Позже добавлю стабилизатор напряжения. См. этот урок.

Ссылочный материал

Библиотеки

Код

DHT_SIMPosting.ino (Arduino)

// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

#include 
#include 
#define TIMEOUT 5000

GPRS gprs;
bool ITemp = false;
float temp;
String MyString;
#define LED_PIN 13
bool ledStatus;

char currentLine[500] = "";
int currentLineIndex = 0;
bool nextLineIsMessage = false;

void Reply() {
  Serial.println("GPRS - Send SMS Test ...");
  gprs.preInit();
  delay(1000);
  while(0 != gprs.init()) {
    delay(1000);
    Serial.print("init error\r\n");
  }
  Serial.println("Init success, start to send SMS message...");
  
  if (ITemp == true) {
    float t = dht.readTemperature();
    temp = t;
    ITemp = false;
  }
  
  MyString = String(temp, 0);
  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 test!");
  dht.begin();
  
  gprs.preInit();
  delay(1000);
  while(0 != gprs.init()) {
    delay(1000);
    Serial.print("init error\r\n");
  }
  
  // SMS режим ASCII
  if(0 != gprs.sendCmdAndWaitForResp("AT+CMGF=1\r\n", "OK", TIMEOUT)) {
    ERROR("ERROR:CNMI");
    return;
  }
  // Слушание новых SMS
  if(0 != gprs.sendCmdAndWaitForResp("AT+CNMI=1,2,0,0,0\r\n", "OK", TIMEOUT)) {
    ERROR("ERROR:CNMI");
    return;
  }
  Serial.println("Init success");
}

void loop() {
  delay(2000);
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.println(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.println(" *C ");
  
  SIM();
}

void SIM() {
  digitalWrite(LED_PIN, ledStatus);
  Serial.println("Looking for SMS");
  
  if(gprs.serialSIM800.available()) {
    char lastCharRead = gprs.serialSIM800.read();
    
    if(lastCharRead == '\r' || lastCharRead == '\n') {
      String lastLine = String(currentLine);
      
      if(lastLine.startsWith("+CMT:")) {
        Serial.println(lastLine);
        nextLineIsMessage = true;
      } else if (lastLine.length() > 0) {
        if(nextLineIsMessage) {
          Serial.println(lastLine);
          
          if(lastLine.indexOf("InTemp") >= 0) {
            Serial.println("InTemp");
            ITemp = true;
            Reply();
          }
          // else if(lastLine.indexOf("LED OFF") >= 0) { ... }
          
          nextLineIsMessage = false;
        }
      }
      
      for(int i = 0; i < sizeof(currentLine); ++i)
        currentLine[i] = (char)0;
      currentLineIndex = 0;
    } else {
      currentLine[currentLineIndex++] = lastCharRead;
    }
  }
}

Схемы

SMS-управляемое чтение температуры DHT22 на Arduino Mega 2560

Производственный процесс

  1. Температурно-управляемый вентилятор: DIY релейная система охлаждения мебели для медиа
  2. Сборка логгера температуры на Raspberry Pi с $5 I2C датчиком
  3. Как считывать температуру с DS18B20 на Raspberry Pi 2
  4. Профессиональный мониторинг температуры на Raspberry Pi с датчиком DS18B20
  5. Измерение температуры на Raspberry Pi с датчиками Maxim 1-Wire и мостом DS2482 I2C
  6. Точный мониторинг температуры в серверной на Raspberry Pi
  7. Учебник для начинающих по IoT: стриминг данных температуры с Raspberry Pi
  8. Создание сетевой лабораторной метеостанции на Raspberry Pi
  9. Создайте домашний монитор температуры на Raspberry Pi с MCP9808, InfluxDB и Grafana
  10. Построение ровера на Windows IoT Core с Raspberry Pi 2 — Руководство от новичка к профи