Cold storage monitoring using a temperature alert system with a GSM module ensures perishable produce remains within safe temperature ranges even during power failures and remote storage scenarios. India loses an estimated Rs 92,000 crore of agricultural produce annually due to inadequate cold chain infrastructure. This guide covers building a reliable cold storage monitoring system with DS18B20 temperature sensors, Arduino, and SIM800L GSM module for SMS alerts.
Table of Contents
- Cold Chain Challenges in India
- Temperature Sensor Selection
- Components Required
- Circuit and Wiring
- Arduino GSM Alert Code
- Multi-Zone Monitoring
- Power Backup and Failsafe Design
- Frequently Asked Questions
Cold Chain Challenges in India
India’s cold storage capacity (37 million MT) is severely insufficient for its 300+ million MT of perishable production. Key challenges include:
- Frequent power outages in rural areas — average 4-6 hours/day in many states
- No real-time temperature alerts — staff discover failures hours after the fact
- Single-zone monitoring — hotspots within large chambers go undetected
- Refrigeration compressor failures go unnoticed during nights and weekends
- Regulations: FSSAI requires temperature logs for food safety compliance
An SMS-based monitoring system provides reliable alerts without internet dependency, critical in rural areas with poor WiFi but good 2G/3G coverage.
Temperature Sensor Selection
For cold storage (typically -25 degrees C to +10 degrees C), choose appropriately:
- DS18B20: Digital 1-Wire, -55 to +125 degrees C, accuracy ±0.5 degrees C. Ideal for multi-point monitoring as multiple sensors share a single wire.
- BME280: -40 to +85 degrees C, also measures humidity — useful for monitoring defrost cycles
- PT100/PT1000 RTD: Industry standard for -200 to +600 degrees C, requires MAX31865 interface chip, highest accuracy (±0.1 degrees C)
- SHT10: Temperature + humidity, suitable for blast freezer monitoring
Components Required
Related Products from Zbotic
- GY-BME280 Temperature and Humidity Sensor — for ambient monitoring in entry areas
- GY-BME280 5V variant — for 5V Arduino systems
Complete parts list:
- Arduino Uno or Nano
- SIM800L GSM module (with 2G SIM card — BSNL/Airtel 2G works in rural areas)
- 4.7k ohm resistor (DS18B20 pullup)
- 4x DS18B20 waterproof temperature probes (with 3m cable for cold room reach)
- DS3231 RTC module (for timestamped logs)
- MicroSD card module (for local data logging)
- 12V 7Ah sealed lead-acid battery (backup power)
- 12V to 5V DC-DC buck converter
- Buzzer (local alarm)
- LED indicators (red/green)
Circuit and Wiring
Connection summary:
- All DS18B20 data lines -> Arduino D2 (1-Wire bus, shared via single wire + 4.7k pullup to 5V)
- SIM800L TX -> Arduino D10 (SoftwareSerial RX)
- SIM800L RX -> Arduino D11 (via 1k voltage divider to protect 2.8V SIM800L)
- SIM800L VCC -> 4.2V (use 4xAA batteries or dedicated 4.2V LiPo — NOT 5V Arduino pin)
- DS3231 SDA -> Arduino A4, SCL -> A5
- SD card module: CS -> D4, MOSI -> D11, MISO -> D12, SCK -> D13
- Buzzer -> D7, Red LED -> D8, Green LED -> D9
SIM800L is notorious for voltage sensitivity. Power it from a dedicated source capable of 2A peak (needed during GSM transmission). Use a 1000uF capacitor across SIM800L VCC/GND to stabilise during TX bursts.
Arduino GSM Alert Code
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <RTClib.h>
#include <SD.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
SoftwareSerial gsm(10, 11); // RX, TX
RTC_DS3231 rtc;
// Alert thresholds for cold storage
const float TEMP_MAX_ALARM = 4.0; // Above this = alert (e.g., potato cold store)
const float TEMP_MIN_ALARM = -1.0; // Below this = alert (prevent freezing)
const float SENSOR_FAIL_VAL = -127.0; // DS18B20 returns this on failure
// Phone numbers to alert
String alertNumbers[] = {"+919876543210", "+919876543211"};
int numRecipients = 2;
bool alarmActive = false;
unsigned long lastSMSTime = 0;
const unsigned long SMS_COOLDOWN = 900000UL; // 15 min between repeat alerts
void sendSMS(String number, String message) {
gsm.println("AT+CMGF=1"); // Text mode
delay(500);
gsm.println("AT+CMGS="" + number + """);
delay(500);
gsm.print(message);
gsm.write(26); // Ctrl+Z to send
delay(3000);
Serial.println("SMS sent to " + number);
}
void sendAlertAll(String message) {
for (int i = 0; i < numRecipients; i++) {
sendSMS(alertNumbers[i], message);
delay(2000);
}
}
String getTimestamp() {
DateTime now = rtc.now();
char buf[20];
sprintf(buf, "%02d/%02d/%04d %02d:%02d", now.day(), now.month(), now.year(), now.hour(), now.minute());
return String(buf);
}
void logToSD(float temps[], int count) {
File logFile = SD.open("coldlog.csv", FILE_WRITE);
if (logFile) {
logFile.print(getTimestamp());
for (int i = 0; i < count; i++) {
logFile.print(",");
logFile.print(temps[i], 1);
}
logFile.println();
logFile.close();
}
}
void setup() {
Serial.begin(9600);
gsm.begin(9600);
sensors.begin();
rtc.begin();
SD.begin(4);
pinMode(7, OUTPUT); // Buzzer
pinMode(8, OUTPUT); // Red LED
pinMode(9, OUTPUT); // Green LED
// Init GSM
delay(2000);
gsm.println("AT");
delay(1000);
gsm.println("AT+CMGF=1");
delay(500);
Serial.println("Cold Store Monitor Ready");
Serial.print("Sensors found: ");
Serial.println(sensors.getDeviceCount());
}
void loop() {
sensors.requestTemperatures();
delay(750);
int sensorCount = sensors.getDeviceCount();
float temps[8];
bool hasAlarm = false;
String alarmMsg = "COLD STORE ALERTn" + getTimestamp() + "n";
for (int i = 0; i < sensorCount; i++) {
temps[i] = sensors.getTempCByIndex(i);
if (temps[i] == SENSOR_FAIL_VAL) {
alarmMsg += "Zone " + String(i+1) + ": SENSOR FAILn";
hasAlarm = true;
} else if (temps[i] > TEMP_MAX_ALARM) {
alarmMsg += "Zone " + String(i+1) + ": " + String(temps[i], 1) + "C HIGH!n";
hasAlarm = true;
} else if (temps[i] < TEMP_MIN_ALARM) {
alarmMsg += "Zone " + String(i+1) + ": " + String(temps[i], 1) + "C LOW!n";
hasAlarm = true;
} else {
Serial.println("Zone " + String(i+1) + ": " + String(temps[i], 1) + "C OK");
}
}
logToSD(temps, sensorCount);
if (hasAlarm && (millis() - lastSMSTime > SMS_COOLDOWN)) {
alarmMsg += "Check refrigeration immediately!";
sendAlertAll(alarmMsg);
lastSMSTime = millis();
alarmActive = true;
digitalWrite(7, HIGH); // Buzzer
digitalWrite(8, HIGH); // Red LED
digitalWrite(9, LOW);
} else if (!hasAlarm) {
alarmActive = false;
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, HIGH); // Green LED
}
delay(300000); // Check every 5 minutes
}
Multi-Zone Monitoring
A single DS18B20 1-Wire bus supports up to 127 sensors on one Arduino pin. For a large cold store:
- Place sensors at top, middle, and bottom of each chamber (temperature stratification in cold stores can be 2-5 degrees C)
- Label each sensor by its unique 8-byte ROM address (printed in setup)
- Create zone profiles: “potato” (2-4 degrees C), “apple” (0-1 degrees C), “frozen” (-18 degrees C)
- Log data every 5 minutes to SD card for FSSAI compliance records
Power Backup and Failsafe Design
Power outages are the most common cold chain failure cause. Design for resilience:
- 12V 7Ah sealed lead-acid battery provides 8-12 hours backup for Arduino + GSM
- Auto-send SMS on power restoration: detect 5V supply drop via voltage divider on A0
- Daily “all OK” heartbeat SMS at 8am to confirm system is alive
- Watchdog timer in Arduino code to auto-reset on software hang
Frequently Asked Questions
Which 2G SIM card works best for rural cold storage alerts?
BSNL has the widest 2G coverage in rural India. Airtel and Jio also provide good coverage. Use a prepaid SIM with validity top-up plan. Disable mobile data to reduce monthly cost — SMS-only uses less than Rs 10/month for alert systems.
Can I monitor freezer temperature at -25 degrees C?
Yes. DS18B20 is rated to -55 degrees C. Use stainless steel probe variants (not basic black plastic) for frozen storage. Seal the cable entry point into the freezer with foam or silicone to prevent ice buildup around the cable gland.
How do I store temperature logs for FSSAI audit compliance?
Log every 30 minutes to SD card in CSV format with timestamp. Monthly, copy the SD card data to a PC and back up to cloud. FSSAI requires 2-year data retention for licensed cold storage facilities.
What happens if the SIM card loses signal?
Add a “heartbeat” check: if no SMS can be sent after 3 attempts, sound the local buzzer continuously. Also check GSM signal strength (AT+CSQ command) and log to serial. Place a repeater antenna if signal is consistently below 12 dBm.
Add comment