Jag har nu börjat studera logger-shielden (LS) eftersom jag fått koden till det övriga systemet att fungera.
LS ser mycket enkel ut men jag misstänker att det kommer krävas ett mirakel om jag ska kunna få den biten att fungera.
Idag printade jag ut Adafruit's 63-sidiga manual för LS och avser studera den vid tillfälle.
Jag har också uppdaterat min kod med en abstraktionsfunktion (storeToSD) som jag inte har en susning om hur jag ska lyckas implementera.
Men i övrigt fungerar LED och dylikt nu som det ska.
LS placeras alltså ovanpå UNO mha stiftlist. Innanför stiftlisterna finns sedan via-hål för ditlödning av hylslist varvid jag kommer kunna få exakt samma HW-gränssnitt som jag har nu även med LS monterad.
Frågan är nu bara om jag kan trycka i knappcellsbatteriet för realtidsklockan (RTC) och trycka dit LS innan jag skrivit klart programvaran. Låter nästan som en löjlig fråga så det blir retoriskt ja på den
Här kommer förresten all min kod:
Kod: Markera allt
/*
Poll
*/
//int servo=13;
//int PotValue;
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
pinMode(13, OUTPUT); //output for Servo/debugging
pinMode(6, OUTPUT); //green LED for Cal
pinMode(7, OUTPUT); //red LED for memoryFull
pinMode(8, OUTPUT); //SDO for shift register
pinMode(9, OUTPUT); //CLK for shift register
// initialize the digital pin as an input.
// Pin 2&3 are connected to a button tied to GND with pullup 10K to VCC.
pinMode(2, INPUT); //input for newUser button
pinMode(3, INPUT); //input for Cal button
}
int temp;
int tempCal; //temporary calibration variable
int tempMaxForce; //used to track maxForce
int servoVar; //used for debugging
int sensor_stat;
int sensor_dyn;
int holdTime_stat;
int holdTime_dyn;
int newUser_stat;
int newUser_dyn;
int cal_stat;
int cal_dyn;
int strengthArray[500]; //array for converted samples (RAM=2kB, 1 value=10bit~2B)
int seg[8];
int ABCD[4];
char out;
int j=0; //sample counter init
int maxForce=0; //initiates maximum force to 0kg
int peakHold=0; //initiates peakHold to zero seconds.
//These three functions has been used for servo debugging.
int analogConvert(int Analog) {
return 500 + 2 * Analog;
}
int digitalConvert(int Digital) {
return 500 + 2048 * Digital;
}
void runServo(int width) {
digitalWrite(13, LOW);
delay(1);
digitalWrite(13, HIGH);
delayMicroseconds(width);
digitalWrite(13, LOW);
delay(19);
}
int actualForce(int Sample) {
return Sample; //may scale 0-1023 optionally.
}
void memoryFull(int state) {
if (state==1)
digitalWrite(7, HIGH); //green@debug
if (state==0)
digitalWrite(7, LOW);
}
void highBlink() { //._.___
digitalWrite(6, HIGH);
delay(3);
digitalWrite(6, LOW);
delay(3);
digitalWrite(6, HIGH);
delay(3);
digitalWrite(6, LOW);
}
void lowBlink() { //.___
digitalWrite(6, HIGH);
delay(10);
digitalWrite(6, LOW);
delay(1000);
digitalWrite(6, HIGH);
delay(10);
digitalWrite(6, LOW);
}
void calBlink() { //ON
digitalWrite(6, HIGH);
}
void clockPulse(){
digitalWrite(9, LOW);
delayMicroseconds(10);
digitalWrite(9, HIGH);
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(){
j=0; //resets sample counter
maxForce=0; //resets maxForce
memoryFull(0); //turns off red LED
}
// 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 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();
}
initLED();
*/
void loop () {
sensor_stat=analogRead(0);
holdTime_stat=analogRead(1);
newUser_stat=digitalRead(2);
cal_stat=digitalRead(3);
// delays 50ms to await any knob changes
delay(50);
// abs neccesary due to sampling accuracy.
holdTime_dyn=analogRead(1);
if (abs(holdTime_dyn-holdTime_stat)>2){
holdTime(holdTime_dyn);// sets holdTime
}
newUser_dyn=digitalRead(2);
if (newUser_dyn != newUser_stat){
newUser();//resets sample counter, memoryFull LED and maxForce
}
cal_dyn=digitalRead(3);
if (cal_dyn != cal_stat){
Cal();
}
// abs neccesary due to sampling accuracy.
sensor_dyn=analogRead(0);
if (abs(sensor_dyn-sensor_stat)>2){
tempMaxForce=actualForce(sensor_dyn);
if (tempMaxForce>maxForce){
maxForce=tempMaxForce;
displayTmp(maxForce); //sends maxForce to display only if new maxForce
storeToSD(maxForce);
delay(peakHold); //holds maxForce
}
maxForce=analogRead(0); //actually reads new value
displayTmp(maxForce); //sends current value to display
storeToSD(maxForce);
}
}
Bifogar även ett litet kollage.
MVH/Roger
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.