Arduino Entesla SensIO Shield Programming
SensIO is a sensor and I/O shield for Arduino and compatible boards. It has an on-board RGB LED, Light Dependent Resistor (LDR),IR proximity sensor pair for measuring distance from an obstacle in close proximity, a Potentiometer as analog Input, a Temperature Sensor, a Buzzer, a Push Button for digital inputs and a 3-axis MMA7455 accelerometer for Motion sensing along all the three axis.
This sensor shield is ideal for sensing and interacting with real-world physical parameters like light, temperature, sound and motion.
Here is the Arduino Uno Code to go along with Entesla SensIO Shield.
/*
Arduino Entesla SensIO Shield Prototyping,V2.0. Nitin William 01/01/2014
Wire.h Library from Aruduino.cc
MMA_7455 Library, Moritz Kemper, IAD Physical Computing Lab moritz.kemper@zhdk. ch ZHdK, 20/11/2011
This example code is in public domain.
References:
http://entesla.com/addons/arduino-sensor-shield
http://www.instructables.com/id/Guide-to-gyro-and-accelerometer-with-Arduino-inclu/
http://theccontinuum.wordpress.com/2012/09/24/arduino-imu-pitch-roll-from-accelerometer/
*/
#include <Wire.h>// Include the Wire library
#include <MMA_7455.h>// Include the MMA_7455 library
#include <Button.h>// Include the Button library
const byte ledPin = 13;// Select the pin for the On Board LED
const byte redPin = 11;// Select the pin for RGB
const byte greenPin = 10;// Select the pin for RGB
const byte bluePin = 9;// Select the pin for RGB
const byte buttonPin1 = 12;// Select pin for Button1
const byte buttonPin2 = 8;// Select pin for Button2
const byte buttonPin3 = 7;// Select pin for Button3
const byte buttonPin4 = 4;// Select pin for Button4
const byte buzzerPin = 6;// Select pin for Pizzeo buzzer
const byte tempPin = A0;// LM35 pin
const byte ldrPin = A1;// Select the input pin for LDR
const byte irPin = A2;// Select the input pin for IR Obstacle detector
const byte potPin = A3;// Select the input pin for Potentiometer
const float alpha = 0.5; // Constant for LPF
char xLPF, yLPF, zLPF;// Variable of filtered x,y,z values from MMA 7455
char xVal, yVal, zVal; //Variables for the values from the sensor
int lux;// Define variable for light intensity
int irSense;// Define variable to store IR reading
int timer1_counter;// Timer1 counter
int heatValue;// Define variable to store LM35 reading
int potValue;// Variable to store the value coming from the sensor
float tempC;// Temperature reading
float voltageRead;// Define variable to store ADC reading
float roll;// Define variable to store roll
float pitch;// Define variable to store pitch
MMA_7455 accSensor = MMA_7455();// Make an instance of MMA_7455
Button button1 = Button (buttonPin1, PULLUP);// Create Button Object as input with internal pullup resistors
Button button2 = Button (buttonPin2, PULLUP);// Create Button Object as input with internal pullup resistors
Button button3 = Button (buttonPin3, PULLUP);// Create Button Object as input with internal pullup resistors
Button button4 = Button (buttonPin4, PULLUP);// Create Button Object as input with internal pullup resistors
void setup()
{
noInterrupts();// Disable interrupts
pinMode(ledPin, OUTPUT);// Declare On Board LED as an output
pinMode(buzzerPin, OUTPUT);// Declare Buzzer as an output
pinMode(redPin, OUTPUT);// Delcare Red LED as an output
pinMode(greenPin, OUTPUT);// Delcare Green LED as an output
pinMode(bluePin, OUTPUT);// Delcare Blue LED as an output
pinMode(potPin, INPUT);// Declare Pot pin as input
pinMode(tempPin, INPUT);// Delcare LM35 pin as input
pinMode(ldrPin, INPUT);// Declare LDR as an input
pinMode(irPin, INPUT);// Declare IR as an input */
interrupts();// Enable all interrupts
accSensor.initSensitivity(2);// Set the sensitivity you want to use, 2 = 2g, 4 = 4g, 8 = 8g
accSensor.calibrateOffset(17,31,0);// Calibrate to read 0,0,64 when board is horizontal and at rest
Serial.begin(9600);// Initialize serial communications at 9600 bps
Serial.println("Arduino UNO R3...Running(16Mhz)");// Display Arduino
Serial.println("With Entesla SensIO Shield - De VU3GAO");// Display SensIO
}
void loop()
{
for (int i=0; i <= 500; i++)
{
sensIO ();
if (button1.uniquePress()) buttonpress ();// Test button 1
if (button2.uniquePress()) buttonpress ();// Test button 2
if (button3.uniquePress()) buttonpress ();// Test button 3
if (button4.uniquePress()) buttonpress ();// Test button 4
if (irSense > 600 ) alarm ();// Read ir Diode
}
Serial.println ("Dumping Sensor Status on Serial RS232 link ");// Display message
Serial.print ("Measured Voltage (V):");// Display lable
Serial.println (voltageRead);// Display measured volts
Serial.print ("Measured Temperature (Deg C):");// Display lable
Serial.println (tempC);// Display temperature
Serial.print("Roll (Deg):");
Serial.print(roll);
Serial.print("\t");
Serial.print("Pitch (Deg):");
Serial.println(pitch);
switch (lux)
{
case 0:
Serial.println("Bright");
break;
case 1:
Serial.println("Illuminated");
break;
case 2:
Serial.println("Dark");
break;
}
if (tempC < 20.00 )
{
digitalWrite (redPin, HIGH);
digitalWrite (greenPin, HIGH);
digitalWrite (bluePin, LOW);
}
if ((tempC > 20.00) && (tempC < 30.00))
{
digitalWrite (redPin, HIGH);
digitalWrite (greenPin, LOW);
digitalWrite (bluePin, HIGH);
}
if (tempC > 30.00)
{
digitalWrite (redPin, LOW);
digitalWrite (greenPin, HIGH);
digitalWrite (bluePin, HIGH);
}
}
void sensIO ()
{
potValue = analogRead(potPin);// Read Pot
heatValue = analogRead(tempPin);// Read LM35M
lux = map(analogRead(ldrPin), 0, 700, 0, 2);// Read LDR, map value between 0-2
tempC = heatValue*(500.0/1024.0);// Convert to Deg Celcius
voltageRead = potValue*(5.0/1024.0);// Compute Voltage from ADC Reading
irSense = analogRead(irPin);// Read IR proximity sensor
xVal = accSensor.readAxis('x'); //Read out the 'x' Axis
yVal = accSensor.readAxis('y'); //Read out the 'y' Axis
zVal = accSensor.readAxis('z'); //Read out the 'z' Axis
xLPF = xVal * alpha + (xLPF * (1.0 - alpha));// Low Pass Filter
yLPF = yVal * alpha + (yLPF * (1.0 - alpha));// Low Pass Filter
zLPF = zVal * alpha + (zLPF * (1.0 - alpha));// Low Pass Filter
roll = (atan2(-xLPF,zLPF)*180.0)/M_PI;// Calculate roll in degrees
pitch = (atan2(-yLPF,zLPF)*180.0)/M_PI;// Calculate pitch in degrees
}
void alarm ()
{
digitalWrite(buzzerPin, HIGH);
digitalWrite(redPin, LOW);
delay(100);
digitalWrite(redPin, HIGH);
digitalWrite(buzzerPin, LOW);
}
void buttonpress ()
{
digitalWrite(ledPin, HIGH);
delay (50);
digitalWrite(ledPin, LOW);
}