Introduction.
In an era where monitoring and automation are becoming increasingly significant in both industrial and residential environments, the need for efficient and reliable monitoring systems is paramount. This article delves into the creation of a robust GSM-based temperature and humidity monitoring system using Arduino. This system is designed to read environmental data using a DHT22 sensor, display the readings on an LCD, and enable remote data access via SMS using a GSM module.
System Overview
The system is built around several key components:
- Arduino Uno: The central controller for managing sensor data readings, display outputs, and GSM communications.
- DHT22 Temperature and Humidity Sensor: Provides accurate readings of the ambient temperature and humidity.
- 16×2 LCD Display with I2C Interface: Shows real-time temperature and humidity data for local monitoring.
- 4G LTE Modem: Enables SMS communication, allowing users to receive sensor data remotely on their mobile phones.
1.Connecting the DHT22 Sensor:
- The DHT22 sensor is connected to digital pin 2 of the Arduino. This pin reads the digital signal outputted by the sensor, which contains the temperature and humidity data.
2.Setting Up the LCD Display:
- The LCD is connected via the I2C bus, reducing the number of pins needed for interfacing. The typical I2C address for these displays is 0x27, but it can vary and should be confirmed with an I2C scanner sketch.
3.Integrating the 4G LTE Modem:
- The 4G LTE Modem is connected through a software serial port using pins 9 (RX) and 10 (TX). This setup allows the Arduino to communicate with the module to send and receive SMS messages.
The backbone of this project is a 4G LTE module, supported by JLCPCB SMT Assembly Services.For those interested in the technical details, I’ve covered the features and specifications of this 4G LTE module in a dedicated Article. This includes its advantages over traditional 2G GSM modules and guidance on connecting it with an Arduino Uno board.Click here to read the full Article.
PCB Design.
After making the Schematic, Convert it into PCB, Arrange and place all the components in desirable places, Once the layout is ready route the wiring and complete the design of PCB.
JLCPCB.
- In this project, a crucial component is the precision and reliability provided by the 4G LTE Module, a product that came to fruition with the expertise of JLCPCB. As the leading PCB (Printed Circuit Board) manufacturing company, JLCPCB offers state-of-the-art SMT (Surface Mount Technology) assembly services that enable hobbyists and professionals alike to bring their electronic projects to life with ease and affordability.
- Whether you’re building a simple DIY project or developing complex industrial applications, JLCPCB has the capabilities to meet your needs. They provide a fast turnaround on orders, often shipping within 24 hours, and their pricing is transparent and highly competitive, making high-quality PCBs accessible to everyone.
- What sets JLCPCB apart is their commitment to quality and customer service. Their website, JLCPCB, offers a user-friendly experience where you can easily upload your PCB design files, view instant quotes, and track the production process in real-time. With JLCPCB’s robust service offerings, you’re not just purchasing a product; you’re investing in a partnership that empowers your innovations.
- For those who are curious about integrating JLCPCB’s services into your own projects, I encourage you to explore their website and discover the various services they offer that can enhance your electronic designs. This project wouldn’t have been possible without their exceptional PCB assembly service, proving that JLCPCB is not just a supplier, but a critical partner in the world of electronics.
JLCPCB's Multi-Color Silkscreen PCBs.
- JLCPCB—their Multi-Color Silkscreen PCB service. This cutting-edge service allows the integration of multiple colors onto the surface of printed circuit boards, transforming standard PCBs from purely functional components into visually striking elements of any hardware project.
- Traditional silkscreen PCBs typically feature monochromatic designs, limiting their use to functional labels for component placements and simple logos. JLCPCB has revolutionized this by introducing their Multi-Color Silkscreen service, which supports vibrant and detailed graphics, enhancing both the aesthetics and functionality of your PCBs. Whether it’s intricate logos, detailed graphical instructions, or simply artistic designs, JLCPCB’s service enables a new level of creative expression.
- Utilizing premium UV curable inks that are both eco-friendly and resilient against fading and heat, JLCPCB ensures that your designs are not only striking but durable. The process is simple and integrated with JLCPCB’s online platform, where you can upload and manage your designs easily. Their state-of-the-art 6-color UV printer guarantees ultra-high resolution prints, making it possible to achieve exceptional detail on every PCB.
- Additionally, JLCPCB offers this service at a starting price of just $4.7, adding only a day to the standard production timeline, which makes it a cost-effective and timely solution for enhancing your electronic projects. To help users get started, JLCPCB has also introduced a limited-time offer that includes a special discount for those who join their official user group.
- For more detailed guidance on designing with Multi-Color Silkscreen, JLCPCB provides comprehensive support through EasyEDA tools, making it easy for anyone from hobbyists to professional designers to bring their colorful PCBs to life.
Code.
#include <DHT.h> #include <SoftwareSerial.h> #include <LiquidCrystal_I2C.h> // GSM Module connection SoftwareSerial gsmSerial(9, 10); // RX, TX pins // DHT Sensor setup #define DHTPIN 2 // Pin connected to the DHT22 sensor #define DHTTYPE DHT22 // Specify DHT22 type DHT dht(DHTPIN, DHTTYPE); // Initialize the LCD - adjust the I2C address if needed LiquidCrystal_I2C lcd(0x27, 16, 2); void setup() { Serial.begin(9600); // Start Serial communication gsmSerial.begin(115200); // Start GSM module communication dht.begin(); // Initialize DHT sensor lcd.begin(); // Initialize LCD lcd.backlight(); // Turn on LCD backlight // Display welcome message lcd.clear(); lcd.setCursor(0, 0); // First line lcd.print("Sensor Data Mon."); lcd.setCursor(0, 1); // Second line lcd.print("by technolab"); delay(3000); // Keep the message for 3 seconds // After the welcome message, proceed with initialization lcd.clear(); lcd.print("Initializing..."); delay(2000); // Delay for GSM module to initialize // Setup GSM module for SMS sendATCommand("AT+CMGF=1", "OK", 2000); // Text mode sendATCommand("AT+CNMI=1,2,0,0,0", "OK", 2000); // New SMS indication lcd.clear(); lcd.print("Getting Ready"); } void loop() { static unsigned long lastUpdate = 0; unsigned long currentTime = millis(); // Continuously display temperature and humidity every 10 seconds if (currentTime - lastUpdate > 10000) { lastUpdate = currentTime; float humidity = dht.readHumidity(); float temperature = dht.readTemperature(); lcd.clear(); lcd.setCursor(0, 0); // First line lcd.print("Updating...."); delay(500); lcd.clear(); lcd.print("Temp: "); lcd.print(temperature); lcd.print(" C"); lcd.setCursor(0, 1); // Move to second line lcd.print("Hum: "); lcd.print(humidity); lcd.print(" %"); } // Check for incoming SMS if (gsmSerial.available()) { if (gsmSerial.find("+CMT:")) { String smsCommand = gsmSerial.readString(); lcd.clear(); lcd.setCursor(0, 0); // First line lcd.print("SMS Received"); delay(500); smsCommand.toUpperCase(); // Convert command to uppercase if (smsCommand.indexOf("STATE") != -1) { float humidity = dht.readHumidity(); float temperature = dht.readTemperature(); String message = "Temp: " + String(temperature) + "C, Hum: " + String(humidity) + "%"; sendSMS(message); // Respond with temperature and humidity via SMS } } } } void sendATCommand(String command, const char* expectedResponse, unsigned long timeout) { gsmSerial.println(command); // Send the AT command long int time = millis(); while ((time + timeout) > millis()) { while (gsmSerial.available()) { if (gsmSerial.find(const_cast<char*>(expectedResponse))) { Serial.println(command + ": SUCCESS"); return; } } } Serial.println(command + "FAILED"); lcd.clear(); lcd.setCursor(0, 0); // First line lcd.print(command + "FAILED"); delay(1000); } void sendSMS(String message) { lcd.clear(); lcd.setCursor(0, 0); // First line lcd.print("Sending......"); String phoneNo = "+918543053029"; // Replace with the sender's phone number sendATCommand("AT+CMGS=\"" + phoneNo + "\"", ">", 2000); // Prepare to send SMS gsmSerial.println(message); // Send the message content delay(500); gsmSerial.write(26); // ASCII code for CTRL+Z to send the SMS Serial.println("SMS Sent: " + message); lcd.clear(); lcd.setCursor(0, 0); // First line lcd.print("Data Send"); delay(500); }
Include Libraries and Define Connections
#include <DHT.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
- <DHT.h>: Includes the library for the DHT sensor to read temperature and humidity.
- <SoftwareSerial.h>: Includes the library for software serial communication, allowing for serial communication on other digital pins of the Arduino.
- <LiquidCrystal_I2C.h>: Includes the library for controlling LCD displays that are connected via the I2C bus.
SoftwareSerial gsmSerial(9, 10); // RX, TX pins
- gsmSerial(9, 10): Creates a software serial object for communication with the GSM module using pin 9 as RX and pin 10 as TX.
Sensor and Display Setup
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
- DHTPIN and DHTTYPE: Defines pin 2 for the DHT sensor and specifies the type of DHT sensor (DHT22).
- lcd(0x27, 16, 2): Initializes the LCD object for a 16×2 display with the I2C address 0x27.
setup() Function
void setup() {
Serial.begin(9600);
gsmSerial.begin(115200);
dht.begin();
lcd.begin();
lcd.backlight();
- Initializes serial communication at 9600 baud for debugging, starts the GSM module at 115200 baud, initializes the DHT sensor, and sets up and turns on the LCD backlight.
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sensor Data Mon.");
lcd.setCursor(0, 1);
lcd.print("by technolab");
delay(3000);
- Clears the LCD display, sets the cursor, and prints a welcome message. Delays for 3 seconds before proceeding.
lcd.clear();
lcd.print("Initializing...");
delay(2000);
- Shows an initializing message as the system sets up, particularly the GSM module.
sendATCommand("AT+CMGF=1", "OK", 2000); // Text mode
sendATCommand("AT+CNMI=1,2,0,0,0", "OK", 2000); // New SMS indication
lcd.clear();
lcd.print("Getting Ready");
}
- Sends AT commands to the GSM module to set SMS text mode and configure how new SMS messages are indicated. Displays “Getting Ready”.
loop() Function
void loop() {
static unsigned long lastUpdate = 0;
unsigned long currentTime = millis();
- Defines a static variable to keep track of the last update time and checks the current time.
if (currentTime - lastUpdate > 10000) {
lastUpdate = currentTime;
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
lcd.clear();
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Hum: ");
lcd.print(humidity);
lcd.print(" %");
}
- If 10 seconds have passed since the last update, reads new temperature and humidity data, clears the LCD, and displays the new values.
SMS Handling
if (gsmSerial.available()) {
if (gsmSerial.find("+CMT:")) {
String smsCommand = gsmSerial.readString();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SMS Received");
delay(500);
smsCommand.toUpperCase();
- Checks if data is available from the GSM module. If an SMS is received (+CMT:), it reads the SMS, clears the LCD, and displays that an SMS was received.
if (smsCommand.indexOf("STATE") != -1) {
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
String message = "Temp: " + String(temperature) + "C, Hum: " + String(humidity) + "%";
sendSMS(message);
}
}
}
}
- Checks if the received SMS
Connection Diagram.
Make all the connection as per the below connection diagram.
Lets See in Action.
As soon as the system is powered up, it begins to boot. During this startup phase, an LCD screen displays a welcome message: “Sensor Data Monitoring by Technolab.” It takes a few seconds for the system to fully prepare. Once booted, the LCD continuously displays the current temperature and humidity readings. These readings are updated in real-time every 10 seconds, ensuring up-to-date environmental data.
Additionally, the system allows for remote data retrieval via SMS. To request sensor data, simply open your messaging app and send a text with the word “STATE” to the number linked to the 4G LTE module in the system. Upon receiving the request, the system sends an SMS back with the current temperature and humidity values. This process can be repeated at any time to obtain the latest readings.
This project offers a convenient and effective method to monitor environmental conditions in real time, both directly via LCD and remotely through your phone.
Video Tutorial.
That’s it for this Article. I hope you found it informative.
Thank you so much for reading.