Hur använda Arduino UNO för att sampla och lägga i databas?

Planering och tankar kring eventuella framtida projekt.
Användarvisningsbild
Spisblinkaren
EF Sponsor
Inlägg: 12990
Blev medlem: 13 december 2012, 21:41:43

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Inlägg av Spisblinkaren »

Här är sedan hela programmet :D

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();
  }
}
  
 
Användarvisningsbild
Spisblinkaren
EF Sponsor
Inlägg: 12990
Blev medlem: 13 december 2012, 21:41:43

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Inlägg av Spisblinkaren »

Rolig bonus-finess :D

MVH/Roger
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Spisblinkaren
EF Sponsor
Inlägg: 12990
Blev medlem: 13 december 2012, 21:41:43

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Inlägg av Spisblinkaren »

En kul video.

Jag har nu kodat upp hela det hexadecimala alfabetet (plus lite till).

Det är emellertid inte bara lek för dels får jag kodningen bekräftad, dels sätter jag enheten till 0000 när den går in i snurran.

Bifogar också det senaste simulerade styrke-testet (där jag bara behövde tala om för min kära gamla Excel-97 att den skulle använda blanksteg vid öppnandet av txt-filen).

Mycket nöje!

MVH/Roger

Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Skriv svar