Hello,

 

Today I would like to share with you my second little project. Its an Arduino temperature logger which saves data on micro SD card and thanks to a short Python script it can also send data to Ubidots IOT application. The circuit itself is very simple, in order to complete it all you need is:

 

11 - jumper wires

1 - 4.7K ohm resistor

1 - DS18B20 temperature sensor

1 - SD card reader

1 - Arduino UNO

 

Here's the circuit's schematic:

 

Arduino SD card temperature logger

Here's a video showing how assemble the circuit:

 

Arduino sketch for this project:

#include <OneWire.h> //library for communication with temperature sensor
#include <DallasTemperature.h> //temperature sensor library
#include <SD.h> //sd card reader library available in every Arduino IDE
#include <SPI.h> //library for communication with SD card reader

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

File logs;  // variable responsible for writing to file 
float temp; //variable storing the current temperature
int number = 0; //variable holding the number indicating current entry in csv file

unsigned int hour = 20; //variable storing current hour
unsigned int minute = 45; //variable storing current minute 
unsigned int day = 2; //variable storing current day of the week
unsigned int date = 15; //variable storing current day of the month 
unsigned int month = 12; //variable storing current month
unsigned int year =  2015; //variable storing current year

unsigned int leap_year = 0; //variable for checking whether it's a leap year or not

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

void setup(void)
{
  // start serial port
  Serial.begin(9600);
  SD.begin(10);
  // Start up the library
  sensors.begin();
} //end of void setup

void loop(void)
{ 
  //checking whether it's leap year or not
  if (year % 4 == 0)
  leap_year = 1;
  else
  leap_year = 0;
  
  
  //changing minutes
  if (minute < 55)
  minute +=5;
  else
  minute = 0;
  
  //changing hour
  if ((minute == 0) && (hour < 24))
  hour++;
  if ((minute == 0) && (hour == 24))
  hour = 0;
  
  //changing day of the week
  if((minute == 0) && (hour == 0) && (day <8))
  day +=1;
  if((minute == 0) && (hour == 0) && (day == 8))
  day = 1;
  
  //changing day of the month  
  //formula for 30 day months
  if ((date < 31) && ( (month == 4) || (month == 6) || (month == 9) || (month == 11)) && (hour == 0) && (minute ==0))
  {
   date++; 
  }
  if ((date == 31) && ( (month == 4) || (month == 6) || (month == 9) || (month == 11)) && (hour == 0) && (minute ==0))
  {
   date = 0;
   month++; 
  }
  
  //formula for February 
  if ( ((date < 29) && (month == 2) && (hour == 0) && (minute == 0) && (leap_year == 0)) || ((date < 30) && (month == 2) && (hour == 0) && (minute == 0) && (leap_year == 1)) )
  {
   date = date +1; 
  }
  if ( (date == 29) && (month == 2) && (hour == 0) && (minute == 0) && (leap_year == 0) || ((date == 30) && (month == 2) && (hour == 0) && (minute == 0) && (leap_year == 1)) )
  {
   date = 0;
   month = 3;
  }
  
  //formula for 31 day months
  if ((date < 32) && ( (month == 1) || (month == 3) || (month ==5) || (month == 7) || (month == 8) || (month == 10) || (month == 12)) && (hour == 0) && (minute ==0))
  {
    date++;
  }
  if ((date == 32) && ( (month == 1) || (month == 3) || (month ==5) || (month == 7) || (month == 8) || (month == 10) || (month == 12)) && (hour == 0) && (minute ==0))
  {
   date = 1;
   if(month <12)
   month++; 
   else
   month = 1;
  }
  
  
  //changing year
  if( (hour == 0) && (minute == 0) && (date == 1) && (month == 1))
  year++;
  
  
  sensors.requestTemperatures(); // Send the command to get temperatures
  temp =  sensors.getTempCByIndex(0); //assigning sensor's vale to the variable
  Serial.println(temp);
  
  
  logs = SD.open("logs.csv", FILE_WRITE); //assigning file to which we want to write the data
  if(logs) //if opening of the file was successful
  {
    
   if (number == 0)
   logs.println("sep=,"); //we add this line to the file so that excel 2013 and newer software knows that this is coma separated file
   
   //then we write entry number, date and sensor read
   logs.print(number);
   logs.print(",");
   
   logs.print(temp); //finally we add temperature read from sensor
   logs.print(",");
   
   if (hour < 10)
   logs.print("0"); //we add 0 is hour is lower than 10
   logs.print(hour);
   logs.print(":");
   if(minute <10) 
   logs.print("0"); //we add 0 if minute is lower than 10
   logs.print(minute);
   logs.print(" ");
   
   switch(day) //we add day of the week appropriately
   {
    case 1:
     logs.print("Monday");
     break;
    case 2:
     logs.print("Tuesday");
     break;
    case 3:
     logs.print("Wednesday");
     break;
    case 4:
     logs.print("Thursday");
     break;
    case 5:
     logs.print("Friday");
     break;
    case 6:
     logs.print("Saturday");
     break;
    case 7:
     logs.print("Sunday");
     break;
   }
   logs.print(" ");
   logs.print(date);
   logs.print(" ");
   
   switch(month)
   {
    case 1:
     logs.print("January");
     break;
    case 2:
     logs.print("February");
     break;
    case 3:
     logs.print("March");
     break;
    case 4:
     logs.print("April");
     break;
    case 5:
     logs.print("May");
     break;
    case 6:
     logs.print("June");
     break;
    case 7:
     logs.print("July");
     break;
    case 8:
     logs.print("August");
     break;
    case 9:
     logs.print("September");
     break;
    case 10:
     logs.print("October");
     break;
    case 11:
     logs.print("November");
     break;
    case 12:
     logs.print("December");
     break;
   }
   
   logs.print(" ");
   logs.println(year); //printing year to the file
   Serial.println("Saving successful");
   logs.close();//we close and save the file
  }
  logs.flush();
  
  
  delay(300000); // we delay program for 5 minutes and then take another read
  //delay(60000); //for testing purposes 1 minute
  //delay(2000);//for testing purposes 2 seconds
  number = number + 1; // we add 1 to the entry counter
}

 

Python script which allows communication between Arduino and Ubidots application:

from ubidots import ApiClient #importing ubidots api
from time import * #importing standard time library
import serial #importing pyserial library

api = ApiClient ('your_account_key') #key of our ubidots account
ser = serial.Serial('COM6', 9600, timeout = 0) #establishing communication with Arduino serial port

temp_val = api.get_variable('your_variable_key') #ubidots variable's key with which we want to communicate


while True:
    current_temp = ser.readline(6) #reading first 6 characters from serial port
    if ( (current_temp[:1] == '-')or(current_temp[:1] == '1') or (current_temp[:1] == '2') or (current_temp[:1] == '3') or (current_temp[:1] == '4') or (current_temp[:1] == '5') or (current_temp[:1] == '6') or (current_temp[:1] == '7') or (current_temp[:1] == '8') or (current_temp[:1] == '9') ):
            
            float_current_temp = float(current_temp[:5]) #converting value read from the serial port a float
            new_value = temp_temp.save_value({'value':float_current_temp}) #sending value to ubidots
            print ("sending successful")

 

Video explaining Arduino sketch and Python script, as well as providing introduction to Ubidots:

 

Please comment. Any feedback is very valuable for me, especially constructive criticism. If you like what I'm doing you can subscribe my channel on YouTube (https://www.youtube.com/user/W0j45), follow me on Twitter (https://twitter.com/milczarekw) and Instagram (https://www.instagram.com/milczarekw/).

 

Thank you for reading!