Tämänhetkinen järjestelmä sisältää
Colinen henkilövaaka
http://www.clasohlson.com/fi/Henkil%C3%B6vaaka-Coline/Pr341551000 Arduino Mega 2560
http://arduino.cc/en/Main/ArduinoBoardMega2560Transistori
Pari vanerilevyä
Tarkoituksemme on siis lukea arduinon avulla henkilövaa'an mittaamia arvoja ja mielestämme helpoin ratkaisu on lukea lcd-näytölle meneviä signaaleja, samalla tavoin kuin Dušan Stojković teki blogissaan. Siirtämällä piirilevyn ja näytön välissä olevaa kontaktiliuskaa saimme määriteltyä mitkä levyn pinneistä vaikuttivat mihinkin näytön segmenttiin.
Onneksemme piirilevyssä oli testipaikat jokaiselle näyttöön menevälle pinnille, joten "vakoilujohdot" oli helppo juottaa kiinni. Juotimme kaikkiaan 19 johtoa vaa'an piirilevyyn: 15 johtoa näytön lukemiseen, 2 johtoa syöttääksemme virtaa ja 2 johtoa vaa'an kontrolloimiseen. Antureilta tulevat johdot oli tehdasjuotettu melko heikosti, joten niitä piti jatkuvasti korjailla. Varovaisuudella säästää aikaa
Testatessamme järjestelmää, huomasimme että vaa'an yksiköiden vaihtamiseen tarkoitettu nappi myös pakottaa vaa'an päälle. Laitoimme transistorin napin paikalle jotta pystyisimme kontrolloimaan vaakaa arduinolla.
Johdot liitettiin arduinoon siten, että segmenttipinnit menevät digitaalipaikkoihin 23 - 45, taustasignaalit analogipaikkoihin 0, 1 ja 2, transistori analogipaikkaan 4 ja virtajohdot omille paikoilleen.
Ohjelma lukee näytölle meneviä signaaleja, tulkitsee niiden perusteella näytöllä lukevan arvon ja lähettää sen seriaalia käyttäen eteenpäin tietokoneelle, jossa
Seriot lähettää tiedon eteenpäin
thingspeakiin. Koodi on tehty arduoinon omalla ohjelmalla.
// Näytön pinnissä 6 vika. kymmenissä ysistä tulee kolmonen.
//
//25.6 KG --> Vaaka vaihtaa LB:hin!
//
//
#include <SoftwareSerial.h>
// Determination of waiting times
const long wtime = 51200; // Waiting time when the measurement is done correctly (in milliseconds, 30min = 1800000ms) Program cycle is about 8,7 seconds.
const long ctime = 891100; // Waiting time when measurement errors, zeroes etc., occur (milliseconds)
//291300 5min
//891300 15min
//1791300 30min
//
// Creating variables
int lcdA=0,lcdB=0,lcdC=0;
bool lcd1,lcd2,lcd3,lcd4,lcd5,lcd6,lcd7,lcd8,lcd9,lcd10,lcd11,lcd12;
bool a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12;
bool b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12;
bool c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12;
bool lb,st,kg, kalat;
bool pin3;
unsigned int x[6], y[6], z[6], c[5];
int dec, ones, tens, hund;
float weight;
float weight0;
float weight1;
float weight2;
float weight3;
float weight4;
float tester[10];
// Creating a serial connection
void setup() {
Serial.begin(57600);
}
// A check to ensure that the scale is using the correct unit (kg)
void Kilos() {
while (pin3 == false) {
while (kalat == 0) {
lcdA = analogRead(A0);
lcdB = analogRead(A1);
lcdC = analogRead(A2);
lcd3 = digitalRead(41);
if (lcdA>200 && lcdB>200 && lcdC<100) {
pin3=lcd3;
kalat=1;
}
}
if (pin3 == false) {
digitalWrite(A3, HIGH);
delay(200);
digitalWrite(A3, LOW);
delay(1000);
kalat=0;
}
}
}
// Measuring program
void Measure() {
for (int i=0; i<6; i++){
// Zeroing the pin values
lcdA = 0;
lcdB = 0;
lcdC = 0;
lcd1 = 0;
lcd2 = 0;
lcd3 = 0;
lcd4 = 0;
lcd5 = 0;
lcd6 = 0;
lcd7 = 0;
lcd8 = 0;
lcd9 = 0;
lcd10 = 0;
lcd11 = 0;
lcd12 = 0;
// Reading the pins of the lcd
lcdA = analogRead(A0);
lcdB = analogRead(A1);
lcdC = analogRead(A2);
lcd1 = digitalRead(45);
lcd2 = digitalRead(43);
lcd3 = digitalRead(41);
lcd4 = digitalRead(39);
lcd5 = digitalRead(37);
lcd6 = digitalRead(35);
lcd7 = digitalRead(33);
lcd8 = digitalRead(31);
lcd9 = digitalRead(29);
lcd10 = digitalRead(27);
lcd11 = digitalRead(25);
lcd12 = digitalRead(23);
// Saving A-level segments into variables a1-a12
if (lcdA<100 && lcdB>200 && lcdC>200) {
a1=lcd1;
a2=lcd2;
a3=lcd3;
a4=lcd4;
a5=lcd5;
a6=lcd6;
a7=lcd7;
a8=lcd8;
a9=lcd9;
a10=lcd10;
a11=lcd11;
a12=lcd12;
}
// Saving B-level segments into variables b1-b12
if (lcdA>200 && lcdB<100 && lcdC>200) {
b1=lcd1;
b2=lcd2;
b3=lcd3;
b4=lcd4;
b5=lcd5;
b6=lcd6;
b7=lcd7;
b8=lcd8;
b9=lcd9;
b10=lcd10;
b11=lcd11;
b12=lcd12;
}
// Saving C-level segments into variables c1-c12
if (lcdA>200 && lcdB>200 && lcdC<100) {
c1=lcd1;
c2=lcd2;
c3=lcd3;
c4=lcd4;
c5=lcd5;
c6=lcd6;
c7=lcd7;
c8=lcd8;
c9=lcd9;
c10=lcd10;
c11=lcd11;
c12=lcd12;
}
// Checking the number in the decimal
// if ( a1 && a2 == true && b1 && !b2 && b3 == true && c1 && c2 == true) x[i]=0;
if ( a1 && !a2 == true && b1 && !b2 == true && !c1 && !c2 == true) x[i]=1;
if ( a1 && a2 == true && !b1 && b2 == true && c1 && c2 == true) x[i]=2;
if ( a1 && a2 == true && b1 && b2 && !b3 == true && c1 && !c2 == true) x[i]=3;
if ( a1 && !a2 == true && b1 && b2 == true && !c1 && !c2 == true) x[i]=4;
if (!a1 && a2 == true && b1 && b2 == true && c1 && !c2 == true) x[i]=5;
if (!a1 && a2 == true && b1 && b2 == true && c1 && c2 == true) x[i]=6;
if ( a1 && a2 == true && b1 && !b2 && !b3== true && !c1 && !c2 == true) x[i]=7;
if ( a1 && a2 == true && b1 && b2 == true && c1 && c2 == true) x[i]=8;
if ( a1 && a2 == true && b1 && b2 && b3 == true && c1 && !c2 == true) x[i]=9;
// Checking the number in ones
if ( a4 && a5 == true && b4 && !b5 && b6 == true && c4 && c5 == true) y[i]=0;
if ( a4 && !a5 == true && b4 && !b5 == true && !c4 && !c5 == true) y[i]=1;
if ( a4 && a5 == true && !b4 && b5 == true && c4 && c5 == true) y[i]=2;
if ( a4 && a5 == true && b4 && b5 && !b6 == true && c4 && !c5 == true) y[i]=3;
if ( a4 && !a5 == true && b4 && b5 == true && !c4 && !c5 == true) y[i]=4;
if (!a4 && a5 == true && b4 && b5 == true && c4 && !c5 == true) y[i]=5;
if (!a4 && a5 == true && b4 && b5 == true && c4 && c5 == true) y[i]=6;
if ( a4 && a5 == true && b4 && !b5 && !b6 == true && !c4 && !c5 == true) y[i]=7;
if ( a4 && a5 == true && b4 && b5 == true && c4 && c5 == true) y[i]=8;
if ( a4 && a5 == true && b4 && b5 && b6 == true && c4 && !c5 == true) y[i]=9;
// Checking the number in tens
if ( a7 && a8 == true && b7 && !b8 && b9 == true && c7 && c8 == true) z[i]=0;
if ( a7 && !a8 == true && b7 && !b8 == true && !c7 && !c8 == true) z[i]=1;
if ( a7 && a8 == true && !b7 && b8 == true && c7 && c8 == true) z[i]=2;
if ( a7 && a8 == true && b7 && b8 && !b9 == true && c7 && !c8 == true) z[i]=3;
if ( a7 && !a8 == true && b7 && b8 == true && !c7 && !c8 == true) z[i]=4;
if (!a7 && a8 == true && b7 && b8 == true && c7 && !c8 == true) z[i]=5;
if (!a7 && a8 == true && b7 && b8 == true && c7 && c8 == true) z[i]=6;
if ( a7 && a8 == true && b7 && !b8 && !b9 == true && !c7 && !c8 == true) z[i]=7;
if ( a7 && a8 == true && b7 && b8 == true && c7 && c8 == true) z[i]=8;
if ( a7 && a8 == true && b7 && b8 && b9 == true && c7 && !c8 == true) z[i]=9;
// Checking hundreds
if ( a10 && !a11 == true && b10 && !b11 && !b12 == true && !c10 && !c11 == true) c[i]=1;
delay(3); //default 5. 4 WORKS better (3-6 ?)
} // End of for-loop
// Analysis of decimals
if ( x[3] == x[4] ) dec = x[4];
// Analysis of ones
if ( y[3] == y[4] ) ones = y[4];
// Analysis of tens
if ( z[3] == z[4] ) tens = z[4];
// Analysis of hundreds
//if ( c[1] == c[4] ) hund = c[4];
/*
// DEBUGGING PART
Serial.print(z[0]);
Serial.print(" ");
Serial.print(z[1]);
Serial.print(" ");
Serial.print(z[2]);
Serial.print(" ");
Serial.print(z[3]);
Serial.print(" ");
Serial.print(z[4]);
Serial.print(" ");
Serial.print(z[5]);
Serial.print(" ");
Serial.print(y[0]);
Serial.print(" ");
Serial.print(y[1]);
Serial.print(" ");
Serial.print(y[2]);
Serial.print(" ");
Serial.print(y[3]);
Serial.print(" ");
Serial.print(y[4]);
Serial.print(" ");
Serial.print(y[5]);
Serial.print(" ");
Serial.print(x[0]);
Serial.print(" ");
Serial.print(x[1]);
Serial.print(" ");
Serial.print(x[2]);
Serial.print(" ");
Serial.print(x[3]);
Serial.print(" ");
Serial.print(x[4]);
Serial.print(" ");
Serial.print(x[5]);
Serial.print(" ");
// DEBUGGING END
*/
delay(50); //default 30
} // End of the measuring program
void reset() {
// Zeroes all used variables
x[0] = 0;
x[1] = 0;
x[2] = 0;
x[3] = 0;
x[4] = 0;
y[0] = 0;
y[1] = 0;
y[2] = 0;
y[3] = 0;
y[4] = 0;
z[0] = 0;
z[1] = 0;
z[2] = 0;
z[3] = 0;
z[4] = 0;
x[5] = 0;
y[5] = 0;
z[5] = 0;
a1=a2=a3=a4=a5=a6=a7=a8=a9=a10=a11=a12=0;
b1=b2=b3=b4=b5=b6=b7=b8=b9=b10=b11=b12=0;
c1=c2=c3=c4=c5=c6=c7=c8=c9=c10=c11=c12=0;
dec = 0;
ones = 0;
tens = 0;
weight = 0;
weight = 0.0;
pin3=0;
tester[0] = 0;
tester[1] = 0;
tester[2] = 0;
tester[3] = 0;
tester[4] = 0;
tester[5] = 0;
tester[6] = 0;
tester[7] = 0;
tester[8] = 0;
tester[9] = 0;
tester[10] = 0;
}
void rassi() {
// Zeroes all used variables
x[0] = 0;
x[1] = 0;
x[2] = 0;
x[3] = 0;
x[4] = 0;
y[0] = 0;
y[1] = 0;
y[2] = 0;
y[3] = 0;
y[4] = 0;
z[0] = 0;
z[1] = 0;
z[2] = 0;
z[3] = 0;
z[4] = 0;
x[5] = 0;
y[5] = 0;
z[5] = 0;
a1=a2=a3=a4=a5=a6=a7=a8=a9=a10=a11=a12=0;
b1=b2=b3=b4=b5=b6=b7=b8=b9=b10=b11=b12=0;
c1=c2=c3=c4=c5=c6=c7=c8=c9=c10=c11=c12=0;
dec = 0;
ones = 0;
tens = 0;
weight = 0;
weight = 0.0;
}
// Main program
void loop()
{
delay(1000); //default 1000
// Zeroing
reset();
// Transistor acts as a "reset switch" for the scale
digitalWrite(A3, HIGH);
delay(200); //default 200
digitalWrite(A3, LOW);
delay(500); //default 500
// Checking the unit
Kilos();
delay(1400); //default 3000. 3005 HYVÄ
// Measuring, loops 5 times
for (int m=0; m<11; m++){
Measure();
weight = 10.0*tens + 1.0*ones + 0.1*dec;
tester[m] = weight; // Saving the weight into a vector
//Serial.print(tester[m]);
//Serial.print("\n");
delay(100); //default 400
//rassi();
}
// Checks the similarity between gotten values
float Reading;
//Serial.print(tester[0]);
//Serial.print(" ");
// Serial.print(tester[1]);
// Serial.print(" ");
// Serial.print(tester[2]);
// Serial.print(" ");
Serial.print(tester[3]);
Serial.print(" ");
Serial.print(tester[4]);
Serial.print(" ");
Serial.print(tester[5]);
Serial.print(" ");
Serial.print(tester[6]);
Serial.print(" ");
Serial.print(tester[7]);
Serial.print(" ");
Serial.print(tester[8]);
// Serial.print(" ");
// Serial.print(tester[9]);
// Serial.print(" ");
// Serial.print(tester[10]);
Serial.print("\n");
if (tester[3] == tester[4] && tester[4] == tester[5] && tester[5] == tester[6] && tester[6] == tester[7] && tester[7] == tester[8] && tester[8] != 0.00 ){
Reading = (tester[3] + tester[4] + tester[5] + tester[6] + tester[7] + tester[8]);
Reading = (Reading/6);
Serial.print("\n");
Serial.print("###BOD");
Serial.print("\n");
Serial.print("Vaaka1,");
delay(100);
Serial.print(Reading);
Serial.print("\n");
Serial.print("###EOD");
Serial.print("\n");
delay(ctime); // Values were correct, program waits the set amount of time
}
else if (tester[3] == 0 || tester[4] == 0 || tester[5] == 0 || tester[6] == 0) {
Serial.print("\n");
Serial.print("###BOD");
Serial.print("\n");
Serial.print("Vaaka1, 0");
Serial.print("\n");
Serial.print("###EOD");
Serial.print("\n");
delay (wtime); // The values were not correct, program waits set time and measures again
}
else {
delay (wtime); // The values were not correct, program waits set time and measures again
}
} // End of the main program
Virrankulutus on vielä mittaamatta, mutta sen ei pitäisi olla kovin suuri.
Otimme vaa'asta sen anturit ja osan kuoresta irti ja kiinnitimme ne vanerilevyjen väliin, jotta saisimme tasapainotettua pesän paremmin vaa'an päälle. Tämä aiheutti hieman vaihtelevuutta järjestelmän toiminnassa, mutta yritämme korjata aiheutuneita bugeja.