$15 Datalogger using Arduino Micro-controller
Enclosed: All the Arduino datalogger code
Parts Required:
- Arduino UNO,
- SD Memory Shield
- Video Tutorial uses a more expensive version, the alternate selected has a different pin-out sequence
- Datasheet
- Micro-SD Flash,
- 9v Battery & connectors,
- USB programming cable,
- Arduino Proto Shield,
- & whatever sensors/actuators selected
- Book: "Make: Sensors: A Hands-On Primer for Monitoring the Real World with Arduino and Raspberry Pi"
Note: If your Arduino Uno datalogger works fine on USB power, but fails when on battery or external power, change the value of R12 from 1k to 10k. A known feedback condition may be corrupting the initialization process. Schematic
Also enclosed below are video tutorials that allow for understanding the code to create a datalogger. Many micro-SD card shields exist for as little as about $1.50 (USD). The tutorial uses a different version than the one used by us. SD card shields (circuit boards) and SD memory cards.
As instructors, you can choose whether to teach coding, just assemble the datalogger, or some combination.
Recommendation if teaching coding: teach how to set up small amounts of code and check usefulness, save incremental versions, and add tested code in pieces. Back up incremental accomplishments. That way one problem is being solved at a time, and not working on 10 simultaneous problems; usually syntax errors.
Use // to comment out code that is working, to debug code
When starting from scratch, the four layers of coding:
- Details, objectives, correlations, description of sequences, anticipated restrictions, and risks all written in English;
- Flow Chart and/or State Diagram to reflect written English;
- Pseudo-code (ends up driving code comments); &
- Syntax Correct code
followed by:
entering code
testing, and
debugging
All tutorials are added for completeness. But the main ones for the datalogger are: start with 11, then 1, 3, 6, 7, 8, & repeat 11
In one class period (or homework assignment) the students can read through everything needed to make a datalogger. With 10% expected uptake. Hands-on practiced experience is needed to correlate the conveyed information effectively.
An important aspect is to as much as practical, have the students learn "how" to solve their own problems. The act of getting practices experience in problem solving better prepares them for actual life experiences.
The students can then at your option write and implement code based upon tutorials, or just build the datalogger and explore other class efforts.
For explanations:
SD.h library reference http://arduino.cc/en/Reference/SD
Wire.h library reference http://arduino.cc/en/Reference/wire
Tutorials at times use a software called "Processing". The more advanced code editor for Arduino; free from
https://www.processing.org/download/
select "no donation" to download
"Processing" code (Arduino code is based on Processing code) uses .pde file extensions and contains the code in text format.
Each of the Video tutorials has a related download page for the related code, to minimize making typos.
"Arduino" automatically includes libraries, while "Processing" requires "Import" of every library used.
Arduino Free Software Downloads: www.Arduino.cc ; all parts can be purchased on eBay (~$15 total)
Tutorial 01 for Arduino: Getting Acquainted with Arduino
http://www.youtube.com/watch?v=fCxzA9_kg6s
Tutorial 02 for Arduino: Buttons, PWM, and Functions
http://www.youtube.com/watch?v=_LCCGFSMOr4
Tutorial 03 for Arduino: Electrical Engineering Basics
http://www.youtube.com/watch?v=abWCy_aOSwY
Tutorial 04 for Arduino: Analog Inputs
http://www.youtube.com/watch?v=js4TK0U848I
Tutorial 05 for Arduino: Motors and Transistors
http://www.youtube.com/watch?v=5bHPKU4ybHY
Tutorial 06 for Arduino: Serial Communication and Processing
http://www.youtube.com/watch?v=g0pSfyXOXj8
Tutorial 07 for Arduino: I2C Communication and Processing
http://www.youtube.com/watch?v=GJX0BRUagCg
Tutorial 08 for Arduino: SPI Interfaces
http://www.youtube.com/watch?v=1nO2SSExEnQ
Tutorial 09 for Arduino: Wireless Communication
http://www.youtube.com/watch?v=vKVNmA8C6m8
Tutorial 10 for Arduino: Interrupts and Hardware Debouncing
http://www.youtube.com/watch?v=CRJUdf5TTQQ
Tutorial 11 for Arduino: SD Cards and Datalogging
http://www.youtube.com/watch?v=5v5A3j7Rrco
Tutorial 12 for Arduino: RFID Card Reading
http://www.youtube.com/watch?v=gIlSLwcbeTU
Tutorial 13 for Arduino: Liquid Crystal Displays (LCDs)
http://www.youtube.com/watch?v=oIiDseJO4dM
Tutorial 14 for Arduino: Holiday Lights and Sounds Spectacular!
http://www.youtube.com/watch?v=CoG_Czyr7z0
Tutorial 15 for Arduino: GPS Tracking
http://www.youtube.com/watch?v=TtZEZYQG0xk
Actual Code to Use with specified Calatex SD Card Adapter
//Program by Jeremy Blum
//www.jeremyblum.com
//SD Card Demonstration
//Some code from public domain work by Tom Igoe
//Some code modified by James Dunn
#include <SD.h> //SD Card Library
#include <Wire.h> //I2C Library
//SPI SD Card Pins
//MOSI = Pin 11
//MISO = Pin 12
//SCLK = PIN 13
int CS_pin = 10;
int pow_pin = 8;
//I2C Temperature Pins
//SDA = Analog Pin 4
//SCL = Analog Pin 5
//IR Distance Sensor Pins
int IR1_pin = 2;
int IR2_pin = 3;
//Light Sensor Pins
int light_pin = 1;
float refresh_rate = 0.0; //Dataloger Refresh Rate
int temp_address = 72; //Address of the I2C Temp Sensor
long id = 1; //Use this to store the id # of our reading.
void setup()
{
Wire.begin();
Serial.begin(9600);
Serial.println("serial set at 9600 baud");
//CS Pin is an output
pinMode(CS_pin, OUTPUT);
Serial.println("CS_pin set as OUTPUT");
//SD Card will Draw Power from Pin 8, so set it high
pinMode(pow_pin, OUTPUT);
digitalWrite(pow_pin, HIGH);
Serial.println("pow-pin 8 set as OUTPUT and HIGH");
//Initialize SD Card with CS_pin = 10
if (!SD.begin(CS_pin))
{
Serial.println("Card Failure - CS_pin 10 no signal");
return;
}
Serial.println("Card Ready - Signal on CS_pin 10");
//Create configuration file COMMANDS.txt
File commandFile = SD.open("COMMANDS.txt", FILE_WRITE);
commandFile.write(1000);
commandFile.close();
//Read the Configuration information (COMMANDS.txt)
commandFile = SD.open("COMMANDS.txt", FILE_READ);
if (commandFile)
{
Serial.println("Read from COMMANDS File");
float decade = pow(10, (commandFile.available() - 1));
while(commandFile.available())
{
float temp = (commandFile.read() - '0');
refresh_rate = temp*decade+refresh_rate;
decade = decade/10;
}
Serial.print("Refresh Rate = ");
Serial.print(refresh_rate);
Serial.println("ms");
}
else
{
Serial.println("Could not read command file.");
return;
}
commandFile.close();
Serial.println("close command file");
//Write Log File Header
File logFile = SD.open("LOG.csv", FILE_WRITE);
Serial.println("opened LOG.csv file");
if (logFile)
{
logFile.println(", , , ,"); //Just a leading blank line, in-case there is previous data
String header = "ID, Light, Temp, IR1, IR2";
logFile.println(header);
Serial.println("wrote this header to LOG.csv: ");
Serial.println(header);
}
else
{
Serial.println("Couldn't open LOG.csv file");
}
}
void loop()
{
//Check Light Level
int light_level = analogRead(light_pin);
/* uncomment this section if using related temperature IC chips
//Read Temperature
Wire.beginTransmission(temp_address); //Start talking
Wire.write(0);//Ask for Register zero
Wire.endTransmission(); //Complete Transmission
Wire.requestFrom(temp_address, 1); //Request 1 Byte
while(Wire.available() == 0); //wait for response
int temp_c = Wire.read(); // Get the temp
int temp_f = round(temp_c*9.0/5.0 +32.0); //Convert from Celcius to Fahrenheit
*/
int temp_f = round(32.0); // delete this line if using related temperature IC chips
//Read Distances
int IR1_val = analogRead(IR1_pin);
int IR2_val = analogRead(IR2_pin);
//Create Data string for storing to SD card
//using CSV Format
String dataString = String(id) + ", " + String(light_level) + ", " + String(temp_f) + ", " + String(IR1_val) + ", " + String(IR2_val);
//Open a file to write to
//Only one file can be open at a time
File logFile = SD.open("LOG.csv", FILE_WRITE);
if (logFile)
{
logFile.println(dataString);
Serial.println(dataString);
}
else
{
Serial.println("Couldn't open log file");
}
logFile.close();
//Increment ID number
id++;
delay(refresh_rate);
}
Comments (0)
You don't have permission to comment on this page.