The Cloud

Work in progress, after days of working to get the separate components of the cloud working independently I now have them working together in the same arduino sketch. The components I am using are the the PIR sensor, the Wav Shield & LED Storm. My system does thus: The PIR sensor is triggered by motion > then the randomized Lightning sequence begins in a randomized cycle followed by a super lightning strike > milli seconds after the super lightning strike is a randomly selected thunder sound, the cloud then waits until the PIR is triggered again.

Lightning Cloud Test

Here is my code thus far:

#include <FatReader.h>
#include <SdReader.h>
#include <avr/pgmspace.h>
#include “WaveUtil.h”
#include “WaveHC.h”
SdReader card; // This object holds the information for the card
FatVolume vol; // This holds the information for the partition on the card
FatReader root; // This holds the information for the filesystem on the card
FatReader f; // This holds the information for the file we’re play

WaveHC wave; // This is the only wave (audio) object, since we will only play one at a time

int motion_1 = 8;
int light_1 = 13;
int led2 = 6;
int led3 = 7;
int led = 9;
int randomSound = 1;
int chooseWAV = (randomSound);
int delayTime = 201;
int flash = 31;
int randomChoose = 1;
int chooseLED = (randomChoose);
int flashTime = 1;
int sporaticCounter = 0;
int strikeCounter = 0;

// this handy function will return the number of bytes currently free in RAM, great for debugging!
int freeRam(void)
{
extern int __bss_end;
extern int *__brkval;
int free_memory;
if((int)__brkval == 0) {
free_memory = ((int)&free_memory) – ((int)&__bss_end);
}
else {
free_memory = ((int)&free_memory) – ((int)__brkval);
}
return free_memory;
}

void sdErrorCheck(void)
{
if (!card.errorCode()) return;
putstring(“\n\rSD I/O error: “);
Serial.print(card.errorCode(), HEX);
putstring(“, “);
Serial.println(card.errorData(), HEX);
while(1);
}

void setup() {
pinMode (motion_1,INPUT);
pinMode (light_1, OUTPUT);
// set up serial port
Serial.begin(9600);
putstring_nl(“WaveHC with “);
Serial.print(“NUMBUTTONS, DEC”);
putstring_nl(“buttons”);

putstring(“Free RAM: “); // This can help with debugging, running out of RAM is bad
Serial.println(freeRam()); // if this is under 150 bytes it may spell trouble!

// Set the output pins for the DAC control. This pins are defined in the library
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);

// pin13 LED
pinMode(13, OUTPUT);
pinMode(led, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);

// if (!card.init(true)) { //play with 4 MHz spi if 8MHz isn’t working for you
if (!card.init()) { //play with 8 MHz spi (default faster!)
putstring_nl(“Card init. failed!”); // Something went wrong, lets print out why
sdErrorCheck();
while(1); // then ‘halt’ – do nothing!
}

// enable optimize read – some cards may timeout. Disable if you’re having problems
card.partialBlockRead(true);

// Now we will look for a FAT partition!
uint8_t part;
for (part = 0; part < 5; part++) { // we have up to 5 slots to look in
if (vol.init(card, part))
break; // we found one, lets bail
}
if (part == 5) { // if we ended up not finding one 😦
putstring_nl(“No valid FAT partition!”);
sdErrorCheck(); // Something went wrong, lets print out why
while(1); // then ‘halt’ – do nothing!
}

// Lets tell the user about what we found
putstring(“Using partition “);
Serial.print(part, DEC);
putstring(“, type is FAT”);
Serial.println(vol.fatType(),DEC); // FAT16 or FAT32?

// Try to open the root directory
if (!root.openRoot(vol)) {
putstring_nl(“Can’t open root dir!”); // Something went wrong,
while(1); // then ‘halt’ – do nothing!
}

