Omfattningen klocka: Analog klocka och temperaturgivare på oscilloskop (3 / 3 steg)
Steg 3: kod
Koden#include < PinChangeInt.h >
#include < PinChangeIntConfig.h >
int PIN = 10; PIN på vilka avbrott ska genereras (pin ansluten till strömbrytare som när trycks in visas Visa temp på oscilloskop)
int thermistorpin = A0; som analog pin att ansluta
int thermistornominal = 150; motstånd vid 25 grader C
int temperaturenominal = 25; Temp. för nominella resistans (nästan alltid 25 C)
int numsamples = 100; Hur många prover att ta och genomsnitt, mer tar längre tid
men är mer "mjuk"
int bcoefficient = 3950; Den beta koefficienten för termistor (oftast 3000-4000)
int seriesresistor = 10000; värdet av "övriga" motståndet
int k;
int t1, t2; 2 siffror för temp
int prover [100]. Nej. prov som tas av A0
int dacx [] = {
9,8,7,6,5,4,3,2}; //pins var 1: a dac är ansluten
int dacy [] = {
19,18,17,16,15,13,12,11}. stift var 2: a dac är ansluten
int SEK = 90. styr andra hand (90 är vinkel klockan 12)
int mint = 90. styr min hand
int timme = 120; kontroller timvisaren
flyta mincos = 0; genererar värdet för sinus och cos värde för slutpunkten i min hand
flyta minsin = 1;
float hourcos =-0.866; genererar värdet för sinus och cos värde för slutpunkten för timvisaren
flyta hoursin = 0,5;
Ponits (bitvärden) för sinus och cos vågor
unsigned char sinx [] =
{
127,130,133,136,139,142,145,148,151,154,157,160,164,166,169,172,175,178,181,184,187,189,192,195, 197,200,202,205,207,210,212,214,217,219,221,223,225,227,229,231,232,234,236,237,239,240,242,
243,244,245,246,247,248,249, 250,251,251,252,252,253,253,253,253,253,254,253,253,253,253,252,252,251, 251,250,249,249,248,247,246,245,243,242,241,239,238,236,235,233,231,230, 228,226,224,222,
220,218, 215,213,211,209,206,204,201,199,196,193,191,188,185,182,180,177,174,171,168,165,162,159,156,153, 150,147,144,141,137,134,131,128,125,122,119,116,112,109,106,103,100,97,94,91,88,85,82,
79,76, 73,71,68,65,62,60,57,54,52,49,47,44,42,40,38,35,33,31,29,27,25,23,22,20,18,17,15,14, 12,11,10,8,7,6,5,4,4,3,2,2,1,1,0,0,0,0,0,0,0,0,0,0,1,1,2,2,3,4,5,6,7,8,9,10,11,13,14,16,17,19,21,22,
24, 26,28,30,32,34,36,39,41,43,46,48,51,53,56,58,61,64,66,69,72,75,78,81,84,87,89,93,96, 99,102,105,108,111,114,117,120,123,127
};
unsigned char cosx [] =
{
254,253,253,253,253,252,252,251, 251,250,249,249,248,247,246,245,243,242,241,239,238,236,235,233,231,230, 228,226,224,222,220,218, 215,213,211,209,206,204,201,199,196,193,191,188,185,182,180,
177,174,171,168,165,162,159,156,153, 150,147,144,141,137,134,131,128,125,122,119,116,112,109,106,103,100,97,94,91,88,85,82,79,76, 73,71,68,65,62,60,57,54,52,49,47,44,42,40,38,35,33,31,29,27,
25,23,22,20,18,17,15,14, 12,11,10,8,7,6,5,4,4,3,2,2,1,1,0,0,0,0,0,0,0,0,0,0,1,1,2,2,3,4,5,6,7,8,9,10,11,13,14,16,17,19,21,22,24, 26,28,30,32,34,36,39,41,43,46,48,51,53,56,58,61,64,66,69,72,75,
78,81,84,87,89,93,96, 99,102,105,108,111,114,117,120,123,127,130,133,136,139,142,145,148,151,154,157,160,164,166,169,172,175,178,181,184,187,189,192,195, 197,200,202,205,207,210,212,214,217,
219,221,223,225,227,229,231,232,234,236,237,239,240,242,243, 244,245,246,247,248,249, 250,251,251,252,252,253,253,253,253,253,254
};
sinus och cosinus värdet av vinkel på vilka 12 slag av klocka
flyta strokeSin [] =
{
.0000,.5000,.8666,1.000,.8666,.5000,.0000,-.5000,-.8666,-1.000,-.8666,-.5000
};
flyta strokeCos [] =
{
1.000,.8666,.5000,.0000,-.5000,-.8666,-1.000,-.8666,-.5000,.0000,.5000,.8666
};
osignerade långa changeTime; / / lagra program gångtid
void setup()
{
pinMode (PIN, indata); Ange 10 PIN-koden till insatsen
digitalWrite (PIN, hög); använda det interna pullup motståndet
PCintPort::attachInterrupt (stift, swapMode, faller);
för (int jag = 0; jag < = 7; i ++)
{
pinMode(dacx[i],OUTPUT); deklarera DAC: s som utdata
pinMode(dacy[i],OUTPUT);
}
changeTime=millis();
displayclock(); dispay "Klocka av"
displayName();
}
void loop()
{
minLine(127,127); funktionen att Visa minutvisaren
hourLine(127,127); funktionen att Visa timvisaren
Circle(); funktion för att göra en cirkel
Strokes(); funktion för att lägga till 12 stroke linjer som representerar 12-timmars klocka
secLine(127,127,sec);
IF((Millis()-changeTime) > 114)
{
SEK--;
IF(SEC==0) SEK = 360; 0 eller 360 är vinkel nummer tre på klockan
IF(SEC==90) updateMin(); När 60 SEK är avslutade flyttas min hand av 1 plats
changeTime=millis();
}
}
funktion för att beräkna och Visa temp.
anropas när avbrott genereras
void swapMode()
{
uint8_t i.
float genomsnittet.
ta N prov i rad, med en liten fördröjning
för (jag = 0; jag < numsamples; i ++) {
prover [i] = analogRead(thermistorpin);
Delay(10);
}
alla prover i genomsnitt
genomsnittliga = 0;
för (jag = 0; jag < numsamples; i ++) {
genomsnittliga += prover [i];
}
i genomsnitt / = numsamples;
konvertera värdet till motstånd
genomsnittliga = 1023 / medelvärde - 1;
genomsnittliga = seriesresistor / genomsnittliga;
float steinhart;
Steinhart = medel / thermistornominal; (R/Ro)
Steinhart = log(steinhart); ln(R/ro)
Steinhart = bcoefficient; 1/B * ln(R/Ro)
Steinhart += 1.0 / (temperaturenominal + 273.15); + (1/till)
Steinhart = 1,0 / steinhart; Invertera
Steinhart-= 273.15; konvertera till C
Steinhart=Round(Steinhart); ger oss ett heltal
T1 = steinhart/10; genererar nummer på tiotals placera
T2 = (int) steinhart % 10. genererar nummer på en plats
för (int m = 0; m < = 100; m ++)
{
Visa temp som för t.ex. "35 * C"
font(T1,50);
font(T2,100);
Degree(145);
Celcius(160);
}
SEC-= 19.
}
void updateMin()
{
Mint = mint-6;
IF(Mint==0) mint = 360;
mincos=cos(PI*Mint/180);
minsin=sin(PI*Mint/180);
IF(Mint==90) updateHour; När 60 min fullgörs flyttas timvisaren av 1 plats
}
void updateHour()
{
timme = timme-30;
IF(Hour==0) timme = 360;
hourcos=cos(PI*Hour/180);
hoursin=sin(PI*Hour/180);
}
void punkt (int x, int y) //plot en punkt på planet xy oscilloskop
{
för (int j = 0; j < = 7; j ++)
{
digitalWrite (dacx [j] ((x & 1 << j) > 0));
}
för (int j = 0; j < = 7; j ++)
{
digitalWrite (dacy [j], ((y & 1 << j) > 0));
}
}
void parallely (int a, int b int c) //function att rita en linje parallell med y-axeln (en punkt konstant på x-axeln och punkt på y-axeln varierar från b till c)
{
för (k = b; k < c, k = k + 2)
{
Point(a,k);
}
}
void parallelx (int d, int e, int f) //function för att rita en linje parallell med x axis(d is point constant on y axis and point on x axis varies from e to f)
{
för (k = e; k < f; k = k + 2)
{
Point(k,d);
}
}
void angleline (int x1, int y1, int x2, int y2) //draw en linje mellan 2 poäng på oscilloskop
{
för (int jag = 0; jag < = 200; jag = i + 4)
{
int x = x 1 + i * (x 2-x 1) / 200;
int y = y1 + i * (y2-y1) / 200;
Point(x,y);
}
}
void circle() //function att rita en cirkel
{
för (int jag = 0; jag < 256; i = i + 2) //send sin och cos vågor till DAC
{
Point(Sinx[i],cosx[i]);
}
}
void strokes()
{
för (int theta = 0; theta < 12, theta ++)
för (int r = 100; r < 125; r = r + 2)
{
Point(127+int(r*strokeCos[theta]),127+int(r*strokeSin[theta]));
}
}
void secLine (int x, int y, int theta) //function Rita sekunder hand längd 'r', i en vinkel theta, x och y utgångspunkter
{
för (int r = 0; r < 127; r = r + 2)
{
Point(x+int(r*cos(PI*theta/180)),y+int(r*sin(PI*theta/180)));
}
}
void minLine (int x, int y) //function Rita minutvisaren längd "r", på en vinkel theta (ges av globala variabler mincos och minsin), x och y utgångspunkter
{
för (int r = 0; r < 100; r = r + 2)
{
Point(x+int(r*mincos),y+int(r*minsin));
}
}
void hourLine (int x, int y) //function Rita timvisaren längd "r", på en vinkel theta (ges av globala variabler hourcos och hoursin), x och y utgångspunkter
{
för (int r = 0; r < 75; r = r + 2)
{
Point(x+int(r*hourcos),y+int(r*hoursin));
}
}
void displayclock() //display ord "Klocka av"
{
för (int f = 0; f < = 50; f ++)
KLOCKAN
{
parallely(10,135,195); C
parallelx(135,10,50);
parallelx(195,10,50);
parallely(60,135,195); L
parallelx(135,60,100);
parallely(110,135,195); O
parallely(150,135,195);
parallelx(135,110,150);
parallelx(195,110,150);
parallely(160,135,195); C
parallelx(135,160,200);
parallelx(195,160,200);
parallely(210,135,195); KARLSSON
angleline(210,165,245,195);
angleline(210,165,245,135);
GENOM
parallely(80,55,115); B
angleline(80,115,120,100);
angleline(80,85,120,100);
angleline(80,85,120,70);
angleline(80,55,120,70);
angleline (130,115,155,95), //Y
angleline(145,55,170,115);
}
}
void displayName() //display ord "MALEE och Lasse"
{
för (int g = 0; g < = 40; g ++)
{
MALEE
parallely(5,95,155); KARLSSON
angleline(5,125,40,155);
angleline(5,125,40,95);
angleline(50,95,95,125); S
parallelx(125,55,95);
angleline(55,125,90,155);
parallely(105,95,155); H
parallely(145,95,155);
parallelx(125,105,145);
parallely(155,95,155); Jag
parallely(185,95,155); T
parallelx(155,165,205);
parallely(215,95,155); Jag
parallelx(155,225,252); J
parallely(239,95,155);
angleline(239,95,225,110);
}
för (int f = 0; f < = 20; f ++)
{
angleline(65,95,87,155); A
angleline(110,95,87,155);
parallelx(120,75,100);
parallely(120,95,155); N
angleline(120,155,165,95);
parallely(165,95,155);
parallely(175,95,155); D
angleline(175,155,215,125);
angleline(175,95,215,125);
}
för (int f = 0; f < = 40; f ++)
{
FELLBOM
parallely(10,95,155); KARLSSON
angleline(10,125,55,155);
angleline(10,125,55,95);
angleline(65,95,87,155); A
angleline(110,95,87,155);
parallelx(120,75,100);
parallely(120,95,155); PERSSON
angleline(120,155,160,135);
angleline(120,115,160,135);
parallely(180,95,155); Jag
parallely(200,95,155); L
parallelx(95,200,245);
}
}
ogiltiga teckensnitt (int a, int x) //function att Visa 2 nummer av temp
{
Switch(a)
{
fall 0:
parallelx(40,x,x+40);
parallelx(110,x,x+40);
parallely(x,40,110);
parallely(x+40,40,110);
bryta;
fall 1:
parallely(x+20,40,110);
bryta;
fall 2:
parallelx(110,x,x+40);
parallelx(75,x,x+40);
parallelx(40,x,x+40);
parallely(x+40,75,110);
parallely(x,40,75);
bryta;
fall 3:
parallelx(110,x,x+40);
parallelx(75,x,x+40);
parallelx(40,x,x+40);
parallely(x+40,40,110);
bryta;
fall 4:
parallely(x,80,110);
parallely(x+40,40,110);
parallelx(80,x,x+40);
bryta;
fall 5:
parallelx(110,x,x+40);
parallelx(75,x,x+40);
parallelx(40,x,x+40);
parallely(x,75,110);
parallely(x+40,40,75);
bryta;
fall 6:
parallelx(110,x,x+40);
parallelx(75,x,x+40);
parallelx(40,x,x+40);
parallely(x,40,110);
parallely(x+40,40,75);
bryta;
fall 7:
parallely(x+40,40,110);
parallelx(110,x,x+40);
bryta;
mål 8:
parallelx(110,x,x+40);
parallelx(75,x,x+40);
parallelx(40,x,x+40);
parallely(x,40,110);
parallely(x+40,40,110);
bryta;
mål 9:
parallelx(110,x,x+40);
parallelx(75,x,x+40);
parallelx(40,x,x+40);
parallely(x,75,110);
parallely(x+40,40,110);
bryta;
}
}
void degree(int x) //display cirkel av graden
{
parallelx(110,x,x+10);
parallelx(100,x,x+10);
parallely(x,100,110);
parallely(x+10,100,110);
}
void celcius(int x) //display "C"
{
parallelx(110,x,x+40);
parallelx(40,x,x+40);
parallely(x,40,110);
}