
MVH/Roger
Kod: Markera allt
#include <Wire.h>
#include "RTClib.h"
#include <SD.h>
File myFile;
RTC_DS1307 rtc;
void setup() {
pinMode(6, OUTPUT); //green LED for Cal
pinMode(7, OUTPUT); //red LED for newUser acknowledgement
pinMode(8, OUTPUT); //SDO for shift register
pinMode(9, OUTPUT); //CLK for shift register
pinMode(10, OUTPUT); //CS for Adafruit LS
pinMode(2, INPUT); //input for newUser button
pinMode(3, INPUT); //input for Cal button
analogReference(EXTERNAL);
digitalWrite(9, LOW);//forces LED CLK to zero
delayMicroseconds(100);
initLED();//FFFF on LED for setup indication
delay(500);
Serial.begin(9600);
Wire.begin();
SD.begin(10);
//Enable these two rows for virgin RTC
//rtc.begin();
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
//generates a virgin file while newUser not being pressed
myFile = SD.open("Start.txt", FILE_WRITE);
}
int temp;
int tempCal; //temporary calibration variable
int tempMaxForce; //used to track maxForce
int sensor_stat;
int sensor_dyn;
int holdTime_stat;
int holdTime_dyn;
int newUser_stat=1;
int newUser_dyn;
int cal_stat=1;
int cal_dyn;
char filename;
char filetest;
int Seconds;
int offSet;
int NrOfSeconds;
int Year;
int Month;
int Day;
int Hour;
int Minute;
int Second;
int strengthArray[500]; //array for converted samples (RAM=2kB, 1 value=10bit~2B)
int seg[8];
int ABCD[4];
int old_stat=1;
char out;
int j=0; //sample counter init
int maxForce=0; //initiates maximum force to 0kg
int peakHold=0; //initiates peakHold to zero seconds.
int actualForce(int Sample) {
return Sample; //may scale 0-1023 optionally
}
/*
void getFileName(){
DateTime now = rtc.now();
sprintf(&filename, "%02d%02d%02d_%02d%02d%02d.txt", now.year(), now.month(), now.day(), now.hour(), now.minute(), now.second());
//sprintf(&filnamn, "test_%d.txt", 1);
}
*/
void getFileName(){
DateTime now = rtc.now();
sprintf(&filename, "%02d%02d%02d%02d.txt", now.day(), now.hour(), now.minute(), now.second());
}
void memoryFull(int state) {
if (state==1)
digitalWrite(7, HIGH); //green@debug
if (state==0)
digitalWrite(7, LOW);
}
void ackBlink() {
digitalWrite(7, HIGH);
delay(100);
digitalWrite(7, LOW);
}
void highBlink() { //._.___
digitalWrite(6, HIGH);
delay(10);
digitalWrite(6, LOW);
delay(100);
}
void lowBlink() { //.___
digitalWrite(6, HIGH);
delay(10);
digitalWrite(6, LOW);
delay(700);
}
void calBlink() { //ON
digitalWrite(6, HIGH);
}
void clockPulse(){
digitalWrite(9, LOW);
delayMicroseconds(10);
digitalWrite(9, HIGH);
delayMicroseconds(10);
digitalWrite(9, LOW);
delayMicroseconds(10);
}
int inv (int biten){
if (biten == 0)
return 1;
else
return 0;
}
void getDigit (int value){
int primA, primB, primC, primD, A, B, C, D;
primA=(value / 1000);// value=0-1023=ABCD
primB=(value / 100);
primC=(value / 10);
primD=value;
A=(primA % 10);
B=(primB % 10);
C=(primC % 10);
D=(primD % 10);
ABCD[0]=D;
ABCD[1]=C;
ABCD[2]=B;
ABCD[3]=A;
}
void decode (int digit) {
switch (digit){
case 0:
seg[0]=0;//a
seg[1]=0;//b
seg[2]=0;//c
seg[3]=0;//d
seg[4]=0;//e
seg[5]=0;//f
seg[6]=1;//g
seg[7]=1;//DP, may be replaced by a variable
break;
case 1:
seg[0]=1;//a
seg[1]=0;//b
seg[2]=0;//c
seg[3]=1;//d
seg[4]=1;//e
seg[5]=1;//f
seg[6]=1;//g
seg[7]=1;//DP, may be replaced by a variable
break;
case 2:
seg[0]=0;//a
seg[1]=0;//b
seg[2]=1;//c
seg[3]=0;//d
seg[4]=0;//e
seg[5]=1;//f
seg[6]=0;//g
seg[7]=1;//DP, may be replaced by a variable
break;
case 3:
seg[0]=0;//a
seg[1]=0;//b
seg[2]=0;//c
seg[3]=0;//d
seg[4]=1;//e
seg[5]=1;//f
seg[6]=0;//g
seg[7]=1;//DP, may be replaced by a variable
break;
case 4:
seg[0]=1;//a
seg[1]=0;//b
seg[2]=0;//c
seg[3]=1;//d
seg[4]=1;//e
seg[5]=0;//f
seg[6]=0;//g
seg[7]=1;//DP, may be replaced by a variable
break;
case 5:
seg[0]=0;//a
seg[1]=1;//b
seg[2]=0;//c
seg[3]=0;//d
seg[4]=1;//e
seg[5]=0;//f
seg[6]=0;//g
seg[7]=1;//DP, may be replaced by a variable
break;
case 6:
seg[0]=0;//a
seg[1]=1;//b
seg[2]=0;//c
seg[3]=0;//d
seg[4]=0;//e
seg[5]=0;//f
seg[6]=0;//g
seg[7]=1;//DP, may be replaced by a variable
break;
case 7:
seg[0]=0;//a
seg[1]=0;//b
seg[2]=0;//c
seg[3]=1;//d
seg[4]=1;//e
seg[5]=1;//f
seg[6]=1;//g
seg[7]=1;//DP, may be replaced by a variable
break;
case 8:
seg[0]=0;//a
seg[1]=0;//b
seg[2]=0;//c
seg[3]=0;//d
seg[4]=0;//e
seg[5]=0;//f
seg[6]=0;//g
seg[7]=1;//DP, may be replaced by a variable
break;
case 9:
seg[0]=0;//a
seg[1]=0;//b
seg[2]=0;//c
seg[3]=1;//d
seg[4]=1;//e
seg[5]=0;//f
seg[6]=0;//g
seg[7]=1;//DP, may be replaced by a variable
break;
}
}
void tmpDisplay (void){
for (int i=7; i>=0; i--){
if (seg[i] == 0) out = LOW;
else out = HIGH;
digitalWrite(8, out); // writes one segment at the time for each digit
clockPulse();
}
}
// displays value on LED
void displayTmp(int value){
getDigit(value);
decode(ABCD[0]); //decodes D
tmpDisplay(); //sends it
decode(ABCD[1]); //decodes C
tmpDisplay(); //sends it
decode(ABCD[2]);
tmpDisplay();
decode(ABCD[3]);
tmpDisplay();
}
// sensor value is somehow stored to SD
void storeSensor(int* value){
temp=value[1]; //dummy
}
// sensor value needs to be time stamped and not an array like above
void storeToSD (int value) {
temp=value; //dummy
}
// holdTime<3s
void holdTime(int value){
peakHold=value*3;
}
// newUser enables new data sequence input
void newUser(){
Serial.println("Closing File");
myFile.close();
getFileName();
Serial.println(&filename);
myFile = SD.open(&filename, FILE_WRITE);
ackBlink();
j=0;//resets sample counter
maxForce=0; //resets maxForce
}
// Cal calibrates sensor to actual reference force (5kg)
void Cal(){
tempCal=analogRead(0);//put 5kg of force before pressing Cal button
while ((tempCal>5) || (tempCal<5)) { //tune as closely as you can
if (tempCal>5) highBlink();//blinks green LED ._.___
if (tempCal<5) lowBlink();//blinks green LED .___
delay(500);//tune pot on sensor
tempCal=analogRead(0);
}
calBlink();//turns green LED on
//j=0; //resets sample counter
maxForce=0; //resets maxForce
//memoryFull(0); //turns off red LED
}
void Sensor(){
displayTmp(sensor_dyn);
//dataMonitor(sensor_dyn);
DateTime now = rtc.now();
j=j++;
if (j==1) {
offSet=now.minute()*60 + now.second();
Seconds=0;
}
if (j>1) {
Seconds=now.minute()*60 + now.second() - offSet;
}
myFile.print(Seconds);
myFile.print(' ');
//myFile.print(',');//Do not work for csv...
myFile.println(sensor_dyn);
}
void initLED (void){ //sends FFFF to display
seg[0]=0;//a
seg[1]=1;//b
seg[2]=1;//c
seg[3]=1;//d
seg[4]=0;//e
seg[5]=0;//f
seg[6]=0;//g
seg[7]=1;//DP
tmpDisplay();
tmpDisplay();
tmpDisplay();
tmpDisplay();
}
void dataMonitor(int sample){
DateTime now = rtc.now();
Serial.print(sample);
Serial.print("kg");
Serial.print(' ');
Year=now.year();
Month=now.month();
Day=now.day();
Hour=now.hour();
Minute=now.minute();
Second=now.second();
Serial.print(Year);
Serial.print('-');
Serial.print(Month);
Serial.print('-');
Serial.print(Day);
Serial.print(' ');
Serial.print(Hour);
Serial.print(':');
Serial.print(Minute);
Serial.print(':');
Serial.print(Second);
Serial.println();
}
void loop () {
sensor_stat=analogRead(0);
delay(1100);
newUser_dyn=digitalRead(2);
if ((newUser_dyn==0) && (newUser_dyn != newUser_stat)){
newUser();
}
newUser_stat=newUser_dyn;
cal_dyn=digitalRead(3);
if ((cal_dyn==0) && (cal_dyn != cal_stat)){
Cal();
}
cal_stat=cal_dyn;
sensor_dyn=analogRead(0);
if (abs(sensor_dyn-sensor_stat)>1){
Sensor();
}
}