Stap 3: Code
Code#include < PinChangeInt.h >
#include < PinChangeIntConfig.h >
int PIN = 10; PIN op welke interrupt is moeten worden gegenereerd (pin verbonden om te schakelen die gedrukt zal Toon temp op oscilloscoop)
int thermistorpin = A0; welke analoge pin aansluiten
int thermistornominal = 150; weerstand bij 25 graden C
int temperaturenominal = 25; Temp. voor nominale weerstand (bijna altijd 25 C)
int numsamples = 100; hoeveel monsters te nemen en de gemiddelde, meer duurt langer
maar is meer 'glad'
int bcoefficient = 3950; De coëfficiënt van de bèta van de thermistor (meestal 3000-4000)
int seriesresistor = 10000; de waarde van de 'andere' weerstand
int k;
int t1, t2; 2 cijfers van temp
int monsters [100]; niet. monsters worden genomen door A0
int dacx [] {} =
9,8,7,6,5,4,3,2}; //pins waar 1ste dac is aangesloten
int dacy [] {} =
19,18,17,16,15,13,12,11}; pins waar 2e dac is aangesloten
int sec = 90; tweedehands besturingselementen (90 is hoek om 12 uur)
int munt = 90; besturingselementen min hand
int uur = 120; besturingselementen uurwijzer
zweven mincos = 0; de waarde voor sinus en cos waarde voor het eindpunt van min hand genereert
zweven minsin = 1;
float-hourcos =-0.866; de waarde voor sinus en cos waarde voor het eindpunt van de uurwijzer genereert
zweven hoursin = 0,5;
ponits (bits waarden) voor sinus en cos golven
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 en cosinus waarde van hoek op welke 12 lijnen van klok
zweven [strokeSin] =
{
.0000,.5000,.8666,1.000,.8666,.5000,.0000,-.5000,-.8666,-1.000,-.8666,-.5000
};
zweven [strokeCos] =
{
1.000,.8666,.5000,.0000,-.5000,-.8666,-1.000,-.8666,-.5000,.0000,.5000,.8666
};
unsigned long changeTime; / / programma speelduur winkel
VOID Setup
{
pinMode (PIN, INPUT); de 10e pincode invoeren instellen
digitalWrite (PIN, hoge); Gebruik de interne pullup weerstand
PCintPort::attachInterrupt (PIN, swapMode, vallen);
for (int i = 0; ik < = 7; i ++)
{
pinMode(dacx[i],OUTPUT); dac's declareren als uitvoer
pinMode(dacy[i],OUTPUT);
}
changeTime=millis();
displayclock(); dispay "Klok door"
displayName();
}
void loop
{
minLine(127,127); functie voor het weergeven van de minutenwijzer
hourLine(127,127); functie voor het weergeven van de kleine wijzer
Circle(); functie om een cirkel te maken
Strokes(); functie voor het toevoegen van 12 lijn lijnen vertegenwoordigen van 12 uur in klok
secLine(127,127,sec);
if((Millis()-changeTime) > 114)
{
SEC--;
if(SEC==0) sec = 360; 0 of 360 is hoek op nummer drie op de klok
if(sec==90) updateMin(); Wanneer 60 sec zijn voltooid wordt min hand door 1 plaats verplaatst
changeTime=millis();
}
}
functie voor het berekenen en weergeven van de temp.
wordt aangeroepen wanneer interrupt wordt gegenereerd
VOID swapMode()
{
uint8_t i;
float gemiddelde;
N monsters te nemen in een rij, met een kleine vertraging
voor (ik = 0; ik < numsamples; i ++) {}
monsters [i] = analogRead(thermistorpin);
delay(10);
}
het gemiddelde van alle monsters uit
gemiddelde = 0;
voor (ik = 0; ik < numsamples; i ++) {}
gemiddelde += monsters [i];
}
gemiddelde / = numsamples;
de waarde omzetten in weerstand
gemiddelde = 1023 / gemiddelde - 1;
gemiddelde = seriesresistor / gemiddelde;
float steinhart;
Steinhart = gemiddelde / thermistornominal; (R/Ro)
Steinhart = log(steinhart); LN(R/ro)
Steinhart / = bcoefficient; 1/B * ln(R/Ro)
Steinhart += 1.0 / (temperaturenominal + 273.15); + (1/to)
Steinhart = 1.0 / steinhart; Omkeren
Steinhart-= 273.15; converteren naar C
Steinhart=Round(Steinhart); geeft ons een geheel getal
T1 = steinhart/10; getal genereert op tientallen plaatsen
T2 = (int) steinhart % 10; getal genereert op zijn plaats
voor (int m = 0; m < = 100; m ++)
{
de temperaturen wat betreft bijvoorbeeld "35 * C" weergeven
Font(T1,50);
Font(T2,100);
Degree(145);
Celcius(160);
}
SEC-= 19;
}
VOID updateMin()
{
munt = munt-6;
if(Mint==0) munt = 360;
mincos=cos(PI*Mint/180);
minsin=Sin(PI*Mint/180);
if(Mint==90) updateHour; Wanneer 60 min zijn voltooid wordt uurwijzer verplaatst door 1 plaats
}
VOID updateHour()
{
uur = uur-30;
if(hour==0) uur = 360;
hourcos=cos(PI*Hour/180);
hoursin=Sin(PI*Hour/180);
}
void (int x, int y) punt //plot een punt op het xy-vlak van oscilloscoop
{
for (int j = 0; j < = 7; j ++)
{
digitalWrite (dacx [j], ((x & 1 << j) > 0));
}
for (int j = 0; j < = 7; j ++)
{
digitalWrite (dacy [j], ((y & 1 << j) > 0));
}
}
VOID parallel (int, int b, int c) //function te trekken een lijn evenwijdig aan de y-as (een punt constante op x-as en het punt op de y-as varieert van b aan c)
{
voor (k = b; k < c; k = k + 2)
{
Point(a,k);
}
}
VOID parallelx (int d, int e, int f) //function om te tekenen van een lijn evenwijdig aan x axis(d is point constant on y axis and point on x axis varies from e to f)
{
voor (k = e; k < f, k = k + 2)
{
Point(k,d);
}
}
VOID angleline (int x1, int y1, int x2, int y2) //draw een lijn tussen 2 punten op oscilloscoop
{
for (int i = 0; ik < = 200; ik = i + 4)
{
int x = x 1 + i * (x 2-x 1) / 200;
int y = y1 + i (y2-y1) / 200;
Point(x,y);
}
}
ongeldig circle() //function om een cirkel te tekenen
{
voor (int i = 0; ik < 256; i = i + 2) //send sin en cos golven te DAC's
{
Point(sinx[i],cosx[i]);
}
}
VOID strokes()
{
voor (int theta = 0; theta < 12, theta ++)
voor (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 te trekken seconden hand van lengte 'r', in een hoek theta, x en y zijn uitgangspunten
{
voor (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 tot het opstellen van de minutenwijzer van lengte 'r', op een hoek theta (gegeven door globale variabelen mincos en minsin), x en y zijn uitgangspunten
{
voor (int r = 0; r < 100; r = r + 2)
{
Point(x+int(r*mincos),y+int(r*minsin));
}
}
VOID hourLine (int x, int y) //function tot het opstellen van de uurwijzer van lengte 'r', op een hoek theta (gegeven door globale variabelen hourcos en hoursin), x en y zijn uitgangspunten
{
voor (int r = 0; r < 75; r = r + 2)
{
Point(x+int(r*hourcos),y+int(r*hoursin));
}
}
VOID displayclock() //display woorden "Klok door"
{
voor (int f = 0; f < = 50; f ++)
KLOK
{
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); K
angleline(210,165,245,195);
angleline(210,165,245,135);
DOOR
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 woorden "KSHITIJ en KAPIL"
{
voor (int g = 0; g < = 40; g ++)
{
KSHITIJ
parallely(5,95,155); K
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); Ik
parallely(185,95,155); T
parallelx(155,165,205);
parallely(215,95,155); Ik
parallelx(155,225,252); J
parallely(239,95,155);
angleline(239,95,225,110);
}
voor (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);
}
voor (int f = 0; f < = 40; f ++)
{
KAPIL
parallely(10,95,155); K
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); P
angleline(120,155,160,135);
angleline(120,115,160,135);
parallely(180,95,155); Ik
parallely(200,95,155); L
parallelx(95,200,245);
}
}
VOID font (int a, int x) //function naar de 2 cijfers van temp weergeven
{
switch(a)
{
Case 0:
parallelx(40,x,x+40);
parallelx(110,x,x+40);
parallely(x,40,110);
parallely(x+40,40,110);
breken;
Case 1:
parallely(x+20,40,110);
breken;
Case 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);
breken;
Case 3:
parallelx(110,x,x+40);
parallelx(75,x,x+40);
parallelx(40,x,x+40);
parallely(x+40,40,110);
breken;
Case 4:
parallely(x,80,110);
parallely(x+40,40,110);
parallelx(80,x,x+40);
breken;
Case 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);
breken;
Case 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);
breken;
Case 7:
parallely(x+40,40,110);
parallelx(110,x,x+40);
breken;
zaak 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);
breken;
Case 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);
breken;
}
}
ongeldig degree(int x) //display cirkel van graad
{
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);
}