Advertisement
Guest User

Untitled

a guest
Jun 22nd, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.33 KB | None | 0 0
  1. #include <Wire.h>
  2. #include <RTClib.h>
  3. RTC_DS1307 rtc;
  4. #include <SPI.h>
  5. #include <Adafruit_Sensor.h>
  6. #include <Adafruit_BMP280.h>
  7.  
  8. #define BMP_SCK 13 // SCK ist an PIN 13 angeschlossen...
  9. #define BMP_MISO 12
  10. #define BMP_MOSI 11
  11. #define BMP_CS 10
  12.  
  13. Adafruit_BMP280 bmp;
  14.  
  15. #include <LiquidCrystal.h>
  16. LiquidCrystal lcd(2,3,4,5,6,7,8);
  17.  
  18. // Zeitintervalle setzen
  19. int TeilerSeriell = 5; // Serielle Ausgabe alle 2 min
  20. int TeilerTendenz = 15;
  21.  
  22.  
  23. // Timer setzen
  24. unsigned long currentMillis;
  25. unsigned long currentDisplayMillis;
  26. unsigned long SeriellMillis;
  27. long SeriellIntervall = 1000;
  28. unsigned long DisplayMillis;
  29. long DisplayIntervall = 3000;
  30. unsigned long TendenzMillis;
  31. long TendenzIntervall = 1000;
  32.  
  33.  
  34. // Variablen für Werteerfassung und Umrechnung deklarieren
  35. int MesswertHell = 0;
  36. int EnergiestromWpM = 0;
  37. float MaxTemp = -1000;
  38. float MinTemp = 1000;
  39. float Temperatur;
  40. float Luftdruck;
  41. float LuftdruckhPa;
  42. float LuftdruckWGT;
  43. String Wetterstatus = "leer";
  44. String Tendenz = "leer";
  45.  
  46.  
  47. //Variable für Ausgabemodus am Display
  48. int modus = 1; // Startet bei 1
  49. boolean writeOK = false;
  50.  
  51. // Variablen für Tendenz P-Zeit in Minuten
  52. float Pnow;
  53. float P15;
  54. float P30;
  55. float P45;
  56. float P60; //1h
  57. float P75;
  58. float P90;
  59. float P105;
  60. float P120; //2h
  61. float P135;
  62. float P150;
  63. float P165;
  64. float P180; //3h
  65.  
  66. void setup()
  67. {
  68. //Serial.begin(9600);
  69. rtc.begin();
  70. Wire.begin();
  71. lcd.begin(16,2);
  72. bmp.begin();
  73.  
  74. //rtc.adjust(DateTime(__DATE__, __TIME__)); // EINMALIG: kalibrieren der Uhr mit PC
  75.  
  76.  
  77. // Druck für Tendenz Startwerte
  78. Luftdruck = bmp.readPressure(); // Erfasse Luftdruck
  79. LuftdruckhPa = Luftdruck / 100; // Luftdruck von Pa in hPa umrechnen
  80. LuftdruckWGT = (LuftdruckhPa + ( 55 / 8.5 ))-20; // für 485 m ü. NN ( Weingarten) anpassen
  81. Pnow = LuftdruckWGT;
  82. P15 = LuftdruckWGT;
  83. P30 = LuftdruckWGT;
  84. P45 = LuftdruckWGT;
  85. P60 = LuftdruckWGT; //1h
  86. P75 = LuftdruckWGT;
  87. P90 = LuftdruckWGT;
  88. P105 = LuftdruckWGT;
  89. P120 = LuftdruckWGT; //2h
  90. P135 = LuftdruckWGT;
  91. P150 = LuftdruckWGT;
  92. P165 = LuftdruckWGT;
  93. P180 = LuftdruckWGT; //3h
  94. Tendenz = "Erhebe Daten";
  95.  
  96.  
  97. //Serial.println(F("Datum Zeit; Temperatur; Sonnenenergie/m2; Luftdruck; Druckdiff/3h; AktuellesWetter; Tendenz")); // Beschriftung nur ein Mal
  98.  
  99. }
  100.  
  101.  
  102. void loop()
  103. {
  104. // Teil 1 Berechnung aller Werte...
  105. //
  106.  
  107. MesswertHell = analogRead(A1);
  108. EnergiestromWpM = map(MesswertHell, 0, 940, 8, 199);
  109. Luftdruck = bmp.readPressure(); // Erfasse Luftdruck
  110. Temperatur = bmp.readTemperature(); // Erfasse Temperatur
  111. LuftdruckhPa = Luftdruck / 100; // Luftdruck von Pa in hPa umrechnen
  112. LuftdruckWGT = (LuftdruckhPa + ( 485 / 8.5 ))-50; // für 485 m ü. NN ( Weingarten) anpassen
  113.  
  114. if(Temperatur < MinTemp) {MinTemp = Temperatur;}
  115. if(Temperatur > MaxTemp) {MaxTemp = Temperatur;}
  116.  
  117. // WetterAktuell:
  118.  
  119. if ((LuftdruckWGT <= 980)&& (Temperatur >= 0)){Wetterstatus = "Sturm, Regen";}
  120. if ((LuftdruckWGT <= 980)&& (Temperatur < 0)){Wetterstatus = "Sturm, Schnee";}
  121. if ((LuftdruckWGT > 980) && (LuftdruckWGT <= 1000) && (Temperatur >= 0)) {Wetterstatus = "Regnerisch";}
  122. if ((LuftdruckWGT > 980) && (LuftdruckWGT <= 1000) && (Temperatur < 0)) {Wetterstatus = "Schneeschauer";}
  123. if ((LuftdruckWGT > 1000) && (LuftdruckWGT <= 1020)){Wetterstatus = "Wechselhaft";}
  124. if ((LuftdruckWGT > 1020) && (LuftdruckWGT <= 1040)){Wetterstatus = "Sonnig,bestaendig";}
  125. if (LuftdruckWGT > 1040){Wetterstatus = "Trocken,Gewitter";}
  126.  
  127. currentMillis = millis(); // Timer für jeden Durchgang setzten.
  128. DateTime aktuell = rtc.now();
  129.  
  130. // Teil 2 Tendenzen berechen..
  131. //
  132.  
  133. if ((aktuell.second() == 0 ) && (aktuell.minute()%TeilerTendenz == 0)) // Wenn die aktuelle Minute durch 15 teilbar ist, dann....
  134. {
  135. if(currentMillis - TendenzMillis > TendenzIntervall)
  136. {
  137. // Register eins weiterschieben
  138. P180 = P165;
  139. P165 = P150;
  140. P150 = P135;
  141. P135 = P120;
  142. P120 = P105;
  143. P105 = P90;
  144. P90 = P75;
  145. P75 = P60;
  146. P60 = P45;
  147. P45 = P30;
  148. P30 = P15;
  149. P15 = Pnow;
  150. Pnow = LuftdruckWGT;
  151.  
  152.  
  153. // Tendenz berechnen
  154. if( Pnow-P180 <= -8 ){Tendenz ="Sturm mit Hagel";}
  155. if((Pnow-P180 <= -5 ) && (Pnow-P180 > -8 )){Tendenz ="Regen/Unwetter";}
  156. if((Pnow-P180 <= -3 ) && (Pnow-P180 > -5 )){Tendenz ="Regnerisch";}
  157. if((Pnow-P180 <= -1.3) && (Pnow-P180 > -3 )){Tendenz ="baldiger Regen";}
  158. if((Pnow-P180 <= 1.3 ) && (Pnow-P180 > -1.3)){Tendenz ="gleichbleibend";}
  159. if((Pnow-P180 <= 3 ) && (Pnow-P180 >= 1.3)){Tendenz ="lange Schoen";}
  160. if((Pnow-P180 <= 5 ) && (Pnow-P180 >= 3 )){Tendenz ="Schoen & labil";}
  161. if( Pnow-P180 > 5 ){Tendenz = "Sturmwarnung";}
  162. TendenzMillis = currentMillis;
  163. }
  164. }
  165.  
  166.  
  167. // Teil 3 Ausgabe Dispaly
  168.  
  169. if(currentMillis - DisplayMillis > DisplayIntervall)
  170. {
  171. if (modus >= 6) { modus = 1; }
  172. else
  173. {
  174. modus = modus + 1;
  175. }
  176. DisplayMillis = currentMillis;
  177. }
  178.  
  179. switch(modus)
  180. {
  181. case 1: //Wetterstatus
  182. DisplayIntervall = 5000;
  183. lcd.setCursor(0,0);
  184. lcd.print(F("Wetterntan: "));
  185. lcd.setCursor(0,1);
  186. lcd.print(Wetterstatus);
  187. lcd.print(" ");
  188. break;
  189.  
  190. case 2: //WetterTendenz
  191. DisplayIntervall = 5000;
  192. lcd.setCursor(0,0);
  193. lcd.print(F("Wetterprognose;
  194. lcd.setCursor(0,1);
  195. lcd.print(Tendenz);
  196. lcd.print(" ");
  197. break;
  198.  
  199. case 3: // Datum und Uhrzeit
  200. DisplayIntervall = 3500;
  201. lcd.setCursor(0,0);
  202. lcd.print(F("Datum
  203. if (aktuell.day() < 10){lcd.print(F("0
  204. lcd.print(aktuell.day());
  205. lcd.print("/");
  206. if (aktuell.month() < 10){lcd.print(F("0
  207. lcd.print(aktuell.month());
  208. lcd.print(F("/"));
  209. lcd.print(aktuell.year());
  210. lcd.print(F(" "));
  211. lcd.setCursor(0,1);
  212. lcd.print(F("Zeit
  213. if (aktuell.hour() < 10){lcd.print(F("0
  214. lcd.print(aktuell.hour());
  215. lcd.print(F(":"));
  216. if (aktuell.minute() < 10){lcd.print(F("0
  217. lcd.print(aktuell.minute());
  218. lcd.print(F(":"));
  219. if (aktuell.second() < 10){lcd.print(F("0
  220. lcd.print(aktuell.second());
  221. lcd.print(F(" "));
  222. break;
  223.  
  224. case 4: //Temperatur und Luftdruck
  225. DisplayIntervall = 3500;
  226. lcd.setCursor(0,0);
  227. lcd.print(F("Temp));
  228. lcd.print(Temperatur,2); // NEU : ,1 heißt eine Nachkommazahl!
  229. lcd.print(F(" \337C "));
  230. lcd.setCursor(0,1);
  231. lcd.print(F("Druck);
  232. lcd.print(LuftdruckWGT,0);
  233. lcd.print(F(" hPa "));
  234. break;
  235.  
  236. case 5: //Beleuchtung und Luftdrucktendez
  237. DisplayIntervall = 3500;
  238. lcd.setCursor(0,0);
  239. lcd.print(F("Bel);
  240. lcd.print(EnergiestromWpM); // NEU : ,1 heißt eine Nachkommazahl!
  241. lcd.print(F(" W/m2 "));
  242. lcd.setCursor(0,1);
  243. lcd.print(F("dP);
  244. lcd.print(Pnow -P180,1);
  245. lcd.print(F(" /3h "));
  246. break;
  247.  
  248. case 6: //Beleuchtung und Luftdrucktendez
  249. DisplayIntervall = 3500;
  250. lcd.setCursor(0,0);
  251. lcd.print(F("T "));
  252. lcd.print(MinTemp);
  253. lcd.print(F(" \337C "));
  254. lcd.setCursor(0,1);
  255. lcd.print(F("T "));
  256. lcd.print(MaxTemp);
  257. lcd.print(F(" \337C "));
  258. break;
  259.  
  260. }
  261.  
  262.  
  263. // Teil 4 Ausgabe Serielle Schnittstelle
  264.  
  265. if ((aktuell.second() == 0 ) && (aktuell.minute()%TeilerSeriell == 0))
  266. {
  267. if(currentMillis - SeriellMillis > SeriellIntervall)
  268. {
  269. if (aktuell.day() < 10){Serial.print(F("0 // EXCEL DATUM: "TT.MM.JJJJ HH:MM:SS"
  270. Serial.print(aktuell.day());
  271. Serial.print(F("."));
  272. if (aktuell.month() < 10){Serial.print(F("0
  273. Serial.print(aktuell.month());
  274. Serial.print(F("."));
  275. Serial.print(aktuell.year());
  276. Serial.print(F(" "));
  277. if (aktuell.hour() < 10){Serial.print(F("0
  278. Serial.print(aktuell.hour());
  279. Serial.print(F(":"));
  280. if (aktuell.minute() < 10){Serial.print(F("0
  281. Serial.print(aktuell.minute());
  282. Serial.print(F(":"));
  283. if (aktuell.second() < 10){Serial.print(F("0
  284. Serial.print(aktuell.second());
  285. Serial.print(F(";")); // Trennzeichen für EXCEL nächster Datensatz
  286. Serial.print(Temperatur);
  287. Serial.print(F(";")); // Trennzeichen für EXCEL nächster Datensatz
  288. Serial.print(EnergiestromWpM);
  289. Serial.print(F(";")); // Trennzeichen für EXCEL nächster Datensatz
  290. Serial.print(LuftdruckWGT);
  291. Serial.print(F(";")); // Trennzeichen für EXCEL nächster Datensatz
  292. Serial.print(Pnow-P180);
  293. Serial.print(F(";")); // Trennzeichen für EXCEL nächster Datensatz
  294. Serial.print(Wetterstatus);
  295. Serial.print(F(";")); // Trennzeichen für EXCEL nächster Datensatz
  296. Serial.println(Tendenz); // println für neue Zeile
  297.  
  298. SeriellMillis = currentMillis;
  299. }
  300. }
  301.  
  302.  
  303. // Teil 6 LCD Refresh alle 10 min
  304. // weil sich das LCD manchmal hängt
  305.  
  306. if ((aktuell.second() == 0 ) && (aktuell.minute()%10 == 0))
  307. {
  308. lcd.begin(16,2);
  309.  
  310. //ENDE LOOP
  311. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement