{"id":2700,"date":"2024-12-30T15:58:27","date_gmt":"2024-12-30T14:58:27","guid":{"rendered":"https:\/\/tomas.dk\/ps\/?p=2700"},"modified":"2024-12-30T15:58:27","modified_gmt":"2024-12-30T14:58:27","slug":"vejrstation-del-3","status":"publish","type":"post","link":"https:\/\/tomas.dk\/ps\/vejrstation-del-3\/","title":{"rendered":"Vejrstation del 3"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1200\" height=\"783\" data-attachment-id=\"2665\" data-permalink=\"https:\/\/tomas.dk\/ps\/vejrstation-del-1\/tempude\/\" data-orig-file=\"https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/11\/TempUde-scaled.jpg\" data-orig-size=\"2560,1670\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;2.3&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;XQ-BQ52&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1731873655&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;10.22&quot;,&quot;iso&quot;:&quot;200&quot;,&quot;shutter_speed&quot;:&quot;0.05&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}\" data-image-title=\"TempUde\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/11\/TempUde-300x196.jpg\" data-large-file=\"https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/11\/TempUde-1200x783.jpg\" src=\"https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/11\/TempUde-1200x783.jpg\" alt=\"\" class=\"wp-image-2665\" srcset=\"https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/11\/TempUde-1200x783.jpg 1200w, https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/11\/TempUde-300x196.jpg 300w, https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/11\/TempUde-150x98.jpg 150w, https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/11\/TempUde-768x501.jpg 768w, https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/11\/TempUde-1536x1002.jpg 1536w, https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/11\/TempUde-2048x1336.jpg 2048w, https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/11\/TempUde-1568x1023.jpg 1568w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Diagrammer og software<\/h2>\n\n\n\n<p>Diagrammerne er ret simple. <\/p>\n\n\n\n<p>F\u00f8rst diagrammet over m\u00e5lecomputeren, der h\u00e5ndterer diverse f\u00f8lere.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Diagram over m\u00e5leenhed<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1190\" height=\"845\" data-attachment-id=\"2698\" data-permalink=\"https:\/\/tomas.dk\/ps\/sch_arduinomaalestation_1-p1_2024-12-30\/\" data-orig-file=\"https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/12\/SCH_ArduinoMaalestation_1-P1_2024-12-30.png\" data-orig-size=\"1190,845\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"SCH_ArduinoM\u00e5lestation_1-P1_2024-12-30\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/12\/SCH_ArduinoMaalestation_1-P1_2024-12-30-300x213.png\" data-large-file=\"https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/12\/SCH_ArduinoMaalestation_1-P1_2024-12-30.png\" src=\"https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/12\/SCH_ArduinoMaalestation_1-P1_2024-12-30.png\" alt=\"\" class=\"wp-image-2698\" srcset=\"https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/12\/SCH_ArduinoMaalestation_1-P1_2024-12-30.png 1190w, https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/12\/SCH_ArduinoMaalestation_1-P1_2024-12-30-300x213.png 300w, https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/12\/SCH_ArduinoMaalestation_1-P1_2024-12-30-150x107.png 150w, https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/12\/SCH_ArduinoMaalestation_1-P1_2024-12-30-768x545.png 768w\" sizes=\"auto, (max-width: 1190px) 100vw, 1190px\" \/><\/figure>\n\n\n\n<p>De to kredse til h\u00f8jre er diagrammet over FTDI interface, der bruges til at enten kommunikere med enheden eller reprogrammere den. Denne del har jeg to versioner af, da der opst\u00e5r lidt b\u00f8vl med kommunikationen hvis der ikke laves en lille \u00e6ndring. Der sker, det at DTR g\u00e5r lav n\u00e5r python eller andet software vil kommunikere med en arduino. Dette skal den iflg. rs232 protokollen, men det g\u00f8r desv\u00e6rre at en arduino genstarter, da den ser det som om at den skal programmeres. For at undg\u00e5 dette afbrydes DTR n\u00e5r enheden benyttes som vejrstation.<br \/>Seriel kommunikation fungerer heldigvis fint uden DTR.<br \/>Hvis der skal l\u00e6gges rettelser p\u00e5, skal DTR reetableres for at man kan overf\u00f8re ny software.<\/p>\n\n\n\n<p>Herunder er koden til m\u00e5lecomputeren.<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color has-link-color wp-elements-99e6a589b613dd030443277e1170dd00\" style=\"padding-top:0;padding-bottom:0;font-size:9px;line-height:1\"><code>#include &lt;Arduino.h>\n#include &lt;dhtnew.h>\n\n#include &lt;Adafruit_Sensor.h>\n#include &lt;Adafruit_BMP280.h>\n#include &lt;Wire.h>\n#include &lt;Adafruit_Sensor.h>\n\n\/\/ put function declarations here:\n\/\/ \nfloat getTempIn(void);\nfloat getTempOut(void);\nfloat getPress(void);\nfloat getOutHumid(void);\nvoid  rainInt(void);\nvoid  rollRain(int);\nfloat getRain5(void);\nfloat getRain(void);\n\n\/\/Constants\n#define DHTPIN 5\n#define RAINPIN 2\n\n\/\/ Init temp\/hum sensor\nDHTNEW outdoorSensor(DHTPIN);\n\n#define OUTTEMP_ADJUST  -1.16\n#define INTEMP_ADJUST   -1.58\n\n\/\/ Init pressure sensor\nAdafruit_BMP280 bmp;\n\n\/\/ Variable\nfloat tryk;\nfloat indetemp;\nString cmd = \"\";\nvolatile int rain = 0;\nvolatile unsigned long pulseTime = millis();\nvolatile unsigned long lastPulseTime = pulseTime;\nint rain5 = 0;\nunsigned long nuTid;\nunsigned long tid;\nfloat VIPFAKTOR = 0.408;\nint minRain&#91;5] = {0, 0, 0, 0, 0};\n\nvoid setup() {\n  Serial.begin(9600);\n\tSerial.println(\"Klarg\u00f8r hardware\");\n  Serial.println();\n\n  \/\/ trykmaaler\n  while (!bmp.begin(0x76)) {\n    Serial.println(\"Kunne ikke finde BMP280!!!\");\n    delay(5000);\n  }\n\n  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     \/* Operating Mode. *\/\n                  Adafruit_BMP280::SAMPLING_X2,     \/* Temp. oversampling *\/\n                  Adafruit_BMP280::SAMPLING_X16,    \/* Pressure oversampling *\/\n                  Adafruit_BMP280::FILTER_X16,      \/* Filtering. *\/\n                  Adafruit_BMP280::STANDBY_MS_500);  \/* Standby time. *\/\n  Serial.println(\"BMP280 klar\");\n\n  \/\/ Setup interrupt for regnm\u00e5ler\n  pinMode(RAINPIN, INPUT_PULLUP);\n  attachInterrupt(digitalPinToInterrupt(RAINPIN), rainInt, FALLING);\n  Serial.println(\"Interrupt klar\");\n\n  Serial.println(\"Vejrstation klar\");\n  nuTid = millis();\n}\n\nvoid loop() {\n  \/\/ Seriel kommunikation\n  \/\/ --------------------\n  if ( Serial.available() ) {\n    cmd = Serial.readStringUntil('\\n');\n  \n    cmd.trim();\n    if ( cmd.equalsIgnoreCase(\"getTempIn\")) {\n      \/\/Serial.print(\"Inde Temperatur \");\n      Serial.println(getTempIn());\n    } \n    else if ( cmd.equalsIgnoreCase(\"getTempOut\")) {\n      \/\/Serial.print(\"Ude Temperatur \");\n      Serial.println(getTempOut());\n    } \n    else if ( cmd.equalsIgnoreCase(\"getPress\")) {\n      \/\/Serial.print(\"tryk \");\n      Serial.println(getPress());\n    } \n    else if ( cmd.equalsIgnoreCase(\"getOutHumidity\")) {\n      \/\/Serial.print(\"ude luftfugtighed \");\n      Serial.println(getOutHumid());\n    }\n    else if ( cmd.equalsIgnoreCase(\"getRain5\")) {\n      Serial.println(getRain5());\n    }\n    else if ( cmd.equalsIgnoreCase(\"getRain1\")) {\n      Serial.println(getRain());\n    }\n    else {\n      \/\/Serial.print(\"Ukendt kommando: \");\n      Serial.println(\"?: \" + cmd);\n    }\n  }\n\n  \/\/ Regnm\u00e5ler \n  \/\/ ---------\n  tid = millis();\n  if (tid >= nuTid + 60000) {\n    rollRain(rain);\n    rain = 0;\n    nuTid = tid;\n  }\n\n}\n\nfloat getRain5(void) {\n  int i;\n  int rain5 = 0;\n  float mm;\n  for (i=0; i&lt;5; i++){\n    rain5 += minRain&#91;i];\n    \/\/ Serial.println(minRain&#91;i]);\n  }\n  mm = rain5 * VIPFAKTOR;\n  return mm;\n}\n\nfloat getRain(void) {\n  float mm;\n\n  mm = minRain&#91;4] * VIPFAKTOR;\n  return mm;\n}\n\nvoid rollRain(int r1){\n  int i;\n  rain5 = 0;\n  \/\/ sum 5 min regn\n  for (i = 0; i &lt; 5; i++) {\n    rain5 += minRain&#91;i];\n  }\n\n  \/\/ rul rain5\n  for (i = 1; i &lt; 5; i++) {\n    minRain&#91;i - 1] = minRain&#91;i];\n  }\n  minRain&#91;4] = r1;\n}\n\nvoid rainInt(void) {\n  pulseTime = millis();\n  if (pulseTime - lastPulseTime > 5000) {\n    rain++;\n  } else {\n    rain = 0;\n  }\n  lastPulseTime = pulseTime;\n}\n\nfloat getTempIn(void){\n  float indetemp;\n  indetemp = bmp.readTemperature() + INTEMP_ADJUST;\n  return indetemp;\n}\n\nfloat getTempOut(void) {\n  float udeTemp;\n  outdoorSensor.read();\n  udeTemp = outdoorSensor.getTemperature() + OUTTEMP_ADJUST;\n  return udeTemp;\n}\n\nfloat getOutHumid(void) {\n  float hum;\n  outdoorSensor.read();\n  hum = outdoorSensor.getHumidity();\n  return hum;\n}\n\nfloat getPress(void){\n  tryk = bmp.readPressure()\/100+4.4;\n  return tryk;\n}\n<\/code><\/pre>\n\n\n\n<p>Det enester der er lidt specielt er:<br \/>void rainInt(void) {<br \/>  pulseTime = millis();<br \/>  if (pulseTime &#8211; lastPulseTime > 5000) {<br \/>    rain++;<br \/>  } else {<br \/>    rain = 0;<br \/>  }<br \/>  lastPulseTime = pulseTime;<br \/>}<\/p>\n\n\n\n<p>Dette er interrupt rutinen. Den t\u00e6ller op, n\u00e5r der kommer en puls fra regnm\u00e5leren, medmindre der er g\u00e5et under 5 sekunder mellem to pulser. Dette ses som st\u00f8j og der t\u00e6lles ikke op.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Diagram over displayenheden<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1200\" height=\"812\" data-attachment-id=\"2699\" data-permalink=\"https:\/\/tomas.dk\/ps\/oleddisplay_schem\/\" data-orig-file=\"https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/12\/OLEDDisplay_schem.jpg\" data-orig-size=\"1442,976\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"OLEDDisplay_schem\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/12\/OLEDDisplay_schem-300x203.jpg\" data-large-file=\"https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/12\/OLEDDisplay_schem-1200x812.jpg\" src=\"https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/12\/OLEDDisplay_schem-1200x812.jpg\" alt=\"\" class=\"wp-image-2699\" srcset=\"https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/12\/OLEDDisplay_schem-1200x812.jpg 1200w, https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/12\/OLEDDisplay_schem-300x203.jpg 300w, https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/12\/OLEDDisplay_schem-150x102.jpg 150w, https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/12\/OLEDDisplay_schem-768x520.jpg 768w, https:\/\/tomas.dk\/ps\/wp-content\/uploads\/2024\/12\/OLEDDisplay_schem.jpg 1442w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/figure>\n\n\n\n<p>Igen et meget simpelt kredsl\u00f8b. Alt kommunikation med denne enhed er via et web kald.<\/p>\n\n\n\n<p>Herunder koden:<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"font-size:9px;line-height:1\"><code>#include &lt;Arduino.h>\n\n\/*\n\n\n  U8G2_SSD1306_128X64_NONAME_1_4W_HW_SPI u8g2\n  make -f Makefile.184.uno\n\n   text\n   8732\t    \t\t\t\t\tdefault, all active\n   8500\t    -232\t    -2.65%\t\tno U8G2_WITH_CLIP_WINDOW_SUPPORT\n   8316\t    -416\t    -4.76%\t\tno U8G2_WITH_FONT_ROTATION\n   8606\t    -126\t    -1.44%\t \tno U8G2_WITH_UNICODE\n   8692\t    -40\t    -0.45%\t\tno U8G2_WITH_INTERSECTION\n   8328\t    -404\t    -4.62%\t  \tno U8G2_WITH_INTERSECTION  no U8G2_WITH_CLIP_WINDOW_SUPPORT\n   8718\t    -14\t    -4.86%\t\tno U8G2_WITH_HVLINE_SPEED_OPTIMIZATION\n   8026\t    -706\t    -8.08%\t\tno U8G2_WITH_FONT_ROTATION   no U8G2_WITH_INTERSECTION  no U8G2_WITH_CLIP_WINDOW_SUPPORT\n\n   Some flags depend on each other: `U8G2_WITH_INTERSECTION` is required for `U8G2_WITH_CLIP_WINDOW_SUPPORT`, so `U8G2_WITH_INTERSECTION` is partly active as long\n   as `U8G2_WITH_CLIP_WINDOW_SUPPORT` is requested.\n\n*\/\n\n#include &lt;Arduino.h>\n#include &lt;U8g2lib.h>\n#include &lt;WiFi.h>\n#include &lt;HTTPClient.h>\n#include &lt;Arduino_JSON.h>\n#include &lt;OneWire.h>\n#include &lt;DallasTemperature.h>\n\n#ifdef U8X8_HAVE_HW_SPI\n#include &lt;SPI.h>\n#endif\n#ifdef U8X8_HAVE_HW_I2C\n#include &lt;Wire.h>\n#endif\n\n#define FALSE 1\n#define TRUE 0\nconst int ONEWIREPIN = 4;\n\n\/\/ init oled\n\/\/U8G2_SH1106_128X64_NONAME_F_HW_I2C oled(U8G2_R0, \/* reset=*\/U8X8_PIN_NONE);\n\/\/U8G2_SSD1309_128X64_NONAME2_F_HW_I2C oled(U8G2_R0, \/*reset=*\/U8X8_PIN_NONE);\nU8G2_SSD1309_128X64_NONAME0_F_HW_I2C oled(U8G2_R0, \/*reset=*\/U8X8_PIN_NONE);\n\n\/\/ init onewire og sensor\nOneWire oneWire(ONEWIREPIN);\nDallasTemperature indeSensor(&amp;oneWire);\n\n\/\/ WiFi setup\nconst char *ssid = \"DIN_SSID\";\nconst char *password = \"SSID_PASSWORD\";\n\n\/\/ URL for vejrdata\nconst char *vejrDataURL = \"URL_for_data\";\n\nJSONVar udeTemp = \"-99.99\";\nJSONVar indeTemp = \"-99.99\";\nJSONVar regn1 = \"-99.99\";\nJSONVar regn24 = \"-99.99\";\nJSONVar regn15 = \"-99.99\";\nJSONVar humid = \"-99.99\";\nJSONVar tryk = \"-9999.99\";\nJSONVar tidString = \"--\";\n\nunsigned JsonOk = FALSE;\nint dispNr = 0;\n\nunsigned long sidsteTid = millis(); \/\/ Web Refresh\nunsigned long tid = 0;              \/\/ Tid nu\nunsigned long dTid = millis();      \/\/ Display Refresh\nconst long interval = 60000;\nconst long webInterval = 60000;\nconst long dispUpdate = 5000;\nunsigned int wifiOk = FALSE; \/\/ 1 = notok 0 = ok\nconst int cpuSpeedSaving = 80;\nint strLen = 0;\nint strPos = 0;\nint pxStart = 0;\nint nLen = 0;\nint firstRead = 1;\nint hour = 0;\nint minUr = 0;\nString vString = \"\";\nString tekst = \"\";\nString enhed = \"\";\nString maalinger = \"\";\nString sysTid = \"\";\nfloat ut = 999.9;\nfloat it = 999.9;\nfloat r1 = 999.9;\nfloat r15 = 999.9;\nfloat r24 = 999.9;\nfloat h = 999.9;\nfloat p = 999.9;\nchar buffer&#91;30];\nchar ur&#91;5];\n\nfloat vaerdi = 0.0;\n\n\/\/ funtioner deklarationer\nvoid displayRSSI(void);\nString httpGETRequest(const char *serverName);\nvoid dispData(String, JSONVar, String);\nvoid dispBullet(int);\n\nvoid setup(void)\n{\n  setCpuFrequencyMhz(cpuSpeedSaving);\n  delay(500);\n  \/\/ seriel baud rate\n  Serial.begin(115200);\n  \/\/ oled display\n  oled.begin();\n  \/\/ Temp sensor\n  indeSensor.begin();\n\n  \/\/ Wifi\n  \/\/WiFi.hostname(\"espWeather\");\n  WiFi.begin(ssid, password);\n\n  Serial.print(\"CPU speed: \");\n  Serial.println(getCpuFrequencyMhz());\n  Serial.println(\"Forbinder\");\n  while (WiFi.status() != WL_CONNECTED)\n  {\n    delay(500);\n    Serial.print(\".\");\n  }\n  \/\/ Set wifi sleep mode\n  WiFi.setSleep(true);\n\n  Serial.println(\"\");\n  Serial.print(\"Forbundet til WiFi med IP Adresse: \");\n  Serial.println(WiFi.localIP());\n  wifiOk = 0;\n}\n\nvoid loop(void)\n{\n\n  \/\/ Sp\u00f8rg efter data p\u00e5 webserver\n  tid = millis();\n  if (((tid - sidsteTid) > webInterval) || (firstRead == 1))\n  {\n    firstRead = 0;\n    sidsteTid = millis();\n\n    \/\/ Afl\u00e6s indesensor\n    indeSensor.requestTemperatures();\n    it = indeSensor.getTempCByIndex(0);\n    Serial.printf(\"Inde temp: %.1f\\n\", it);\n\n    \/\/ Tjek wifi\n    if (WiFi.status() == WL_CONNECTED)\n    {\n      wifiOk = 0;\n      maalinger = httpGETRequest(vejrDataURL);\n      \/\/ Serial.println(maalinger);\n      JSONVar vejrDataJson = JSON.parse(maalinger);\n      if (JSON.typeof(vejrDataJson) == \"undefined\")\n      {\n        Serial.println(\"Fejl i modtagne JSON\");\n        JsonOk = FALSE;\n      }\n      else\n      {\n        JsonOk = TRUE;\n        Serial.println(vejrDataJson);\n        if (vejrDataJson.hasOwnProperty(\"systid\"))\n        {\n          tidString = vejrDataJson&#91;\"systid\"];\n          vString = JSON.stringify(tidString);\n          hour = vString.substring(12, 14).toInt();\n          minUr = vString.substring(15, 17).toInt();\n          \/\/Serial.println(hour);\n        }\n        if (vejrDataJson.hasOwnProperty(\"tryk\"))\n        {\n          tryk = vejrDataJson&#91;\"tryk\"];\n          vString = JSON.stringify(tryk);\n          p = vString.toFloat();\n        }\n        if (vejrDataJson.hasOwnProperty(\"tempout\"))\n        {\n          udeTemp = vejrDataJson&#91;\"tempout\"];\n          vString = JSON.stringify(udeTemp);\n          ut = vString.toFloat();\n        }\n        if (vejrDataJson.hasOwnProperty(\"rhout\"))\n        {\n          humid = vejrDataJson&#91;\"rhout\"];\n          vString = JSON.stringify(humid);\n          h = vString.toFloat();\n        }\n        if (vejrDataJson.hasOwnProperty(\"r15min\"))\n        {\n          regn15 = vejrDataJson&#91;\"r15min\"];\n          vString = JSON.stringify(regn15);\n          r15 = vString.toFloat();\n        }\n        if (vejrDataJson.hasOwnProperty(\"r1hour\"))\n        {\n          regn1 = vejrDataJson&#91;\"r1hour\"];\n          vString = JSON.stringify(regn1);\n          r1 = vString.toFloat();\n        }\n        if (vejrDataJson.hasOwnProperty(\"r24hour\"))\n        {\n          regn24 = vejrDataJson&#91;\"r24hour\"];\n          vString = JSON.stringify(regn24);\n          r24 = vString.toFloat();\n        \n        }\n      }\n    }\n    else{\n      wifiOk = 1;\n    }\n  }\n\n  \/\/ Display data\n  if (tid - dTid > dispUpdate)\n  {\n    dTid = millis();\n\n    if (dispNr == 7)\n    {\n      dispNr = 0;\n    }\n\n    switch (dispNr)\n    {\n    case 0:\n      vaerdi = ut;\n      tekst = \"Temp Ude i \";\n      enhed = (String) char(176);\n      dispNr++;\n      break;\n\n    case 1:\n      vaerdi = it;\n      tekst = \"Temp inde i \";\n      enhed = (String) char(176);\n      dispNr++;\n      break;\n\n    case 2:\n      vaerdi = h;\n      tekst = \"Luftfugtighed \";\n      enhed = \"%\";\n      dispNr++;\n      break;\n\n    case 3:\n      vaerdi = p;\n      tekst = \"Tryk i \";\n      enhed = \"hPa\";\n      dispNr++;\n      break;\n\n    case 4:\n      vaerdi = r15;\n      tekst = \"Regn 15 min \";\n      enhed = \"mm\";\n      dispNr++;\n      break;\n\n    case 5:\n      vaerdi = r1;\n      tekst = \"Regn 1 t \";\n      enhed = \"mm\";\n      dispNr++;\n      break;\n\n    case 6:\n      vaerdi = r24;\n      tekst = \"Regn 24 t \";\n      enhed = \"mm\";\n      dispNr++;\n      break;\n\n    default:\n      break;\n    }\n\n    oled.clearBuffer();\n    if ( hour >= 18 || hour &lt;= 8 ) {\n      oled.setContrast(1);\n      Serial.printf(\"Lav kontrast\");\n    }\n    else\n    {\n      oled.setContrast(255);\n      Serial.println(\"H\u00f8j kontrast\");\n    }\n    \n    if (wifiOk == 1)\n    {\n      Serial.println(\"WIFI AFBRUDT\");\n      oled.setCursor(0, 30);\n      oled.print(\"WiFi AFBRUDT\");\n    }\n    \n    \/\/ Skillelinie\n    oled.drawHLine(0, 19, 128);\n    \n    \/\/ overskrift\n    oled.setCursor(2, 15);\n    oled.setFont(u8g2_font_t0_13b_te);\n    Serial.println(tekst);\n    oled.print(tekst);\n    oled.printf(\"%s\", enhed);\n\n    \/\/ Vaerdi\n    sprintf(buffer, \"%.1f\", vaerdi);\n    strPos = 4 - (strlen(buffer) \/ 2);\n  \n    if ((strlen(buffer) % 2) == 1)\n    {\n      pxStart =  (strPos-1) * 17 + 8 ;\n    }\n    else\n    {\n      pxStart = strPos * 17 - 5;\n    }\n    oled.setCursor(pxStart, 50);\n    oled.setFont(u8g2_font_timR24_tn);\n    Serial.println(buffer);\n    oled.print(buffer);\n    \n    \/\/ Ur\n    oled.setCursor(2, 63);\n    oled.setFont(u8g2_font_6x10_mn);\n    \/\/oled.setFont(u8g2_font_t0_13b_te);\n    sprintf(ur, \"%02d:%02d\", hour, minUr);\n    oled.print(ur);\n    Serial.println(ur);\n\n    \/\/ WIFI signal styrke\n    displayRSSI();\n    \/\/ display indikator\n    dispBullet((dispNr-1));\n    oled.sendBuffer();\n  }\n}\n\nvoid displayRSSI(void)\n{\n  int rssi;\n\n  rssi = WiFi.RSSI();\n  \/\/ Serial.printf(\"RSSI: %d\\n\", rssi);\n\n  \/\/ virkelig godt signal >= -32dBm\n  if (rssi >= -48)\n  {\n    oled.drawHLine(119, 2, 8);\n    oled.drawHLine(119, 3, 8);\n  }\n\n  \/\/ rimeligt signal >= -67dBm\n  if (rssi >= -67)\n  {\n    oled.drawHLine(121, 6, 4);\n    oled.drawHLine(121, 7, 4);\n  }\n\n  \/\/ d\u00e5rligt signal >= 70dBm\n  if (rssi >= -70)\n  {\n    oled.drawHLine(122, 10, 2);\n    oled.drawHLine(122, 11, 2);\n  }\n  \/\/ r\u00f8v signal &lt; 70dBm\n  if (rssi &lt; -70)\n  {\n    oled.drawHLine(122, 10, 1);\n  }\n}\n\nvoid dispBullet(int nr)\n{\n  int x = 125;\n  int y;\n  int i;\n  int r = 2;\n\n  for (i = 0; i &lt;= 6; i++)\n  {\n    y = i * 6 + 25;\n    if (i == nr)\n    {\n      \/\/ fyldt cirkel\n      oled.drawDisc(x, y, r), U8G2_DRAW_ALL;\n    }\n    else\n    {\n      \/\/ Cirkel\n      oled.drawCircle(x, y, r, U8G2_DRAW_ALL);\n    }\n  }\n}\n\nvoid dispData(String tekst, JSONVar vaerdi, String enhed)\n{\n  int strLen = 0;\n  int strPos = 0;\n  int pxStart = 0;\n  String vString;\n\n  \/\/ Ramme\n  \/\/ oled.drawFrame(0, 0, 128, 64);\n\n  \/\/ V\u00e6rdi\n}\n\nString httpGETRequest(const char *serverName)\n{\n  WiFiClient client;\n  HTTPClient http;\n\n  \/\/ Your Domain name with URL path or IP address with path\n  http.begin(client, serverName);\n\n  \/\/ Send HTTP POST request\n  int httpResponseCode = http.GET();\n\n  String payload = \"--\";\n\n  if (httpResponseCode > 0)\n  {\n    Serial.print(\"HTTP Response code: \");\n    Serial.println(httpResponseCode);\n    payload = http.getString();\n  }\n  else\n  {\n    Serial.print(\"Error code: \");\n    Serial.println(httpResponseCode);\n  }\n  \/\/ Free resources\n  http.end();\n\n  return payload;\n}<\/code><\/pre>\n\n\n\n<p>Ikke s\u00e5 meget hokus pokus over dette. Meget er &#8220;l\u00e5nt&#8221; fra diverse tutorials deraf de engelske kommentarer.<\/p>\n\n\n\n<p>N\u00e6ste del, som kommer senere, vil kort beskrive serverdelen.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Diagrammer og software Diagrammerne er ret simple. F\u00f8rst diagrammet over m\u00e5lecomputeren, der h\u00e5ndterer diverse f\u00f8lere. Diagram over m\u00e5leenhed De to kredse til h\u00f8jre er diagrammet over FTDI interface, der bruges til at enten kommunikere med enheden eller reprogrammere den. Denne del har jeg to versioner af, da der opst\u00e5r lidt b\u00f8vl med kommunikationen hvis der&hellip; <a class=\"more-link\" href=\"https:\/\/tomas.dk\/ps\/vejrstation-del-3\/\">L\u00e6s mere <span class=\"screen-reader-text\">Vejrstation del 3<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"gallery","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[12242,12237,6,17],"tags":[12181,12331,12332,12318],"class_list":["post-2700","post","type-post","status-publish","format-gallery","hentry","category-goer-det-selv","category-hobby","category-teknik","category-vejr","tag-arduino","tag-c","tag-esp32","tag-programmering","post_format-post-format-gallery","entry"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/tomas.dk\/ps\/wp-json\/wp\/v2\/posts\/2700","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tomas.dk\/ps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tomas.dk\/ps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tomas.dk\/ps\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tomas.dk\/ps\/wp-json\/wp\/v2\/comments?post=2700"}],"version-history":[{"count":1,"href":"https:\/\/tomas.dk\/ps\/wp-json\/wp\/v2\/posts\/2700\/revisions"}],"predecessor-version":[{"id":2701,"href":"https:\/\/tomas.dk\/ps\/wp-json\/wp\/v2\/posts\/2700\/revisions\/2701"}],"wp:attachment":[{"href":"https:\/\/tomas.dk\/ps\/wp-json\/wp\/v2\/media?parent=2700"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tomas.dk\/ps\/wp-json\/wp\/v2\/categories?post=2700"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tomas.dk\/ps\/wp-json\/wp\/v2\/tags?post=2700"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}