// Whew! We got past the tough parts.
putstring_nl(“Ready!”);

}
void loop() {
delay(100); //this delay is to let the sensor settle down before taking a reading
int sensor_1 = digitalRead(motion_1);\
if (sensor_1 == HIGH){
digitalWrite(light_1,HIGH);
Serial.print(“motiondetected”);
strikeCounter = 0;
while (strikeCounter < random (3,25)){
sporaticCounter = 0;
delayTime = random (30,5000);
flash = random (10,50);
flashTime = random (1,3);
int randomChoose = random (1,4);
if (randomChoose == 1){
chooseLED = led;
}
else if (randomChoose == 2){
chooseLED = led2;
}
else if (randomChoose == 3){
chooseLED = led3;
}
while (flashTime > sporaticCounter){
digitalWrite(chooseLED, HIGH); // turn the LED on (HIGH is the voltage level)
delay (flash);
digitalWrite(chooseLED, LOW);
delay (flash); // wait for a second
sporaticCounter = sporaticCounter + 1;
}
delay (delayTime);
strikeCounter = strikeCounter + 1;
Serial.println(strikeCounter);
}
//STORM!!!!!
putstring(“storm”);
digitalWrite(led, HIGH); // 1st Flash
delay (5);
digitalWrite(led2, HIGH);
delay (10);
digitalWrite(led3, HIGH);
delay (50);
digitalWrite(led, LOW);
digitalWrite(led2, LOW);
delay (30);
digitalWrite(led3, LOW);
delay (70);
digitalWrite(led3, HIGH); // 2nd Flash
delay (5);
digitalWrite(led2, HIGH);
delay (10);
digitalWrite(led, HIGH);
delay (50);
digitalWrite(led, LOW);
digitalWrite(led2, HIGH);
delay (30);
digitalWrite(led3, LOW);
delay (20);
digitalWrite(led, HIGH); // 3rd Flash
delay (5);
digitalWrite(led2, HIGH);
delay (10);
digitalWrite(led3, HIGH);
delay (50);
digitalWrite(led, LOW);
digitalWrite(led2, LOW);
delay (30);
digitalWrite(led3, LOW);
delay (10);
digitalWrite(led2, HIGH); // 4th Flash
delay (5);
digitalWrite(led, HIGH);
delay (10);
digitalWrite(led3, HIGH);
delay (50);
digitalWrite(led, LOW);
digitalWrite(led2, LOW);
delay (30);
digitalWrite(led3, HIGH);
delay (100);
digitalWrite(led, HIGH); // 5th Flash
delay (5);
digitalWrite(led2, HIGH);
delay (10);
digitalWrite(led3, HIGH);
delay (50);
digitalWrite(led, LOW);
digitalWrite(led2, LOW);
delay (30);
digitalWrite(led3, LOW);
delay (100);
int randomSound = random (1,9);
if (randomSound == 1){
digitalWrite(led,HIGH);
playcomplete(“01.WAV”);
putstring_nl(“DO”);
}
else if (randomSound == 2){
digitalWrite(led2, HIGH);
playcomplete(“02.WAV”);
putstring_nl(“RE”);
}
else if (randomSound == 3){
playcomplete(“03.WAV”);
putstring_nl(“MI”);
}
else if (randomSound == 3){
digitalWrite(led3, HIGH);
playcomplete(“04.WAV”);
putstring_nl(“MI”);
}
else if (randomSound == 3){
playcomplete(“05.WAV”);
putstring_nl(“MI”);
}
else if (randomSound == 3){
digitalWrite(led, HIGH);
playcomplete(“06.WAV”);
putstring_nl(“MI”);
}
else if (randomSound == 3){
;
playcomplete(“07.WAV”);
putstring_nl(“MI”);
}
else if (randomSound == 3){

playcomplete(“08.WAV”);
putstring_nl(“MI”);
}
delay(500);
digitalWrite(light_1,LOW);
digitalWrite(led,LOW);
digitalWrite(led3,LOW);
digitalWrite(led2,LOW);
delay(3000);
}
}
// Plays a full file from beginning to end with no pause.
void playcomplete(char *name) {
// call our helper to find and play this name
playfile(name);
while (wave.isplaying) {
// do nothing while its playing
}
// now its done playing
}

void playfile(char *name) {
// see if the wave object is currently doing something
if (wave.isplaying) {// already playing something, so stop it!
wave.stop(); // stop it
}
// look in the root directory and open the file
if (!f.open(root, name)) {
putstring(“Couldn’t open file “); Serial.print(name); return;
}
// OK read the file and turn it into a wave object
if (!wave.create(f)) {
putstring_nl(“Not a valid WAV”); return;
}

// ok time to play! start playback
wave.play();
}

Author: richard clarkson

New York based Designer from New Zealand.