1 | // _2DS18_ins_I2C-EEPR_vorl_171226-test-2 26.12.17
|
2 | // _2DS18_ins_I2C-EEPR_vorl_170522 22.05.17
|
3 |
|
4 | // neuer Versuch wg der Timerausgabe (erste Stelle)
|
5 | // funktioniert, wenn Relaisabfrage ausgeschaltet ist
|
6 |
|
7 | // Zwischenversion mit unförmiger Abfrage
|
8 | // gehört zu _I2C_EEPR_9_vorl_170522
|
9 |
|
10 | // +++ Heizungskontrolle
|
11 |
|
12 | // Zunächst wird die Zeit seit Programmstart ins EEPROM geschrieben,
|
13 | // danach werden zwei DS18B20 ausgelesen, die Ergebnisse auf LCD dargestellt und ins EEPROM geschrieben.
|
14 | // Alle diese Werte werden in jeweils in zwei Bytes zerlegt und in hintereinander folgende EEPROM-Zellen geschrieben.
|
15 |
|
16 | // Problem: der erste der sechs EEPROM-Einträge ist immer Null (statt Highbyte von Time!)
|
17 |
|
18 |
|
19 | // Der Zustand des heizungsparallelen Relay wird 12-mal mit 1 sec Zwischenzeiten abgefragt.
|
20 | // Daraus wird auf das Ende des Brennerlaufs geschlossen und in diesem Fall nach 3 min
|
21 | // die Werte für Außen- und Vorlauftemperatur ins I2C-EEPROM geschrieben.
|
22 |
|
23 | // Hardware: Board 151113 mit Iteaduino 2.2 mit zwei Anschlüssen für die
|
24 | // DS18B20 und zwei nicht mehr benutzten für SMT 160-30
|
25 |
|
26 |
|
27 | /* YourDuino Multiple DS18B20 Temperature Sensors on 1 wire
|
28 | Connections:
|
29 | DS18B20 Pinout (Left to Right, pins down, flat side toward you)
|
30 | - Left = Ground
|
31 | - Center = Signal (Pin 2): (with 3.3K to 4.7K resistor to +5 or 3.3 )
|
32 | - Right = +5 or +3.3 V
|
33 |
|
34 | Questions: terry@yourduino.com
|
35 | V1.01 01/17/2013 ...based on examples from Rik Kretzinger
|
36 |
|
37 |
|
38 |
|
39 | /*-----( Import needed libraries )-----*/
|
40 | // Get 1-wire Library here: http://www.pjrc.com/teensy/td_libs_OneWire.html
|
41 | #include <OneWire.h>
|
42 |
|
43 | //Get DallasTemperature Library here: http://milesburton.com/Main_Page?title=Dallas_Temperature_Control_Library
|
44 | #include <DallasTemperature.h>
|
45 |
|
46 | /*-----( Declare Constants and Pin Numbers )-----*/
|
47 | #define ONE_WIRE_BUS_PIN 2
|
48 |
|
49 | /*-----( Declare objects )-----*/
|
50 | // Setup a oneWire instance to communicate with any OneWire devices
|
51 | OneWire oneWire(ONE_WIRE_BUS_PIN);
|
52 |
|
53 | // Pass our oneWire reference to Dallas Temperature.
|
54 | DallasTemperature sensors(&oneWire);
|
55 |
|
56 | /*-----( Declare Variables )-----*/
|
57 | // Assign the addresses of your 1-Wire temp sensors.
|
58 | // See the tutorial on how to obtain these addresses:
|
59 | // http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html 0x28, 0x22, 0xEC, 0xEA, 0x07, 0x00, 0x00, 0x15
|
60 |
|
61 | DeviceAddress Probe01 = { 0x28, 0x22, 0xEC, 0xEA, 0x07, 0x00, 0x00, 0x15}; //
|
62 | DeviceAddress Probe02 = { 0x28, 0xD1, 0xD3, 0xEA, 0x07, 0x00, 0x00, 0xD5 }; // kurzes Kabel 7t98r5
|
63 |
|
64 |
|
65 | #include <Wire.h>
|
66 | #include <LiquidCrystal_I2C.h>
|
67 | LiquidCrystal_I2C lcd(0x20,16,2); // Achtung: auf den neuen I2C-LCD gibt es Adressjumper.
|
68 | const int I2CADRESSE = 0x51; // A0 = high,
|
69 | int eepromadresse = 0;
|
70 | int adresse = 0;
|
71 | int a = 10; // zum Testen der lcd-Ausgabe
|
72 | int relaispin = 9;
|
73 | unsigned long time;
|
74 |
|
75 | void setup() /****** SETUP: RUNS ONCE ******/
|
76 | {
|
77 | Serial.begin(9600); // für Ausgabe über Terminal
|
78 | pinMode (relaispin, INPUT);
|
79 | delay(4000);
|
80 | lcd.init();
|
81 | lcd.backlight();
|
82 | lcd.clear();
|
83 | lcd.print(" _2_DS18_ins_EEPROM");
|
84 | lcd.setCursor(0,1);
|
85 | lcd.print("relaisgest_m_Zeit");
|
86 | delay(4000);
|
87 | lcd.clear();
|
88 |
|
89 |
|
90 | // start serial port to show results
|
91 | Serial.begin(9600);
|
92 | Serial.print("Initialisierung Temperature Control Library Version ");
|
93 | Serial.println(DALLASTEMPLIBVERSION);
|
94 | delay(2000);
|
95 |
|
96 | // Initialize the Temperature measurement library
|
97 | sensors.begin();
|
98 |
|
99 | // set the resolution to 12 bit (Can be 9 to 12 bits .. lower is faster)
|
100 | sensors.setResolution(Probe01, 12);
|
101 | sensors.setResolution(Probe02, 12);
|
102 |
|
103 | } //--(end setup )---
|
104 |
|
105 | void loop() /****** LOOP: RUNS CONSTANTLY ******/
|
106 | {
|
107 |
|
108 | // Abfrage des Brennerrelais, genauer, des Relais, das dem eigentlichen Brennerrelais
|
109 | // nachgeschaltet ist.
|
110 | int i;
|
111 | int summe1= 0;
|
112 | int ersterRelaiszustand[6];
|
113 | for (i=0; i<7; i++){
|
114 | ersterRelaiszustand[i] = digitalRead(relaispin);
|
115 | summe1 = summe1 + ersterRelaiszustand[i];
|
116 | delay(100);
|
117 | }
|
118 | int summe2= 0;
|
119 | int zweiterRelaiszustand[6];
|
120 | for (i=0; i<7; i++){
|
121 | zweiterRelaiszustand[i] = digitalRead(relaispin);
|
122 | summe2 = summe2 + zweiterRelaiszustand[i];
|
123 | delay(100);
|
124 | }
|
125 |
|
126 | if(summe2 > summe1) // muß ausprobiert werden, da nicht bekannt ist, w i e das Relais geschaltet ist,
|
127 | // am Ende der Brennerlaufzeit abgefallen oder angezogen???
|
128 | // while(!.... gibt pausenlose Ausgabe und die erste Zelle ist ok, nicht leer
|
129 | // if(...... liefert Ausgabe wie gewünscht, aber zweite Spalte ist leer.
|
130 | {
|
131 |
|
132 |
|
133 | delay(12000); // z. Zt. 0,2 min Wartezeit, bis Außen- und Vorlauftemperatur gemessen wird
|
134 |
|
135 | // Zeit ins EEPROM schreiben
|
136 | int Time = millis() /1000; // Sekunden seit Start
|
137 | Time = 1234; // hilfsweise
|
138 |
|
139 | schreibEEPROM(eepromadresse,highByte(Time)); // highByte(Time)
|
140 | eepromadresse++;
|
141 | schreibEEPROM(eepromadresse,lowByte(Time)); // lowByte(Time)
|
142 | eepromadresse++;
|
143 |
|
144 |
|
145 | // Command all devices on bus to read temperature
|
146 |
|
147 | sensors.requestTemperatures();
|
148 | delay(100);
|
149 | lcd.clear();
|
150 | delay(100);
|
151 | lcd.setCursor(0,0);
|
152 | lcd.print("aus ");
|
153 | Serial.print("am langen Kabel (aussen): "); //langes Kabel
|
154 | printTemperature(Probe01);
|
155 | Serial.print(" ");
|
156 | Serial.println(Time);
|
157 | lcd.setCursor(10,0);
|
158 | lcd.print(millis()/1000); // Sekunden
|
159 |
|
160 | // lcd.clear();
|
161 | // lcd.print("lang ");
|
162 |
|
163 |
|
164 | sensors.requestTemperatures();
|
165 | lcd.setCursor(0,1);
|
166 | lcd.print("Vor ");
|
167 | Serial.print("am kurzen Kabel (Vorlauf): ");
|
168 | printTemperature(Probe02);
|
169 | lcd.setCursor(10,1);
|
170 | lcd.print(eepromadresse);
|
171 | Serial.println();
|
172 |
|
173 | } // Ende Relaispinabfrage
|
174 |
|
175 | }//--(end main loop )---
|
176 |
|
177 | // Unterfunktionen
|
178 |
|
179 | void schreibEEPROM(int adresse, byte daten)
|
180 | {
|
181 | Wire.beginTransmission(I2CADRESSE);
|
182 | Wire.write ((byte) (adresse >> 8));
|
183 | Wire.write ( (byte) (adresse & 0xFF));
|
184 | Wire.write (daten);
|
185 | Wire.endTransmission();
|
186 | delay(5);
|
187 | }
|
188 |
|
189 |
|
190 | void printTemperature(DeviceAddress deviceAddress) // h i e r wird die Temp. vom Sensor gelesen
|
191 | {
|
192 | float tempC = sensors.getTempC(deviceAddress)*100;
|
193 | if (tempC == -12700){ // Format von tempC = 12700
|
194 | Serial.print("Lesefehler am Temp.-Sensor ");
|
195 | }
|
196 | else
|
197 | {
|
198 | // Serial.print("C: ");
|
199 | Serial.print(tempC/100); // hier wird die Temp. geschrieben
|
200 | lcd.print(tempC/100);
|
201 | int TempC = int(tempC); // damit es in low- und highbyte zerlegt werden kann (wg. des EEPROMs)
|
202 |
|
203 |
|
204 | schreibEEPROM(eepromadresse,highByte(TempC)); // highByte(Time)
|
205 | eepromadresse++;
|
206 | schreibEEPROM(eepromadresse,lowByte(TempC)); // lowByte(Time)
|
207 | eepromadresse++;
|
208 | } // End printTemperature
|
209 | //*********( THE END )***********
|
210 | }
|