1 | #include <OneWire.h>
|
2 | // Definition of interrupt names
|
3 | #include < avr/io.h >
|
4 | // ISR interrupt service routine
|
5 | #include < avr/interrupt.h >
|
6 |
|
7 | //Ab hier anpassen
|
8 |
|
9 | int Heizgriff = 5;
|
10 | int TasterPlus = 2; // INT0-Pin
|
11 | int TasterMinus = 3; // INT1-Pin
|
12 |
|
13 | volatile byte SollTemperatur = 30;
|
14 |
|
15 | volatile byte TasterPlusActStatus = LOW;
|
16 | volatile byte TasterPlusOldStatus = LOW;
|
17 | volatile byte TasterMinusActStatus = LOW;
|
18 | volatile byte TasterMinusOldStatus = LOW;
|
19 |
|
20 |
|
21 | //Temperatur Sensoren
|
22 | OneWire ds(13); //Pin an dem die Datenleitung des ds18s20 hängt
|
23 | #define MAX_DS1820_SENSORS 1
|
24 | byte addr[MAX_DS1820_SENSORS][8];
|
25 |
|
26 | int IstTemperatur[MAX_DS1820_SENSORS];
|
27 |
|
28 | #define DEBUG_MODE true //Debug Modus gibt Werte im Terminal aus (Serial)
|
29 | //Bis hier anpassen
|
30 |
|
31 | // Install the interrupt routine.
|
32 | void TasterPlusInterrupt( void ) {
|
33 | // check the value again - since it takes some time to
|
34 | // activate the interrupt routine, we get a clear signal.
|
35 | TasterPlusActStatus = digitalRead(TasterPlus);
|
36 | if (TasterPlusActStatus == HIGH && TasterPlusOldStatus == LOW )
|
37 | {
|
38 | if ( SollTemperatur < 50 )
|
39 | SollTemperatur += 5;
|
40 | }
|
41 | TasterPlusOldStatus = TasterPlusActStatus;
|
42 | }
|
43 |
|
44 | // Install the interrupt routine.
|
45 | void TasterMinusInterrupt( void ) {
|
46 | // check the value again - since it takes some time to
|
47 | // activate the interrupt routine, we get a clear signal.
|
48 | TasterMinusActStatus = digitalRead(TasterMinus);
|
49 | if (TasterMinusActStatus == HIGH && TasterMinusOldStatus == LOW )
|
50 | {
|
51 | if ( SollTemperatur > 20 )
|
52 | SollTemperatur -= 5;
|
53 | }
|
54 | TasterMinusOldStatus = TasterMinusActStatus;
|
55 | }
|
56 |
|
57 | void setup(void)
|
58 | {
|
59 | Serial.begin(9600);
|
60 | byte i;
|
61 |
|
62 | pinMode(Heizgriff, OUTPUT); // sets the pin as output
|
63 |
|
64 | pinMode(TasterPlus, INPUT); // sets the pin as input
|
65 | digitalWrite(TasterPlus, HIGH); // internen Pull-Up-Widerstand einschalten
|
66 | pinMode(TasterMinus, INPUT); // sets the pin as input
|
67 | digitalWrite(TasterMinus, HIGH); // internen Pull-Up-Widerstand einschalten
|
68 |
|
69 | attachInterrupt( 0, TasterPlusInterrupt, CHANGE ); // TasterPlus Interrupt aktivieren auf beide Flanken
|
70 | attachInterrupt( 1, TasterMinusInterrupt, CHANGE ); // TasterMinus Interrupt aktivieren auf beide Flanken
|
71 |
|
72 | //Anzahl der angeschlossenen Sensoren durchgehen
|
73 | for ( i = 0; i < MAX_DS1820_SENSORS; i++)
|
74 | {
|
75 | if (!ds.search(addr[i]))
|
76 | {
|
77 | ds.reset_search();
|
78 | delay(250);
|
79 | return;
|
80 | }
|
81 | }
|
82 | }
|
83 |
|
84 | void loop()
|
85 | {
|
86 | char buf[30];
|
87 |
|
88 | readTemperature();
|
89 |
|
90 | sprintf( buf, "Soll %d Ist %d\n", SollTemperatur, IstTemperatur[ 0 ] );
|
91 | Serial.print(buf);
|
92 |
|
93 | analogWrite(Heizgriff, 128);
|
94 |
|
95 | // analogWrite(Heizgriff, val / 4);
|
96 | }
|
97 |
|
98 | void readTemperature( void )
|
99 | {
|
100 | int HighByte, LowByte, TReading, SignBit, Tc_100, Temp, Fract;
|
101 | char buf[20];
|
102 |
|
103 | byte i, sensor;
|
104 | byte present = 0;
|
105 | byte data[12];
|
106 |
|
107 | for (sensor=0; sensor<MAX_DS1820_SENSORS; sensor++)
|
108 | {
|
109 | if (OneWire::crc8( addr[sensor], 7) != addr[sensor][7])
|
110 | {
|
111 | return;
|
112 | }
|
113 |
|
114 | if ( addr[sensor][0] != 0x10)
|
115 | {
|
116 | return;
|
117 | }
|
118 |
|
119 | ds.reset();
|
120 | ds.select(addr[sensor]);
|
121 | ds.write(0x44,1); // start conversion, with parasite power on at the end
|
122 |
|
123 | delay(1000);
|
124 |
|
125 | present = ds.reset();
|
126 | ds.select(addr[sensor]);
|
127 | ds.write(0xBE); // Read Scratchpad
|
128 |
|
129 | for (i = 0; i < 9; i++)
|
130 | {
|
131 | data[i] = ds.read();
|
132 | }
|
133 |
|
134 | LowByte = data[0];
|
135 | HighByte = data[1];
|
136 | TReading = (HighByte << 8) + LowByte;
|
137 | SignBit = TReading & 0x8000;
|
138 | if (SignBit) // negative
|
139 | {
|
140 | TReading = (TReading ^ 0xffff) + 1;
|
141 | }
|
142 | Tc_100 = (TReading*100/2);
|
143 |
|
144 | Temp = Tc_100 / 100;
|
145 | IstTemperatur[ sensor ] = Temp;
|
146 | }
|
147 | }
|