<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>arduino &#8211; Tomas hjemmeside</title>
	<atom:link href="https://tomas.dk/ps/tag/arduino/feed/" rel="self" type="application/rss+xml" />
	<link>https://tomas.dk/ps</link>
	<description>Min foto/vejr/3D print blog</description>
	<lastBuildDate>Sun, 14 Jun 2026 16:17:53 +0000</lastBuildDate>
	<language>da-DK</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>
	<item>
		<title>Vejrstation &#8211; Ny regnmåler</title>
		<link>https://tomas.dk/ps/vejrstation-ny-regnmaaler/</link>
		
		<dc:creator><![CDATA[Tomas Jensen]]></dc:creator>
		<pubDate>Sun, 14 Jun 2026 16:17:48 +0000</pubDate>
				<category><![CDATA[3D]]></category>
		<category><![CDATA[Gør det selv]]></category>
		<category><![CDATA[Hobby]]></category>
		<category><![CDATA[Ikke kategoriseret]]></category>
		<category><![CDATA[Teknik]]></category>
		<category><![CDATA[Vejr]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[arduino]]></category>
		<category><![CDATA[hobby]]></category>
		<category><![CDATA[petg]]></category>
		<category><![CDATA[regn]]></category>
		<guid isPermaLink="false">https://tomas.dk/ps/?p=2957</guid>

					<description><![CDATA[Den gamle regnmåler havde flere problemer og jeg har nu designet en ny.Den ny bruger desuden en hall sensor i stedet for den ustabile proximity sensor jeg brugte før. Regnmåleren er designet i FreeCAD.Tegning og STEP filer kan hentes her:FreeCAD tegning.Montering.Bund.Hall holder.Vipper.Tragt. Hall sensor er af typen 3144. Datasheet.Sensoren er åben kollektor og med schmidt&#8230; <a class="more-link" href="https://tomas.dk/ps/vejrstation-ny-regnmaaler/">Læs mere <span class="screen-reader-text">Vejrstation &#8211; Ny regnmåler</span></a>]]></description>
										<content:encoded><![CDATA[
<figure data-carousel-extra='{&quot;blog_id&quot;:1,&quot;permalink&quot;:&quot;https://tomas.dk/ps/vejrstation-ny-regnmaaler/&quot;}'  class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-medium"><img fetchpriority="high" decoding="async" width="182" height="300" data-attachment-id="2958" data-permalink="https://tomas.dk/ps/vejrstation-ny-regnmaaler/20260614_125306/" data-orig-file="https://tomas.dk/ps/wp-content/uploads/2026/06/20260614_125306.jpg" data-orig-size="1214,2000" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.8&quot;,&quot;camera&quot;:&quot;XQ-BQ52&quot;,&quot;created_timestamp&quot;:&quot;1781441586&quot;,&quot;focal_length&quot;:&quot;14.5&quot;,&quot;iso&quot;:&quot;200&quot;,&quot;shutter_speed&quot;:&quot;0.000625&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="20260614_125306" data-image-description="" data-image-caption="" data-large-file="https://tomas.dk/ps/wp-content/uploads/2026/06/20260614_125306-622x1024.jpg" data-id="2958" src="https://tomas.dk/ps/wp-content/uploads/2026/06/20260614_125306-182x300.jpg" alt="" class="wp-image-2958" srcset="https://tomas.dk/ps/wp-content/uploads/2026/06/20260614_125306-182x300.jpg 182w, https://tomas.dk/ps/wp-content/uploads/2026/06/20260614_125306-622x1024.jpg 622w, https://tomas.dk/ps/wp-content/uploads/2026/06/20260614_125306-91x150.jpg 91w, https://tomas.dk/ps/wp-content/uploads/2026/06/20260614_125306-768x1265.jpg 768w, https://tomas.dk/ps/wp-content/uploads/2026/06/20260614_125306-932x1536.jpg 932w, https://tomas.dk/ps/wp-content/uploads/2026/06/20260614_125306.jpg 1214w" sizes="(max-width: 182px) 100vw, 182px" /></figure>
</figure>



<p class="wp-block-paragraph">Den gamle regnmåler havde flere problemer og jeg har nu designet en ny.<br />Den ny bruger desuden en hall sensor i stedet for den ustabile proximity sensor jeg brugte før.</p>



<figure data-carousel-extra='{&quot;blog_id&quot;:1,&quot;permalink&quot;:&quot;https://tomas.dk/ps/vejrstation-ny-regnmaaler/&quot;}'  class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img decoding="async" width="645" height="970" data-attachment-id="2962" data-permalink="https://tomas.dk/ps/vejrstation-ny-regnmaaler/screenshot_20260614_130046/" data-orig-file="https://tomas.dk/ps/wp-content/uploads/2026/06/Screenshot_20260614_130046.png" data-orig-size="645,970" data-comments-opened="1" data-image-title="Screenshot_20260614_130046" data-image-description="" data-image-caption="" data-large-file="https://tomas.dk/ps/wp-content/uploads/2026/06/Screenshot_20260614_130046.png" data-id="2962" src="https://tomas.dk/ps/wp-content/uploads/2026/06/Screenshot_20260614_130046.png" alt="" class="wp-image-2962" srcset="https://tomas.dk/ps/wp-content/uploads/2026/06/Screenshot_20260614_130046.png 645w, https://tomas.dk/ps/wp-content/uploads/2026/06/Screenshot_20260614_130046-199x300.png 199w, https://tomas.dk/ps/wp-content/uploads/2026/06/Screenshot_20260614_130046-100x150.png 100w" sizes="(max-width: 645px) 100vw, 645px" /></figure>



<figure class="wp-block-image size-large"><img decoding="async" width="457" height="504" data-attachment-id="2961" data-permalink="https://tomas.dk/ps/vejrstation-ny-regnmaaler/screenshot_20251217_203523/" data-orig-file="https://tomas.dk/ps/wp-content/uploads/2026/06/Screenshot_20251217_203523.png" data-orig-size="457,504" data-comments-opened="1" data-image-title="Screenshot_20251217_203523" data-image-description="" data-image-caption="" data-large-file="https://tomas.dk/ps/wp-content/uploads/2026/06/Screenshot_20251217_203523.png" data-id="2961" src="https://tomas.dk/ps/wp-content/uploads/2026/06/Screenshot_20251217_203523.png" alt="" class="wp-image-2961" srcset="https://tomas.dk/ps/wp-content/uploads/2026/06/Screenshot_20251217_203523.png 457w, https://tomas.dk/ps/wp-content/uploads/2026/06/Screenshot_20251217_203523-272x300.png 272w, https://tomas.dk/ps/wp-content/uploads/2026/06/Screenshot_20251217_203523-136x150.png 136w" sizes="(max-width: 457px) 100vw, 457px" /></figure>
</figure>



<p class="wp-block-paragraph">Regnmåleren er designet i FreeCAD.<br />Tegning og STEP filer kan hentes her:<br /><a href="https://tomas.dk/dowload/VejrStation/Bund_vippe_V3.FCStd">FreeCAD tegning</a>.<br /><a href="https://tomas.dk/download/VejrStation/STL/Bund_vippe_V3-Montering.step">Montering</a>.<br /><a href="https://tomas.dk/download/VejrStation/STL/Bund_vippe_V3-Emne.step">Bund</a>.<br /><a href="https://tomas.dk/download/VejrStation/STL/Bund_vippe_V3-HallHolder.step">Hall holder.</a><br /><a href="https://tomas.dk/download/VejrStation/STL/Bund_vippe_V3-Vipper.step" data-type="link" data-id="https://tomas.dk/download/VejrStation/STL/Bund_vippe_V3-Vipper.step">Vipper</a>.<br /><a href="https://tomas.dk/download/VejrStation/STL/Bund_vippe_V3-Tragt.step" data-type="link" data-id="https://tomas.dk/download/VejrStation/STL/Bund_vippe_V3-Tragt.step">Tragt</a>.</p>



<p class="wp-block-paragraph">Hall sensor er af typen 3144. <a href="https://www.alldatasheet.com/view.jsp?Searchword=A3144&amp;gad_source=1&amp;gad_campaignid=163179484&amp;gbraid=0AAAAADcdDU_ZwPvSa6oWDc77HBki6i4gZ&amp;gclid=Cj0KCQjwornRBhCrARIsAON5exHAsCc9Wxe0rKYJe2MucllPX7M5rmEroStTUPv1_l0abHnkSzpVr-gaAoKtEALw_wcB" data-type="link" data-id="https://www.alldatasheet.com/view.jsp?Searchword=A3144&amp;gad_source=1&amp;gad_campaignid=163179484&amp;gbraid=0AAAAADcdDU_ZwPvSa6oWDc77HBki6i4gZ&amp;gclid=Cj0KCQjwornRBhCrARIsAON5exHAsCc9Wxe0rKYJe2MucllPX7M5rmEroStTUPv1_l0abHnkSzpVr-gaAoKtEALw_wcB">Datasheet</a>.<br />Sensoren er åben kollektor og med schmidt trigger. Den virker føler på syd pol ind mod tekstsiden. Magneten jeg har brugt er taget fra en Morten Ingemann kalender. Den er 2 mm tyk og polerne ligger på den smalle led. Magneten blev knækket med to tænger for at få den rigtige længde, ca. 3mm. Den limes fast på vipperen med sekundlim.</p>



<p class="wp-block-paragraph">Til samling skal der bruges 4 x 3mm rustfri maskinskruer og et stykke 1,5m2 kobbertråd til aksel i vipperen.<br />Årsagen til, at jeg har brugt kobbertråd, er at det er nemt at arbejde med og at det ikke ruster.</p>



<p class="wp-block-paragraph">Alle dele er printet i PETG. Alle indstillinger er default, så ikke noget hokus pokus på printeren. Vipperen printes vandret, så den bliver helt symmetrisk.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2957</post-id>	</item>
		<item>
		<title>Vejrstation del 3</title>
		<link>https://tomas.dk/ps/vejrstation-del-3/</link>
		
		<dc:creator><![CDATA[Tomas Jensen]]></dc:creator>
		<pubDate>Mon, 30 Dec 2024 14:58:27 +0000</pubDate>
				<category><![CDATA[Gør det selv]]></category>
		<category><![CDATA[Hobby]]></category>
		<category><![CDATA[Teknik]]></category>
		<category><![CDATA[Vejr]]></category>
		<category><![CDATA[arduino]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[esp32]]></category>
		<category><![CDATA[programmering]]></category>
		<guid isPermaLink="false">https://tomas.dk/ps/?p=2700</guid>

					<description><![CDATA[Diagrammer og software Diagrammerne er ret simple. Først diagrammet over målecomputeren, der håndterer diverse følere. Diagram over måleenhed De to kredse til højre 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år lidt bøvl med kommunikationen hvis der&#8230; <a class="more-link" href="https://tomas.dk/ps/vejrstation-del-3/">Læs mere <span class="screen-reader-text">Vejrstation del 3</span></a>]]></description>
										<content:encoded><![CDATA[
<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;camera&quot;:&quot;XQ-BQ52&quot;,&quot;created_timestamp&quot;:&quot;1731873655&quot;,&quot;focal_length&quot;:&quot;10.22&quot;,&quot;iso&quot;:&quot;200&quot;,&quot;shutter_speed&quot;:&quot;0.05&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="TempUde" data-image-description="" data-image-caption="" 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>



<h2 class="wp-block-heading">Diagrammer og software</h2>



<p class="wp-block-paragraph">Diagrammerne er ret simple. </p>



<p class="wp-block-paragraph">Først diagrammet over målecomputeren, der håndterer diverse følere.</p>



<h2 class="wp-block-heading">Diagram over måleenhed</h2>



<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-title="SCH_ArduinoMålestation_1-P1_2024-12-30" data-image-description="" data-image-caption="" 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>



<p class="wp-block-paragraph">De to kredse til højre 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år lidt bøvl med kommunikationen hvis der ikke laves en lille ændring. Der sker, det at DTR går lav når python eller andet software vil kommunikere med en arduino. Dette skal den iflg. rs232 protokollen, men det gør desværre at en arduino genstarter, da den ser det som om at den skal programmeres. For at undgå dette afbrydes DTR når enheden benyttes som vejrstation.<br />Seriel kommunikation fungerer heldigvis fint uden DTR.<br />Hvis der skal lægges rettelser på, skal DTR reetableres for at man kan overføre ny software.</p>



<p class="wp-block-paragraph">Herunder er koden til målecomputeren.</p>



<pre class="wp-block-code has-black-color has-text-color has-link-color wp-elements-1" style="padding-top:0;padding-bottom:0;font-size:9px;line-height:1"><code>#include &lt;Arduino.h>
#include &lt;dhtnew.h>

#include &lt;Adafruit_Sensor.h>
#include &lt;Adafruit_BMP280.h>
#include &lt;Wire.h>
#include &lt;Adafruit_Sensor.h>

// put function declarations here:
// 
float getTempIn(void);
float getTempOut(void);
float getPress(void);
float getOutHumid(void);
void  rainInt(void);
void  rollRain(int);
float getRain5(void);
float getRain(void);

//Constants
#define DHTPIN 5
#define RAINPIN 2

// Init temp/hum sensor
DHTNEW outdoorSensor(DHTPIN);

#define OUTTEMP_ADJUST  -1.16
#define INTEMP_ADJUST   -1.58

// Init pressure sensor
Adafruit_BMP280 bmp;

// Variable
float tryk;
float indetemp;
String cmd = "";
volatile int rain = 0;
volatile unsigned long pulseTime = millis();
volatile unsigned long lastPulseTime = pulseTime;
int rain5 = 0;
unsigned long nuTid;
unsigned long tid;
float VIPFAKTOR = 0.408;
int minRain&#91;5] = {0, 0, 0, 0, 0};

void setup() {
  Serial.begin(9600);
	Serial.println("Klargør hardware");
  Serial.println();

  // trykmaaler
  while (!bmp.begin(0x76)) {
    Serial.println("Kunne ikke finde BMP280!!!");
    delay(5000);
  }

  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     /* Operating Mode. */
                  Adafruit_BMP280::SAMPLING_X2,     /* Temp. oversampling */
                  Adafruit_BMP280::SAMPLING_X16,    /* Pressure oversampling */
                  Adafruit_BMP280::FILTER_X16,      /* Filtering. */
                  Adafruit_BMP280::STANDBY_MS_500);  /* Standby time. */
  Serial.println("BMP280 klar");

  // Setup interrupt for regnmåler
  pinMode(RAINPIN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(RAINPIN), rainInt, FALLING);
  Serial.println("Interrupt klar");

  Serial.println("Vejrstation klar");
  nuTid = millis();
}

void loop() {
  // Seriel kommunikation
  // --------------------
  if ( Serial.available() ) {
    cmd = Serial.readStringUntil('\n');
  
    cmd.trim();
    if ( cmd.equalsIgnoreCase("getTempIn")) {
      //Serial.print("Inde Temperatur ");
      Serial.println(getTempIn());
    } 
    else if ( cmd.equalsIgnoreCase("getTempOut")) {
      //Serial.print("Ude Temperatur ");
      Serial.println(getTempOut());
    } 
    else if ( cmd.equalsIgnoreCase("getPress")) {
      //Serial.print("tryk ");
      Serial.println(getPress());
    } 
    else if ( cmd.equalsIgnoreCase("getOutHumidity")) {
      //Serial.print("ude luftfugtighed ");
      Serial.println(getOutHumid());
    }
    else if ( cmd.equalsIgnoreCase("getRain5")) {
      Serial.println(getRain5());
    }
    else if ( cmd.equalsIgnoreCase("getRain1")) {
      Serial.println(getRain());
    }
    else {
      //Serial.print("Ukendt kommando: ");
      Serial.println("?: " + cmd);
    }
  }

  // Regnmåler 
  // ---------
  tid = millis();
  if (tid >= nuTid + 60000) {
    rollRain(rain);
    rain = 0;
    nuTid = tid;
  }

}

float getRain5(void) {
  int i;
  int rain5 = 0;
  float mm;
  for (i=0; i&lt;5; i++){
    rain5 += minRain&#91;i];
    // Serial.println(minRain&#91;i]);
  }
  mm = rain5 * VIPFAKTOR;
  return mm;
}

float getRain(void) {
  float mm;

  mm = minRain&#91;4] * VIPFAKTOR;
  return mm;
}

void rollRain(int r1){
  int i;
  rain5 = 0;
  // sum 5 min regn
  for (i = 0; i &lt; 5; i++) {
    rain5 += minRain&#91;i];
  }

  // rul rain5
  for (i = 1; i &lt; 5; i++) {
    minRain&#91;i - 1] = minRain&#91;i];
  }
  minRain&#91;4] = r1;
}

void rainInt(void) {
  pulseTime = millis();
  if (pulseTime - lastPulseTime > 5000) {
    rain++;
  } else {
    rain = 0;
  }
  lastPulseTime = pulseTime;
}

float getTempIn(void){
  float indetemp;
  indetemp = bmp.readTemperature() + INTEMP_ADJUST;
  return indetemp;
}

float getTempOut(void) {
  float udeTemp;
  outdoorSensor.read();
  udeTemp = outdoorSensor.getTemperature() + OUTTEMP_ADJUST;
  return udeTemp;
}

float getOutHumid(void) {
  float hum;
  outdoorSensor.read();
  hum = outdoorSensor.getHumidity();
  return hum;
}

float getPress(void){
  tryk = bmp.readPressure()/100+4.4;
  return tryk;
}
</code></pre>



<p class="wp-block-paragraph">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>



<p class="wp-block-paragraph">Dette er interrupt rutinen. Den tæller op, når der kommer en puls fra regnmåleren, medmindre der er gået under 5 sekunder mellem to pulser. Dette ses som støj og der tælles ikke op.</p>



<h2 class="wp-block-heading">Diagram over displayenheden</h2>



<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-title="OLEDDisplay_schem" data-image-description="" data-image-caption="" 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>



<p class="wp-block-paragraph">Igen et meget simpelt kredsløb. Alt kommunikation med denne enhed er via et web kald.</p>



<p class="wp-block-paragraph">Herunder koden:</p>



<pre class="wp-block-code" style="font-size:9px;line-height:1"><code>#include &lt;Arduino.h>

/*


  U8G2_SSD1306_128X64_NONAME_1_4W_HW_SPI u8g2
  make -f Makefile.184.uno

   text
   8732	    					default, all active
   8500	    -232	    -2.65%		no U8G2_WITH_CLIP_WINDOW_SUPPORT
   8316	    -416	    -4.76%		no U8G2_WITH_FONT_ROTATION
   8606	    -126	    -1.44%	 	no U8G2_WITH_UNICODE
   8692	    -40	    -0.45%		no U8G2_WITH_INTERSECTION
   8328	    -404	    -4.62%	  	no U8G2_WITH_INTERSECTION  no U8G2_WITH_CLIP_WINDOW_SUPPORT
   8718	    -14	    -4.86%		no U8G2_WITH_HVLINE_SPEED_OPTIMIZATION
   8026	    -706	    -8.08%		no U8G2_WITH_FONT_ROTATION   no U8G2_WITH_INTERSECTION  no U8G2_WITH_CLIP_WINDOW_SUPPORT

   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
   as `U8G2_WITH_CLIP_WINDOW_SUPPORT` is requested.

*/

#include &lt;Arduino.h>
#include &lt;U8g2lib.h>
#include &lt;WiFi.h>
#include &lt;HTTPClient.h>
#include &lt;Arduino_JSON.h>
#include &lt;OneWire.h>
#include &lt;DallasTemperature.h>

#ifdef U8X8_HAVE_HW_SPI
#include &lt;SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include &lt;Wire.h>
#endif

#define FALSE 1
#define TRUE 0
const int ONEWIREPIN = 4;

// init oled
//U8G2_SH1106_128X64_NONAME_F_HW_I2C oled(U8G2_R0, /* reset=*/U8X8_PIN_NONE);
//U8G2_SSD1309_128X64_NONAME2_F_HW_I2C oled(U8G2_R0, /*reset=*/U8X8_PIN_NONE);
U8G2_SSD1309_128X64_NONAME0_F_HW_I2C oled(U8G2_R0, /*reset=*/U8X8_PIN_NONE);

// init onewire og sensor
OneWire oneWire(ONEWIREPIN);
DallasTemperature indeSensor(&amp;oneWire);

// WiFi setup
const char *ssid = "DIN_SSID";
const char *password = "SSID_PASSWORD";

// URL for vejrdata
const char *vejrDataURL = "URL_for_data";

JSONVar udeTemp = "-99.99";
JSONVar indeTemp = "-99.99";
JSONVar regn1 = "-99.99";
JSONVar regn24 = "-99.99";
JSONVar regn15 = "-99.99";
JSONVar humid = "-99.99";
JSONVar tryk = "-9999.99";
JSONVar tidString = "--";

unsigned JsonOk = FALSE;
int dispNr = 0;

unsigned long sidsteTid = millis(); // Web Refresh
unsigned long tid = 0;              // Tid nu
unsigned long dTid = millis();      // Display Refresh
const long interval = 60000;
const long webInterval = 60000;
const long dispUpdate = 5000;
unsigned int wifiOk = FALSE; // 1 = notok 0 = ok
const int cpuSpeedSaving = 80;
int strLen = 0;
int strPos = 0;
int pxStart = 0;
int nLen = 0;
int firstRead = 1;
int hour = 0;
int minUr = 0;
String vString = "";
String tekst = "";
String enhed = "";
String maalinger = "";
String sysTid = "";
float ut = 999.9;
float it = 999.9;
float r1 = 999.9;
float r15 = 999.9;
float r24 = 999.9;
float h = 999.9;
float p = 999.9;
char buffer&#91;30];
char ur&#91;5];

float vaerdi = 0.0;

// funtioner deklarationer
void displayRSSI(void);
String httpGETRequest(const char *serverName);
void dispData(String, JSONVar, String);
void dispBullet(int);

void setup(void)
{
  setCpuFrequencyMhz(cpuSpeedSaving);
  delay(500);
  // seriel baud rate
  Serial.begin(115200);
  // oled display
  oled.begin();
  // Temp sensor
  indeSensor.begin();

  // Wifi
  //WiFi.hostname("espWeather");
  WiFi.begin(ssid, password);

  Serial.print("CPU speed: ");
  Serial.println(getCpuFrequencyMhz());
  Serial.println("Forbinder");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  // Set wifi sleep mode
  WiFi.setSleep(true);

  Serial.println("");
  Serial.print("Forbundet til WiFi med IP Adresse: ");
  Serial.println(WiFi.localIP());
  wifiOk = 0;
}

void loop(void)
{

  // Spørg efter data på webserver
  tid = millis();
  if (((tid - sidsteTid) > webInterval) || (firstRead == 1))
  {
    firstRead = 0;
    sidsteTid = millis();

    // Aflæs indesensor
    indeSensor.requestTemperatures();
    it = indeSensor.getTempCByIndex(0);
    Serial.printf("Inde temp: %.1f\n", it);

    // Tjek wifi
    if (WiFi.status() == WL_CONNECTED)
    {
      wifiOk = 0;
      maalinger = httpGETRequest(vejrDataURL);
      // Serial.println(maalinger);
      JSONVar vejrDataJson = JSON.parse(maalinger);
      if (JSON.typeof(vejrDataJson) == "undefined")
      {
        Serial.println("Fejl i modtagne JSON");
        JsonOk = FALSE;
      }
      else
      {
        JsonOk = TRUE;
        Serial.println(vejrDataJson);
        if (vejrDataJson.hasOwnProperty("systid"))
        {
          tidString = vejrDataJson&#91;"systid"];
          vString = JSON.stringify(tidString);
          hour = vString.substring(12, 14).toInt();
          minUr = vString.substring(15, 17).toInt();
          //Serial.println(hour);
        }
        if (vejrDataJson.hasOwnProperty("tryk"))
        {
          tryk = vejrDataJson&#91;"tryk"];
          vString = JSON.stringify(tryk);
          p = vString.toFloat();
        }
        if (vejrDataJson.hasOwnProperty("tempout"))
        {
          udeTemp = vejrDataJson&#91;"tempout"];
          vString = JSON.stringify(udeTemp);
          ut = vString.toFloat();
        }
        if (vejrDataJson.hasOwnProperty("rhout"))
        {
          humid = vejrDataJson&#91;"rhout"];
          vString = JSON.stringify(humid);
          h = vString.toFloat();
        }
        if (vejrDataJson.hasOwnProperty("r15min"))
        {
          regn15 = vejrDataJson&#91;"r15min"];
          vString = JSON.stringify(regn15);
          r15 = vString.toFloat();
        }
        if (vejrDataJson.hasOwnProperty("r1hour"))
        {
          regn1 = vejrDataJson&#91;"r1hour"];
          vString = JSON.stringify(regn1);
          r1 = vString.toFloat();
        }
        if (vejrDataJson.hasOwnProperty("r24hour"))
        {
          regn24 = vejrDataJson&#91;"r24hour"];
          vString = JSON.stringify(regn24);
          r24 = vString.toFloat();
        
        }
      }
    }
    else{
      wifiOk = 1;
    }
  }

  // Display data
  if (tid - dTid > dispUpdate)
  {
    dTid = millis();

    if (dispNr == 7)
    {
      dispNr = 0;
    }

    switch (dispNr)
    {
    case 0:
      vaerdi = ut;
      tekst = "Temp Ude i ";
      enhed = (String) char(176);
      dispNr++;
      break;

    case 1:
      vaerdi = it;
      tekst = "Temp inde i ";
      enhed = (String) char(176);
      dispNr++;
      break;

    case 2:
      vaerdi = h;
      tekst = "Luftfugtighed ";
      enhed = "%";
      dispNr++;
      break;

    case 3:
      vaerdi = p;
      tekst = "Tryk i ";
      enhed = "hPa";
      dispNr++;
      break;

    case 4:
      vaerdi = r15;
      tekst = "Regn 15 min ";
      enhed = "mm";
      dispNr++;
      break;

    case 5:
      vaerdi = r1;
      tekst = "Regn 1 t ";
      enhed = "mm";
      dispNr++;
      break;

    case 6:
      vaerdi = r24;
      tekst = "Regn 24 t ";
      enhed = "mm";
      dispNr++;
      break;

    default:
      break;
    }

    oled.clearBuffer();
    if ( hour >= 18 || hour &lt;= 8 ) {
      oled.setContrast(1);
      Serial.printf("Lav kontrast");
    }
    else
    {
      oled.setContrast(255);
      Serial.println("Høj kontrast");
    }
    
    if (wifiOk == 1)
    {
      Serial.println("WIFI AFBRUDT");
      oled.setCursor(0, 30);
      oled.print("WiFi AFBRUDT");
    }
    
    // Skillelinie
    oled.drawHLine(0, 19, 128);
    
    // overskrift
    oled.setCursor(2, 15);
    oled.setFont(u8g2_font_t0_13b_te);
    Serial.println(tekst);
    oled.print(tekst);
    oled.printf("%s", enhed);

    // Vaerdi
    sprintf(buffer, "%.1f", vaerdi);
    strPos = 4 - (strlen(buffer) / 2);
  
    if ((strlen(buffer) % 2) == 1)
    {
      pxStart =  (strPos-1) * 17 + 8 ;
    }
    else
    {
      pxStart = strPos * 17 - 5;
    }
    oled.setCursor(pxStart, 50);
    oled.setFont(u8g2_font_timR24_tn);
    Serial.println(buffer);
    oled.print(buffer);
    
    // Ur
    oled.setCursor(2, 63);
    oled.setFont(u8g2_font_6x10_mn);
    //oled.setFont(u8g2_font_t0_13b_te);
    sprintf(ur, "%02d:%02d", hour, minUr);
    oled.print(ur);
    Serial.println(ur);

    // WIFI signal styrke
    displayRSSI();
    // display indikator
    dispBullet((dispNr-1));
    oled.sendBuffer();
  }
}

void displayRSSI(void)
{
  int rssi;

  rssi = WiFi.RSSI();
  // Serial.printf("RSSI: %d\n", rssi);

  // virkelig godt signal >= -32dBm
  if (rssi >= -48)
  {
    oled.drawHLine(119, 2, 8);
    oled.drawHLine(119, 3, 8);
  }

  // rimeligt signal >= -67dBm
  if (rssi >= -67)
  {
    oled.drawHLine(121, 6, 4);
    oled.drawHLine(121, 7, 4);
  }

  // dårligt signal >= 70dBm
  if (rssi >= -70)
  {
    oled.drawHLine(122, 10, 2);
    oled.drawHLine(122, 11, 2);
  }
  // røv signal &lt; 70dBm
  if (rssi &lt; -70)
  {
    oled.drawHLine(122, 10, 1);
  }
}

void dispBullet(int nr)
{
  int x = 125;
  int y;
  int i;
  int r = 2;

  for (i = 0; i &lt;= 6; i++)
  {
    y = i * 6 + 25;
    if (i == nr)
    {
      // fyldt cirkel
      oled.drawDisc(x, y, r), U8G2_DRAW_ALL;
    }
    else
    {
      // Cirkel
      oled.drawCircle(x, y, r, U8G2_DRAW_ALL);
    }
  }
}

void dispData(String tekst, JSONVar vaerdi, String enhed)
{
  int strLen = 0;
  int strPos = 0;
  int pxStart = 0;
  String vString;

  // Ramme
  // oled.drawFrame(0, 0, 128, 64);

  // Værdi
}

String httpGETRequest(const char *serverName)
{
  WiFiClient client;
  HTTPClient http;

  // Your Domain name with URL path or IP address with path
  http.begin(client, serverName);

  // Send HTTP POST request
  int httpResponseCode = http.GET();

  String payload = "--";

  if (httpResponseCode > 0)
  {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http.getString();
  }
  else
  {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  // Free resources
  http.end();

  return payload;
}</code></pre>



<p class="wp-block-paragraph">Ikke så meget hokus pokus over dette. Meget er &#8220;lånt&#8221; fra diverse tutorials deraf de engelske kommentarer.</p>



<p class="wp-block-paragraph">Næste del, som kommer senere, vil kort beskrive serverdelen.</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2700</post-id>	</item>
		<item>
		<title>Lydmålinger med arduino</title>
		<link>https://tomas.dk/ps/lydmaalinger-med-arduino/</link>
		
		<dc:creator><![CDATA[Tomas Jensen]]></dc:creator>
		<pubDate>Thu, 16 Aug 2018 09:20:29 +0000</pubDate>
				<category><![CDATA[Teknik]]></category>
		<category><![CDATA[arduino]]></category>
		<category><![CDATA[lyd]]></category>
		<category><![CDATA[motorvej]]></category>
		<guid isPermaLink="false">https://tomas.dk/ps/?p=1771</guid>

					<description><![CDATA[I efteråret 2017 startede vejdirektoratet med at udvide motorvejen omkring Skanderborg. I den forbindelse bliver der opført støjvolde langs dele af motorvejen. Da jeg ikke bor langt fra motorvejen ville jeg undersøge om støjen fra motorvejen kunne måles nogenlunde præcist med simple midler. Jeg har lidt erfaringer med arduino og derfor valgte jeg at bruge&#8230; <a class="more-link" href="https://tomas.dk/ps/lydmaalinger-med-arduino/">Læs mere <span class="screen-reader-text">Lydmålinger med arduino</span></a>]]></description>
										<content:encoded><![CDATA[<p>I efteråret 2017 startede vejdirektoratet med at udvide motorvejen omkring Skanderborg. I den forbindelse bliver der opført støjvolde langs dele af motorvejen.</p>
<p>Da jeg ikke bor langt fra motorvejen ville jeg undersøge om støjen fra motorvejen kunne måles nogenlunde præcist med simple midler. Jeg har lidt erfaringer med arduino og derfor valgte jeg at bruge denne simple computer. Der er dog lidt udfordringer med denne, da den ikke er i stand til at måle mere end en forskel i lydtryk på 48dB da dens A/D converter er på 10bit.</p>
<figure style="width: 697px" class="wp-caption alignnone"><img loading="lazy" decoding="async" src="https://vejr.tomas.dk/dbGraf/db-daily.png" alt="" width="697" height="455"/><figcaption class="wp-caption-text">Daglig måling (5 minutter snit)</figcaption></figure>
<p>Og en komplet oversigt her: <a href="https://tomas.dk/dbGraf/dbGrafer.html">Lydmålinger</a></p>


<p class="has-text-color has-vivid-red-color wp-block-paragraph">Update pr. 26. november 2018:<br />Mikrofonen er stået af pga. regn.</p>



<p class="has-text-color has-vivid-red-color wp-block-paragraph">Update pr. 3. december 2018:<br />Mikrofonen kan ikke redes. Der måles ikke mere . . .</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1771</post-id>	</item>
	</channel>
</rss>
