// Arduino code
// Arduino to Excel using Gobetino
// - Arduino logs 100 values
// - Gobetwino takes these values and puts them in data.txt
// - Excel Imports this file as a csv and draws the graph
// ==========< option 1 >==========
// FIRST logs data to chip's sram, THEN sends to pc using Gobetwino
// - 1028 bytes can be stored
// - readings are taken fast this way
// ==========< option 2 >==========
// log straight to .txt with Gobetwino
// - approximately a max of 37 readings/sec , depending on the serial speed you choose
// - this way is safe (unlimited with the chips 1024 bytes of SRAM)
// ============< variables >==========
// A0 - Vcap
// D3 - button/switch (trigger)
// D4 - transisters to charge & discharge cap
// D5 - LED 1
// D6 - LED 2 const int size = 100;
// number of readings (size of array must be constant)
// don't make it too big, arduino has limited memory const float Vss = 5.0;
// if you want to be more accurate measure arduino's Vss int arrayms[size];
// an arary to store time
int arrayA0[size];
// an arary store voltage
int a;
// counter
long startTime;
void setup() {
pinMode(2, INPUT); // button
pinMode(3, OUTPUT); // pin connected to transistor bases
pinMode(4, OUTPUT); // LED 1
pinMode(5, OUTPUT); // LED 2 LED's are used to show what stage the chip is in
pinMode(6, OUTPUT); // LED 3
Serial.begin(9600);
}
void loop() {
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /* test stuff
while(digitalRead(3)){} // wait until I press pin 3 (trigger button)
while(!digitalRead(3)){}
Serial.println("#S|CPTEST|[]#"); // Use the CPTEST copy file command to make a copy of a new empty logfile
while(digitalRead(3)){} //wait until I press pin 3 (trigger button)
while(!digitalRead(3)){}
digitalWrite(3, HIGH); // start charging capacitor
delay(500); // wait 500 ms for the capacitor to charge
while(digitalRead(2)){ digitalWrite(6, HIGH); }
digitalWrite(6, LOW);
digitalWrite(4, HIGH); // LED 1 tells you the capacitor should be charged
wait_until_pin_3_is_pressed(); // ------------------------------
a=0;
startTime = millis();
digitalWrite(3, LOW); // discharge capacitor
while(a <= size ) {
arrayms[a]= millis()-startTime; // record time
arrayA0[a]= analogRead(0); // record Vcap
a++;
delay(1); // wait however ms before taking the next reading }
digitalWrite(4, LOW); // If LED 1 doesn't switch off, there is a problem in stage 1
digitalWrite(5, HIGH); // LED 2 tells you that Stage 2 is ready to start
wait_until_pin_3_is_pressed();
// ----------------------
a=0;
while(a <size){
Serial.print("#S|LOGTEST|[");
// #S -> tells gobetwino to listen
// |LOGTEST|[ -> Gobetwino runs the LOGTEST command I made,
// which opens data.txt in this app's folder
// NOTE: there must already be a data.txt in the folder
printDouble( double(arrayms[a])/1023*Vss, 3);
Serial.print(";");
printDouble( double(arrayA0[a])/1023*Vss, 3);
Serial.println("]#");
// # tells Gobetwino to stop paying attention
a++;
}
digitalWrite(5, LOW); // if LED2 doesn't switch off you're stuck in Stage 2
} // end of void loop()
// somebody elses function I found to print doubles
void printDouble( double val, byte precision){
// prints val with number of decimal places determine by precision
// precision is a number from 0 to 6 indicating the desired decimial places
// example: printDouble( 3.1415, 2);
// prints 3.14 (two decimal places) Serial.print (int(val));
//prints the int part if( precision > 0) { Serial.print(".");
// print the decimal point
unsigned long frac; unsigned long mult = 1;
byte padding = precision -1; while(precision--) mult *=10;
if(val >= 0)
frac = (val - int(val)) * mult;
else frac = (int(val)- val ) * mult;
unsigned long frac1 = frac;
while( frac1 /= 10 ) padding--;
while( padding--) Serial.print("0");
Serial.print(frac,DEC) ; } }
void wait_until_pin_3_is_pressed() {
while( !digitalRead(2) ){ }
while( digitalRead(2) ){ }
}