Files
Maison/index.html
2026-02-10 13:23:15 +01:00

899 lines
84 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" prefix="" lang="en-GB">
<head>
<meta charset="UTF-8" />
<title>
Arduino to PlatformIO project conversion | Willem&#039;s Website </title>
<link rel="profile" href="https://gmpg.org/xfn/11" />
<link rel="stylesheet" type="text/css" media="all" href="https://willem.aandewiel.nl/wp-content/themes/twentyten/style.css?ver=20250415" />
<link rel="pingback" href="https://willem.aandewiel.nl/xmlrpc.php">
<!-- BEGIN Metadata added by the Add-Meta-Tags WordPress plugin -->
<meta name="description" content="I developed hardware for a friend to control the underfloor heating of his house more effectively and efficiently. To test this hardware I wrote software with the Arduino IDE. For me the only way I knew." />
<meta name="keywords" content="python, python3, arduino, arduino ide, ide, platformio, visual studio code, vsc, vscode, conversion, conversie" />
<!-- END Metadata added by the Add-Meta-Tags WordPress plugin -->
<meta name='robots' content='max-image-preview:large' />
<style>img:is([sizes="auto" i], [sizes^="auto," i]) { contain-intrinsic-size: 3000px 1500px }</style>
<link rel="alternate" type="application/rss+xml" title="Willem&#039;s Website &raquo; Feed" href="https://willem.aandewiel.nl/index.php/feed/" />
<link rel="alternate" type="application/rss+xml" title="Willem&#039;s Website &raquo; Comments Feed" href="https://willem.aandewiel.nl/index.php/comments/feed/" />
<link rel="alternate" type="application/rss+xml" title="Willem&#039;s Website &raquo; Arduino to PlatformIO project conversion Comments Feed" href="https://willem.aandewiel.nl/index.php/2024/08/16/arduino-to-platformio-project-conversion/feed/" />
<script type="text/javascript">
/* <![CDATA[ */
window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/16.0.1\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/16.0.1\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/willem.aandewiel.nl\/wp-includes\/js\/wp-emoji-release.min.js?ver=6.8.2"}};
/*! This file is auto-generated */
!function(s,n){var o,i,e;function c(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function p(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data),a=(e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0),new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data));return t.every(function(e,t){return e===a[t]})}function u(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);for(var n=e.getImageData(16,16,1,1),a=0;a<n.data.length;a++)if(0!==n.data[a])return!1;return!0}function f(e,t,n,a){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!a(e,"\ud83e\udedf")}return!1}function g(e,t,n,a){var r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):s.createElement("canvas"),o=r.getContext("2d",{willReadFrequently:!0}),i=(o.textBaseline="top",o.font="600 32px Arial",{});return e.forEach(function(e){i[e]=t(o,e,n,a)}),i}function t(e){var t=s.createElement("script");t.src=e,t.defer=!0,s.head.appendChild(t)}"undefined"!=typeof Promise&&(o="wpEmojiSettingsSupports",i=["flag","emoji"],n.supports={everything:!0,everythingExceptFlag:!0},e=new Promise(function(e){s.addEventListener("DOMContentLoaded",e,{once:!0})}),new Promise(function(t){var n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+g.toString()+"("+[JSON.stringify(i),f.toString(),p.toString(),u.toString()].join(",")+"));",a=new Blob([e],{type:"text/javascript"}),r=new Worker(URL.createObjectURL(a),{name:"wpTestEmojiSupports"});return void(r.onmessage=function(e){c(n=e.data),r.terminate(),t(n)})}catch(e){}c(n=g(i,f,p,u))}t(n)}).then(function(e){for(var t in e)n.supports[t]=e[t],n.supports.everything=n.supports.everything&&n.supports[t],"flag"!==t&&(n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&n.supports[t]);n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&!n.supports.flag,n.DOMReady=!1,n.readyCallback=function(){n.DOMReady=!0}}).then(function(){return e}).then(function(){var e;n.supports.everything||(n.readyCallback(),(e=n.source||{}).concatemoji?t(e.concatemoji):e.wpemoji&&e.twemoji&&(t(e.twemoji),t(e.wpemoji)))}))}((window,document),window._wpemojiSettings);
/* ]]> */
</script>
<link rel='stylesheet' id='sgr-css' href='https://willem.aandewiel.nl/wp-content/plugins/simple-google-recaptcha/sgr.css?ver=1756203142' type='text/css' media='all' />
<style id='wp-emoji-styles-inline-css' type='text/css'>
img.wp-smiley, img.emoji {
display: inline !important;
border: none !important;
box-shadow: none !important;
height: 1em !important;
width: 1em !important;
margin: 0 0.07em !important;
vertical-align: -0.1em !important;
background: none !important;
padding: 0 !important;
}
</style>
<link rel='stylesheet' id='wp-block-library-css' href='https://willem.aandewiel.nl/wp-includes/css/dist/block-library/style.min.css?ver=6.8.2' type='text/css' media='all' />
<style id='wp-block-library-theme-inline-css' type='text/css'>
.wp-block-audio :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-audio :where(figcaption){color:#ffffffa6}.wp-block-audio{margin:0 0 1em}.wp-block-code{border:1px solid #ccc;border-radius:4px;font-family:Menlo,Consolas,monaco,monospace;padding:.8em 1em}.wp-block-embed :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-embed :where(figcaption){color:#ffffffa6}.wp-block-embed{margin:0 0 1em}.blocks-gallery-caption{color:#555;font-size:13px;text-align:center}.is-dark-theme .blocks-gallery-caption{color:#ffffffa6}:root :where(.wp-block-image figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme :root :where(.wp-block-image figcaption){color:#ffffffa6}.wp-block-image{margin:0 0 1em}.wp-block-pullquote{border-bottom:4px solid;border-top:4px solid;color:currentColor;margin-bottom:1.75em}.wp-block-pullquote cite,.wp-block-pullquote footer,.wp-block-pullquote__citation{color:currentColor;font-size:.8125em;font-style:normal;text-transform:uppercase}.wp-block-quote{border-left:.25em solid;margin:0 0 1.75em;padding-left:1em}.wp-block-quote cite,.wp-block-quote footer{color:currentColor;font-size:.8125em;font-style:normal;position:relative}.wp-block-quote:where(.has-text-align-right){border-left:none;border-right:.25em solid;padding-left:0;padding-right:1em}.wp-block-quote:where(.has-text-align-center){border:none;padding-left:0}.wp-block-quote.is-large,.wp-block-quote.is-style-large,.wp-block-quote:where(.is-style-plain){border:none}.wp-block-search .wp-block-search__label{font-weight:700}.wp-block-search__button{border:1px solid #ccc;padding:.375em .625em}:where(.wp-block-group.has-background){padding:1.25em 2.375em}.wp-block-separator.has-css-opacity{opacity:.4}.wp-block-separator{border:none;border-bottom:2px solid;margin-left:auto;margin-right:auto}.wp-block-separator.has-alpha-channel-opacity{opacity:1}.wp-block-separator:not(.is-style-wide):not(.is-style-dots){width:100px}.wp-block-separator.has-background:not(.is-style-dots){border-bottom:none;height:1px}.wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots){height:2px}.wp-block-table{margin:0 0 1em}.wp-block-table td,.wp-block-table th{word-break:normal}.wp-block-table :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-table :where(figcaption){color:#ffffffa6}.wp-block-video :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-video :where(figcaption){color:#ffffffa6}.wp-block-video{margin:0 0 1em}:root :where(.wp-block-template-part.has-background){margin-bottom:0;margin-top:0;padding:1.25em 2.375em}
</style>
<style id='classic-theme-styles-inline-css' type='text/css'>
/*! This file is auto-generated */
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
</style>
<style id='global-styles-inline-css' type='text/css'>
:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #fff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--color--blue: #0066cc;--wp--preset--color--medium-gray: #666;--wp--preset--color--light-gray: #f1f1f1;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
:root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;}
</style>
<link rel='stylesheet' id='plyr-css-css' href='https://willem.aandewiel.nl/wp-content/plugins/easy-video-player/lib/plyr.css?ver=6.8.2' type='text/css' media='all' />
<link rel='stylesheet' id='spacexchimp_p008-font-awesome-css-frontend-css' href='https://willem.aandewiel.nl/wp-content/plugins/simple-scroll-to-top-button/inc/lib/font-awesome/css/font-awesome.css?ver=4.46' type='text/css' media='screen' />
<link rel='stylesheet' id='spacexchimp_p008-frontend-css-css' href='https://willem.aandewiel.nl/wp-content/plugins/simple-scroll-to-top-button/inc/css/frontend.css?ver=4.46' type='text/css' media='all' />
<style id='spacexchimp_p008-frontend-css-inline-css' type='text/css'>
#ssttbutton {
font-size: 32px;
}
.ssttbutton-background {
color: #fff;
}
.ssttbutton-symbol {
color: #dd3333;
}
</style>
<link rel='stylesheet' id='stcr-font-awesome-css' href='https://willem.aandewiel.nl/wp-content/plugins/subscribe-to-comments-reloaded/includes/css/font-awesome.min.css?ver=6.8.2' type='text/css' media='all' />
<link rel='stylesheet' id='stcr-style-css' href='https://willem.aandewiel.nl/wp-content/plugins/subscribe-to-comments-reloaded/includes/css/stcr-style.css?ver=6.8.2' type='text/css' media='all' />
<link rel='stylesheet' id='twentyten-block-style-css' href='https://willem.aandewiel.nl/wp-content/themes/twentyten/blocks.css?ver=20250220' type='text/css' media='all' />
<link rel='stylesheet' id='dco-comment-attachment-css' href='https://willem.aandewiel.nl/wp-content/plugins/dco-comment-attachment/assets/dco-comment-attachment.css?ver=2.4.0' type='text/css' media='all' />
<link rel='stylesheet' id='enlighterjs-css' href='https://willem.aandewiel.nl/wp-content/plugins/enlighter/cache/enlighterjs.min.css?ver=bU/DtqPSyMHvCUM' type='text/css' media='all' />
<link rel='stylesheet' id='really_simple_share_style-css' href='https://willem.aandewiel.nl/wp-content/plugins/really-simple-facebook-twitter-share-buttons/style.css?ver=6.8.2' type='text/css' media='all' />
<script type="text/javascript" id="sgr-js-extra">
/* <![CDATA[ */
var sgr = {"sgr_site_key":"6LdZ2PcUAAAAAMUzzk-cK2DRtzy8bKMetVgLFQis"};
/* ]]> */
</script>
<script type="text/javascript" src="https://willem.aandewiel.nl/wp-content/plugins/simple-google-recaptcha/sgr.js?ver=1756203142" id="sgr-js"></script>
<script type="text/javascript" id="plyr-js-js-extra">
/* <![CDATA[ */
var easy_video_player = {"plyr_iconUrl":"https:\/\/willem.aandewiel.nl\/wp-content\/plugins\/easy-video-player\/lib\/plyr.svg","plyr_blankVideo":"https:\/\/willem.aandewiel.nl\/wp-content\/plugins\/easy-video-player\/lib\/blank.mp4"};
/* ]]> */
</script>
<script type="text/javascript" src="https://willem.aandewiel.nl/wp-content/plugins/easy-video-player/lib/plyr.js?ver=6.8.2" id="plyr-js-js"></script>
<script type="text/javascript" src="https://willem.aandewiel.nl/wp-includes/js/jquery/jquery.min.js?ver=3.7.1" id="jquery-core-js"></script>
<script type="text/javascript" src="https://willem.aandewiel.nl/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1" id="jquery-migrate-js"></script>
<link rel="https://api.w.org/" href="https://willem.aandewiel.nl/index.php/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://willem.aandewiel.nl/index.php/wp-json/wp/v2/posts/8029" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://willem.aandewiel.nl/xmlrpc.php?rsd" />
<meta name="generator" content="WordPress 6.8.2" />
<link rel="canonical" href="https://willem.aandewiel.nl/index.php/2024/08/16/arduino-to-platformio-project-conversion/" />
<link rel='shortlink' href='https://willem.aandewiel.nl/?p=8029' />
<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://willem.aandewiel.nl/index.php/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwillem.aandewiel.nl%2Findex.php%2F2024%2F08%2F16%2Farduino-to-platformio-project-conversion%2F" />
<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://willem.aandewiel.nl/index.php/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwillem.aandewiel.nl%2Findex.php%2F2024%2F08%2F16%2Farduino-to-platformio-project-conversion%2F&#038;format=xml" />
<!-- Graceful Pull-Quotes plugin v2.6.1 -->
<link rel="stylesheet" href="https://willem.aandewiel.nl/wp-content/plugins/graceful-pull-quotes/resources/jspullquotes-core.css" type="text/css" />
<link rel="stylesheet" href="https://willem.aandewiel.nl/wp-content/plugins/graceful-pull-quotes/styles/Default.css" type="text/css" />
<script type="text/javascript">
var jspq_options = new Array("1", "1", "right", "1", "1", "aside", "pullquote", "pullquote pqRight");
</script>
<script type="text/javascript" src="https://willem.aandewiel.nl/wp-content/plugins/graceful-pull-quotes/resources/jspullquotes.js"></script>
<!-- end pull-quote additions -->
<!-- Analytics by WP Statistics - https://wp-statistics.com -->
</head>
<body class="wp-singular post-template-default single single-post postid-8029 single-format-standard wp-theme-twentyten metaslider-plugin">
<div id="wrapper" class="hfeed">
<a href="#content" class="screen-reader-text skip-link">Skip to content</a>
<div id="header">
<div id="masthead">
<div id="branding" role="banner">
<div id="site-title">
<span>
<a href="https://willem.aandewiel.nl/" rel="home" >Willem&#039;s Website</a>
</span>
</div>
<div id="site-description">Hosted on AWS lightsail</div>
<img width="940" height="198" src="https://willem.aandewiel.nl/wp-content/uploads/2024/08/RunningConvertor-940x198.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" decoding="async" fetchpriority="high" /> </div><!-- #branding -->
<div id="access" role="navigation">
<div class="menu-header"><ul id="menu-menu-1" class="menu"><li id="menu-item-7344" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home menu-item-7344"><a href="https://willem.aandewiel.nl/">Recent Projects</a></li>
<li id="menu-item-7345" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-7345"><a href="https://willem.aandewiel.nl/index.php/boekbespreking/">Boekbespreking</a></li>
<li id="menu-item-7346" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-7346"><a href="https://willem.aandewiel.nl/index.php/diversen/">Diversen</a></li>
<li id="menu-item-7347" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-7347"><a href="https://willem.aandewiel.nl/index.php/over/">Mijn WebSpace</a></li>
<li id="menu-item-7349" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-7349"><a href="https://willem.aandewiel.nl/index.php/about-me/">Curriculum Vitae</a></li>
</ul></div> </div><!-- #access -->
</div><!-- #masthead -->
</div><!-- #header -->
<div id="main">
<div id="container">
<div id="content" role="main">
<div id="nav-above" class="navigation">
<div class="nav-previous"><a href="https://willem.aandewiel.nl/index.php/2024/08/14/conversie-arduino-naar-platformio-project/" rel="prev"><span class="meta-nav">&larr;</span> Conversie Arduino- naar PlatformIO-project</a></div>
<div class="nav-next"><a href="https://willem.aandewiel.nl/index.php/2024/08/18/starten-met-platformio/" rel="next">Introductie PlatformIO <span class="meta-nav">&rarr;</span></a></div>
</div><!-- #nav-above -->
<div id="post-8029" class="post-8029 post type-post status-publish format-standard has-post-thumbnail hentry category-aandewiel category-arduino category-computer category-firmware category-uncategorised tag-arduino tag-conversion tag-ide tag-platformio tag-python tag-python3">
<h1 class="entry-title">Arduino to PlatformIO project conversion</h1>
<div class="entry-meta">
<span class="meta-prep meta-prep-author">Posted on</span> <a href="https://willem.aandewiel.nl/index.php/2024/08/16/arduino-to-platformio-project-conversion/" title="09:43" rel="bookmark"><span class="entry-date">16 August 2024</span></a> <span class="meta-sep">by</span> <span class="author vcard"><a class="url fn n" href="https://willem.aandewiel.nl/index.php/author/willema/" title="View all posts by Willem Aandewiel">Willem Aandewiel</a></span> </div><!-- .entry-meta -->
<div class="entry-content">
<p id="tw-target-text">[ 11,684 keer bekeken / views ]<br><br>I developed hardware for a friend to control the underfloor heating of his house more effectively and efficiently. To test this hardware I wrote software with the Arduino IDE. For me the only way I knew.</p>
<p class="has-light-gray-background-color has-background" id="tw-target-text">Je kunt een Nederlandse versie van deze post <a href="https://willem.aandewiel.nl/index.php/2024/08/14/conversie-arduino-naar-platformio-project/">hier</a> vinden</p>
<p id="tw-target-text">This friend, a professional software engineer, took my software and adapted the functionality to his wishes and requirements. But due to his experience, he was never able to get used to the way you develop software with the Arduino IDE. For him it was all very “unnatural”.<br><br>At some point he discovered Visual Studio Code and with that IDE in collaboration with the “PlatformIO” extension he was able to develop software for his measurement and control systems in a way that was “natural” for him.</p>
<figure class="wp-block-image size-large"><a href="https://willem.aandewiel.nl/wp-content/uploads/2024/08/PIO_Explorer.png"><img decoding="async" width="1024" height="621" src="https://willem.aandewiel.nl/wp-content/uploads/2024/08/PIO_Explorer-1024x621.png" alt="" class="wp-image-8016" srcset="https://willem.aandewiel.nl/wp-content/uploads/2024/08/PIO_Explorer-1024x621.png 1024w, https://willem.aandewiel.nl/wp-content/uploads/2024/08/PIO_Explorer-300x182.png 300w, https://willem.aandewiel.nl/wp-content/uploads/2024/08/PIO_Explorer-768x466.png 768w, https://willem.aandewiel.nl/wp-content/uploads/2024/08/PIO_Explorer.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
<p id="tw-target-text">I also looked at Visual Study Code with the PlatformIO extension (from now on just called “PlatformIO”) but quickly got stuck due to the rather steep learning curve.</p>
<p id="tw-target-text">Ultimately, I made the switch for new projects and became very enthusiastic. Also because I now use Visual Studio Code (VSC) not only for developing software for MCUs, but also for developing Python and openSCAD programs. Everything with one IDE (with different “extensions”), which increases productivity because you do not have to switch IDEs every time.</p>
<p id="tw-target-text">One of the biggest problems I have with the Arduino IDE and Arduino projects is that it is difficult to determine which version of libraries you use for a project and what type of MCU and the associated settings you should select to compile and flash a project. </p>
<p id="tw-target-text">Because I publish many projects on this website and these are recreated by more or less experienced makers, it appears every time that I have not described things well (enough) and/or that makers do not have the patience to read everything properly. But a bigger problem is that over time core software and libraries are also updated and that core software suddenly gets completely different settings and options (which no longer match my description) and that newer libraries are not always compatible with the version that I used for the project.</p>
<p id="tw-target-text">PlatformIO has a brilliant solution for this by using a &#8216;platformio.ini&#8217; file for every project in which all these things are recorded. The platform (in Arduino language the core used), the type of board (NodeMCU, Arduino UNO, ATtiny85, etc.) and which libraries are used in a project is fixed in the platformio.ini file where you can also specify that you want a specific version of a library you want to use. The “platformio.ini” file is part of the entire project and you don&#8217;t have to install or figure out anything yourself. Simply opening a project folder and compiling ensures that all necessary (external) core files and libraries are downloaded with the correct version (this is very fast and only needs to be done the first time you compile a project).</p>
<h2 class="wp-block-heading" id="tw-target-text">Example of a “platformio.ini” file</h2>
<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""> ; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[platformio]
workspace_dir = .pio.nosync
default_envs = myBoard
[env:myBoard]
platform = atmelavr
board = uno
upload_protocol = usbtiny
framework = arduino
monitor_speed = 19200
upload_speed = 19200
upload_port = #select port like "/dev/cu.usbserial-3224144"
build_flags =
-D DEBUG
lib_ldf_mode = deep+
lib_deps =
marcoschwartz/LiquidCrystal_I2C@^1.1.4
chris--a/Keypad@^3.1.1
monitor_filters =</pre>
<p id="tw-target-text"><br>Now that I am using PlatformIO for new projects, I would also like to convert my existing Arduino projects to the PlatformIO structure. But that turns out to be less easy than you might think (or hope).</p>
<p id="tw-target-text">There are manuals on the internet that describe this process, but they are often incomplete and almost all assume a simple project with only one &#8216;.ino&#8217; file.</p>
<h2 class="wp-block-heading" id="tw-target-text">I thought: there must be a better way</h2>
<p>In order to convert an Arduino project to a PlatformIO structure, it is important to understand how the Arduino IDE “works” and what this IDE does to compile a project.<br>The Arduino IDE does a number of things behind the scenes (or under the hood) with the &#8216;.ino&#8217; files that make up the project.</p>
<h2 class="wp-block-heading" id="tw-target-text">Merging .ino Files</h2>
<p>The Arduino IDE starts the compilation process by pasting all the &#8216;.ino&#8217; files in your project together into one large combined file. This is done in alphabetical order of the file names. Imagine you have three files: &#8216;myProgram.ino&#8217;, &#8216;sensor.ino&#8217; and &#8216;display.ino&#8217;. The IDE merges these in the order myProgram.ino, &#8216;display.ino&#8217; and &#8216;sensor.ino&#8217;. This means that the order of the files can affect the behavior of your code, especially if functions in different files call each other.</p>
<h2 class="wp-block-heading" id="tw-target-text">Creating Function Prototypes</h2>
<p id="tw-target-text">After the files are merged, the Arduino IDE scans the combined file looking for any functions you defined. Then the IDE automatically creates prototypes for these functions and places them at the top of the combined file. A function prototype is a declaration of a function that specifies what type of value the function returns and what arguments the function expects, without the full function implementation. This allows the compiler to call functions defined later in the file, which would normally not be possible without prototypes (by default in C or C++ a function cannot be used until it is defined before the call).</p>
<h2 class="wp-block-heading" id="tw-target-text">Global variables</h2>
<p id="tw-target-text">If you declare a variable outside a function (i.e. not inside the curly braces &#8216;{}&#8217; of a function), then by merging all &#8216;.ino&#8217; files through the Arduino IDE, this variable is global and available to all functions in all merged &#8216;.ino&#8217; files. For example, a variable &#8216;int sensorValue;&#8217; declared in &#8216;sensor.ino&#8217; can be used in &#8216;myProgram.ino&#8217; or &#8216;display.ino&#8217; without any problems.</p>
<h2 class="wp-block-heading" id="tw-target-text">Inclusion of Libraries with &#8216;#include&#8217;</h2>
<p id="tw-target-text">When using external libraries in an Arduino project you must import them with the &#8216;#include&#8217; directive. If you import a library into a single &#8216;.ino&#8217; file, this will apply to the entire combined file once merged by the IDE.</p>
<h2 class="wp-block-heading" id="tw-target-text">Duplicate &#8216;#include&#8217; directives</h2>
<p id="tw-target-text">It is not necessary, but also not harmful, to place the same &#8216;#include&#8217; directive in multiple &#8216;.ino&#8217; files. The compiler ensures that a library is only added once, even if the &#8216;#include&#8217; directive, by merging all &#8216;.ino&#8217; files, appears multiple times. This is because most libraries protect themselves against double inclusion by using &#8216;#ifndef&#8217; and &#8216;#define&#8217; (so-called &#8216;Header Guards&#8217;) directives in their header files.</p>
<h2 class="wp-block-heading" id="tw-target-text">Compilation as one Program</h2>
<p id="tw-target-text">Now that the files have been merged and the prototypes created, the IDE treats the result as a single file. This means that the code is now compiled as if it were a single &#8216;.ino&#8217; file. The compiler runs through the code, translates it into machine instructions, and checks for syntax and semantic errors. Because everything is now in one file with all functions as a “prototype” at the beginning of the merged file, functions in different files can communicate with each other without any problems, without the user having to worry about the order of the function definitions.</p>
<h1 class="wp-block-heading" id="tw-target-text">And what does a PlatformIO project look like?</h1>
<p id="tw-target-text">When you start a project with PlatformIO, you get a structured folder where you can store all your code, settings, and other files. This structure helps you keep an overview, especially as your project grows.<br>The project folder consists of at least a &#8216;platformio.ini&#8217; file and two folders containing all the code. These folders are “src” where all the “.c” and “.cpp” files of the project are located and “include” where all the header files of the project are located.</p>
<h2 class="wp-block-heading" id="tw-target-text">The &#8216;platformio.ini&#8217; file</h2>
<p id="tw-target-text">This file is like the “instruction manual” for your project. This specifies which microcontroller you are using, which libraries are needed, and how everything should be configured.</p>
<h2 class="wp-block-heading" id="tw-target-text">The “src” folder</h2>
<p id="tw-target-text">This is where you keep the most important code of your project. This contains files with the extension &#8216;.c&#8217; for C code and &#8216;.cpp&#8217; for C++ code.<br>The name “src” stands for “source”, which means that this is the source code of your project.<br>Because PlatformIO does not, like the Arduino IDE, place all code files one after the other, each &#8216;.c&#8217; or &#8216;.cpp&#8217; file is a separate object. Without special instructions, these independent objects know nothing about each other.</p>
<h2 class="wp-block-heading" id="tw-target-text">The “include” folder</h2>
<p id="tw-target-text">In this folder you store files with “preparatory” code, also called header files. A header file is usually used to define your code&#8217;s “interface” between different objects, especially if you want to use functions, variables, or classes in other files. Header files have the extension &#8216;.h&#8217;.</p>
<h2 class="wp-block-heading" id="tw-target-text">Example of what such a project looks like in PlatformIO</h2>
<p id="tw-target-text">Imagine you have a project called &#8216;MyProject&#8217;. This is what the structure could look like:</p>
<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://willem.aandewiel.nl/wp-content/uploads/2024/08/platformIO_structuur.png"><img decoding="async" width="742" height="818" src="https://willem.aandewiel.nl/wp-content/uploads/2024/08/platformIO_structuur.png" alt="" class="wp-image-8002" style="width:234px;height:auto" srcset="https://willem.aandewiel.nl/wp-content/uploads/2024/08/platformIO_structuur.png 742w, https://willem.aandewiel.nl/wp-content/uploads/2024/08/platformIO_structuur-272x300.png 272w" sizes="(max-width: 742px) 100vw, 742px" /></a></figure></div>
<p id="tw-target-text"><br>&#8216;<em>main.cpp</em>&#8216; contains the code of your project.<br>&#8216;<em>my_header.h</em>&#8216; is a header file with code that you can use in multiple places in your project.<br>&#8216;<em>platformio.ini</em>&#8216; is the file that gives PlatformIO the instructions on how to build and run the project.</p>
<p id="tw-target-text">Everything defined or recorded in &#8216;<em>my_header.h</em>&#8216; becomes available or affects all other &#8216;.c&#8217; or &#8216;.cpp&#8217; files that include this header file via the &#8216;<em>#include “my_header.h”</em>&#8216;.</p>
<h1 class="wp-block-heading" id="tw-target-text">The conversion program</h1>
<p id="tw-target-text">Now that we know what the Arduino IDE does to compile a complex project and we know what a project looks like in PlatformIO, it should be possible to write an automatic conversion program for this. I list the steps this conversion program must go through to perform this task.</p>
<h2 class="wp-block-heading" id="tw-target-text">Step 1</h2>
<p id="tw-target-text">In this step the directory structure for a PlatformIO project must be set up. I have chosen to create a new folder “PlatformIO” in an Arduino project (whose top directory always has the same name as the “main” .ino file). Below this folder there will be a second folder with the name of the Arduino project. See the picture below of the original Arduino project “pulseGenerator”:</p>
<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://willem.aandewiel.nl/wp-content/uploads/2024/08/pulsGeneratorArduino.png"><img loading="lazy" decoding="async" width="229" height="100" src="https://willem.aandewiel.nl/wp-content/uploads/2024/08/pulsGeneratorArduino.png" alt="" class="wp-image-8000"/></a></figure></div>
<p id="tw-target-text">As you can see, this project consists of three &#8216;.ino&#8217; files. In the Arduino IDE it looks like this:</p>
<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://willem.aandewiel.nl/wp-content/uploads/2024/08/ArduinoIDE.png"><img loading="lazy" decoding="async" width="878" height="728" src="https://willem.aandewiel.nl/wp-content/uploads/2024/08/ArduinoIDE.png" alt="" class="wp-image-8001" style="width:572px;height:auto" srcset="https://willem.aandewiel.nl/wp-content/uploads/2024/08/ArduinoIDE.png 878w, https://willem.aandewiel.nl/wp-content/uploads/2024/08/ArduinoIDE-300x249.png 300w, https://willem.aandewiel.nl/wp-content/uploads/2024/08/ArduinoIDE-768x637.png 768w" sizes="auto, (max-width: 878px) 100vw, 878px" /></a></figure></div>
<p>It is good to know that the Arduino IDE ignores all files that do not have the extension &#8216;.ino&#8217;, &#8216;.c&#8217;, &#8216;.cpp&#8217; or &#8216;.h&#8217;.<br>The &#8216;README.md&#8217; file that is indeed in the project directory is therefore not &#8216;seen&#8217; by the Arduino IDE. The same applies to the &#8216;PlatformIO&#8217; folder that the conversion program will create.<br>After Step 1 the file structure will look like this:</p>
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="276" height="203" src="https://willem.aandewiel.nl/wp-content/uploads/2024/08/PlatformIO_mappen.png" alt="" class="wp-image-8003"/></figure>
<ol class="wp-block-list">
<li>This is the named PlatformIO directory (this directory and all subdirectories and files are not visible in the Arduino IDE)</li>
<li>This is the PlatformIO project Folder</li>
<li>The “src” and “include” folder and a template for the platformio.ini file</li>
</ol>
<h2 class="wp-block-heading" id="tw-target-text">Step 2</h2>
<p id="tw-target-text">In this step, all existing &#8216;.ino&#8217;, &#8216;.c&#8217; and &#8216;.cpp&#8217; files are copied to the &#8220;src&#8221; folder and any existing &#8216;.h&#8217; files are copied to the &#8220;include&#8221; folder.<br>Now all globally defined variables, constant pointers, function definitions and “#include” statements are put into tables. The “#include” statements found in the &#8216;.ino&#8217; files are adapted there into comments.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">//#include &lt;Wire.h> //-- moved to arduinoGlue.h
//#include &lt;LiquidCrystal_I2C.h> //-- moved to arduinoGlue.h</pre>
<p>Header Guards are applied to any existing header files (if they are not already present).<br>Then all data from the previously created tables are put into a new “arduinoGlue.h” file where global variables are given the prefix “external”. This has the same effect as “prototypes”. The compiler knows that such a variable will be declared &#8220;somewhere&#8221;, but it does not need to know where that declaration will take place. That is a task that the “linker” will figure out. This header file now contains all the data for the other files for error-free compilation.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#ifndef ARDUINOGLUE_H
#define ARDUINOGLUE_H
#define SETBIT(a,b) ((a) |= _BV(b))
#define CLEARBIT(a, b) ((a) &amp;= ~_BV(b))
#define SET_LOW(_port, _pin) ((_port) &amp;= ~_BV(_pin))
#define SET_HIGH(_port, _pin) ((_port) |= _BV(_pin))
#define pinA 8 // PB0
#define pinAbit 0 // PB0
#define pinB 9 // PB1
#define pinBbit 1 // PB1
#define pinA 11 // PB3
#define pinAbit 3 // PB3
#define pinB 12 // PB4
#define pinBbit 4 // PB5
#define POTMETER A0 // PC0
#define LED_PULSE_ON A1
#define LED_POTMETER A2
#define LED_SWEEPMODE A3
#define _CLOCK 16000000
#define _MAXFREQCHAR 20
#define _HYSTERESIS 5
//-- dict_all_includes ---
#include &lt;Wire.h>
#include &lt;LiquidCrystal_I2C.h>
#include &lt;Keypad.h>
//-- dict_global_variables ---
extern int32_t diffFrequency; //-- from pulsGenerator
extern int32_t endSweepFreq; //-- from pulsGenerator
extern uint8_t freqKeyPos; //-- from pulsGenerator
extern volatile int32_t frequency; //-- from pulsGenerator
extern char inputKey; //-- from pulsGenerator
extern uint32_t ledBuiltinTimer; //-- from pulsGenerator
extern int32_t newFrequency; //-- from pulsGenerator
extern char newInputChar[_MAXFREQCHAR]; //-- from pulsGenerator
extern uint16_t newPotValue; //-- from pulsGenerator
extern uint16_t potSaved; //-- from pulsGenerator
extern uint16_t potValue; //-- from pulsGenerator
extern bool potmeterActive; //-- from pulsGenerator
extern int32_t startSweepFreq; //-- from pulsGenerator
extern float stepFrequency; //-- from pulsGenerator
extern bool sweepModeActive; //-- from pulsGenerator
extern uint32_t sweepTime; //-- from pulsGenerator
extern uint32_t sweepTimer; //-- from pulsGenerator
extern volatile int8_t togglePin; //-- from pulsGenerator
//-- dict_prototypes ---
//-- from displayStuff.ino -----------
void setupLCD();
void initLCD();
void updateLCD();
void easterLCD();
//-- from pulsGenerator.ino -----------
void explanation();
void readPotmeter();
void calculateSweep();
void sweep();
//-- from timer1Stuff.ino -----------
int32_t calculateTimer1(int32_t freqAsked, uint8_t &amp;newTCCR1B);
void setupTimer1(int32_t newFrequency);
#endif // ARDUINOGLUE_H</pre>
<h2 class="wp-block-heading" id="tw-target-text">Step 3</h2>
<p id="tw-target-text">In this step, a header file is created for all &#8216;.ino&#8217; files with Header Guards and a &#8216;#include “arduinoGlue.h”&#8217; (this does not happen for &#8216;.c&#8217; and &#8216;.cpp&#8217; files because, if they are used in the original Arduino project, must already have a &#8216;.h&#8217; file).</p>
<h2 class="wp-block-heading" id="tw-target-text">Step 4</h2>
<p id="tw-target-text">In the “main project” file (in our example “pulsGenerator.ino”) a “#include” statement is inserted before all other header files so that the &#8216;.cpp&#8217; objects with the same name are included. In this example project these are:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#include “arduinoGlue.h”
#include “displayStuff.h” //-- voor displayStuff.cpp
#include “timer1Stuff.h” //--voor timer1Stuff.cpp</pre>
<h2 class="wp-block-heading">Step 5</h2>
<p>Now all &#8216;.ino&#8217; files in the &#8220;src&#8221; directory will be renamed to &#8216;.cpp&#8217; files.<br>After the conversion, the directory structure will look like this:</p>
<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://willem.aandewiel.nl/wp-content/uploads/2024/08/naConversie.png"><img loading="lazy" decoding="async" width="305" height="346" src="https://willem.aandewiel.nl/wp-content/uploads/2024/08/naConversie.png" alt="" class="wp-image-8006" style="width:273px;height:auto" srcset="https://willem.aandewiel.nl/wp-content/uploads/2024/08/naConversie.png 305w, https://willem.aandewiel.nl/wp-content/uploads/2024/08/naConversie-264x300.png 264w" sizes="auto, (max-width: 305px) 100vw, 305px" /></a></figure></div>
<h2 class="wp-block-heading">What remains</h2>
<p>What remains and cannot be automated is adjusting the &#8216;platformio.ini&#8217; file.</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="527" src="https://willem.aandewiel.nl/wp-content/uploads/2024/08/RunningConvertor-1024x527.png" alt="" class="wp-image-8017" srcset="https://willem.aandewiel.nl/wp-content/uploads/2024/08/RunningConvertor-1024x527.png 1024w, https://willem.aandewiel.nl/wp-content/uploads/2024/08/RunningConvertor-300x154.png 300w, https://willem.aandewiel.nl/wp-content/uploads/2024/08/RunningConvertor-768x395.png 768w, https://willem.aandewiel.nl/wp-content/uploads/2024/08/RunningConvertor.png 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<h1 class="wp-block-heading">Where can you find the conversion program?</h1>
<p><a href="https://github.com/mrWheel/arduinoIDE2platformIO-convertor" target="_blank" rel="noreferrer noopener">This repo</a> contains the “arduinoIDE2platformIO.py” conversion program. In this repo there are two example Arduino projects in the “test project” folder that you can convert into a PlatformIO project with this program as a test.</p>
<h1 class="wp-block-heading">And what if you want to create an Arduino IDE version of a PlatformIO project?</h1>
<p>That conversion is a lot easier. In <a href="https://github.com/mrWheel/platformIO2arduinoIDE-convertor/tree/main" target="_blank" rel="noreferrer noopener">this repo</a> you will find the “platformIO2arduinoIDE.py” program that will do this automatically for you!</p>
<div style="min-height:33px;" class="really_simple_share really_simple_share_button robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;"><div class="fb-like" data-href="https://willem.aandewiel.nl/index.php/2024/08/16/arduino-to-platformio-project-conversion/" data-layout="button_count" data-width="100" ></div></div><div class="really_simple_share_twitter" style="width:100px;"><a href="https://twitter.com/share" class="twitter-share-button" data-count="horizontal" data-text="Arduino to PlatformIO project conversion" data-url="https://willem.aandewiel.nl/index.php/2024/08/16/arduino-to-platformio-project-conversion/" data-via="" ></a></div><div class="really_simple_share_google1" style="width:80px;"><div class="g-plusone" data-size="medium" data-href="https://willem.aandewiel.nl/index.php/2024/08/16/arduino-to-platformio-project-conversion/" ></div></div><div class="really_simple_share_specificfeeds_follow" style="width:110px;"><a href="https://www.specificfeeds.com/follow" target="_blank"><img decoding="async" src="https://willem.aandewiel.nl/wp-content/plugins/really-simple-facebook-twitter-share-buttons/images/specificfeeds_follow.png" alt="Email, RSS" title="Email, RSS" /> Follow</a></div></div>
<div class="really_simple_share_clearfix"></div> </div><!-- .entry-content -->
<div class="entry-utility">
This entry was posted in <a href="https://willem.aandewiel.nl/index.php/category/aandewiel/" rel="category tag">Aandewiel</a>, <a href="https://willem.aandewiel.nl/index.php/category/arduino/" rel="category tag">Arduino</a>, <a href="https://willem.aandewiel.nl/index.php/category/computer/" rel="category tag">Computer</a>, <a href="https://willem.aandewiel.nl/index.php/category/firmware/" rel="category tag">Firmware</a>, <a href="https://willem.aandewiel.nl/index.php/category/uncategorised/" rel="category tag">Uncategorised</a> and tagged <a href="https://willem.aandewiel.nl/index.php/tag/arduino/" rel="tag">Arduino</a>, <a href="https://willem.aandewiel.nl/index.php/tag/conversion/" rel="tag">Conversion</a>, <a href="https://willem.aandewiel.nl/index.php/tag/ide/" rel="tag">IDE</a>, <a href="https://willem.aandewiel.nl/index.php/tag/platformio/" rel="tag">PlatformIO</a>, <a href="https://willem.aandewiel.nl/index.php/tag/python/" rel="tag">Python</a>, <a href="https://willem.aandewiel.nl/index.php/tag/python3/" rel="tag">Python3</a>. Bookmark the <a href="https://willem.aandewiel.nl/index.php/2024/08/16/arduino-to-platformio-project-conversion/" title="Permalink to Arduino to PlatformIO project conversion" rel="bookmark">permalink</a>. </div><!-- .entry-utility -->
</div><!-- #post-8029 -->
<div id="nav-below" class="navigation">
<div class="nav-previous"><a href="https://willem.aandewiel.nl/index.php/2024/08/14/conversie-arduino-naar-platformio-project/" rel="prev"><span class="meta-nav">&larr;</span> Conversie Arduino- naar PlatformIO-project</a></div>
<div class="nav-next"><a href="https://willem.aandewiel.nl/index.php/2024/08/18/starten-met-platformio/" rel="next">Introductie PlatformIO <span class="meta-nav">&rarr;</span></a></div>
</div><!-- #nav-below -->
<div id="comments">
<h3 id="comments-title">
6 Responses to <em>Arduino to PlatformIO project conversion</em> </h3>
<ol class="commentlist">
<li class="comment even thread-even depth-1" id="li-comment-5053">
<div id="comment-5053">
<div class="comment-author vcard">
<img alt='' src='https://secure.gravatar.com/avatar/a4835588e9d04fb88c59c6511746880d90492a67e092a404c70f23535a5b279c?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/a4835588e9d04fb88c59c6511746880d90492a67e092a404c70f23535a5b279c?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo' height='40' width='40' loading='lazy' decoding='async'/> <cite class="fn">David Hanson</cite> <span class="says">says:</span> </div><!-- .comment-author .vcard -->
<div class="comment-meta commentmetadata"><a href="https://willem.aandewiel.nl/index.php/2024/08/16/arduino-to-platformio-project-conversion/#comment-5053">
9 March 2025 at 22:08 </a>
</div><!-- .comment-meta .commentmetadata -->
<div class="comment-body"><p>Hello, I just attempted the conversion of my arduino IDE project consisting of 16 .ino programs and several structs in the main program. These defines are unknown in other modules that call the structure.name.element. How can I make these defines of structure global so the other modules (ino programs) can see the elements?</p>
<p>Thanks for you work. Been trying to figure out how to get this project over to platformio for several years.</p>
</div>
<div class="reply">
<a rel="nofollow" class="comment-reply-link" href="https://willem.aandewiel.nl/index.php/2024/08/16/arduino-to-platformio-project-conversion/?replytocom=5053#respond" data-commentid="5053" data-postid="8029" data-belowelement="comment-5053" data-respondelement="respond" data-replyto="Reply to David Hanson" aria-label="Reply to David Hanson">Reply</a> </div><!-- .reply -->
</div><!-- #comment-## -->
<ul class="children">
<li class="comment byuser comment-author-willema bypostauthor odd alt depth-2" id="li-comment-5055">
<div id="comment-5055">
<div class="comment-author vcard">
<img alt='' src='https://secure.gravatar.com/avatar/67b9a4878b4eb33d76757bcbdb5e1f8173f6b9e59b2763626c43be5dce815bfc?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/67b9a4878b4eb33d76757bcbdb5e1f8173f6b9e59b2763626c43be5dce815bfc?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo' height='40' width='40' loading='lazy' decoding='async'/> <cite class="fn">Willem Aandewiel</cite> <span class="says">says:</span> </div><!-- .comment-author .vcard -->
<div class="comment-meta commentmetadata"><a href="https://willem.aandewiel.nl/index.php/2024/08/16/arduino-to-platformio-project-conversion/#comment-5055">
11 March 2025 at 10:29 </a>
</div><!-- .comment-meta .commentmetadata -->
<div class="comment-body"><p>Hi David,</p>
<p>From the top of my hat: You should declare them in the &#8220;arduinoGlue.h&#8221; file as &#8220;external&#8221; as they are declare &#8220;global&#8221; in the original file. As &#8220;arduinoGlue.h&#8221; is included in all other files they all know of the existence of these variables.</p>
<p>Global variables<br />
If you declare a variable outside a function (i.e. not inside the curly braces {} of a function), then by merging all .ino files through the Arduino IDE, this variable is global and available to all functions in all merged .ino files. For example, a variable int sensorValue; declared in sensor.ino can be used in myProgram.ino or display.ino without any problems.</p>
</div>
<div class="reply">
<a rel="nofollow" class="comment-reply-link" href="https://willem.aandewiel.nl/index.php/2024/08/16/arduino-to-platformio-project-conversion/?replytocom=5055#respond" data-commentid="5055" data-postid="8029" data-belowelement="comment-5055" data-respondelement="respond" data-replyto="Reply to Willem Aandewiel" aria-label="Reply to Willem Aandewiel">Reply</a> </div><!-- .reply -->
</div><!-- #comment-## -->
</li><!-- #comment-## -->
</ul><!-- .children -->
</li><!-- #comment-## -->
<li class="comment even thread-odd thread-alt depth-1" id="li-comment-4990">
<div id="comment-4990">
<div class="comment-author vcard">
<img alt='' src='https://secure.gravatar.com/avatar/bbed0fdd8677a8e7266d353ad28bfffef79643bf469fcf05aa5a7d71f120b538?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/bbed0fdd8677a8e7266d353ad28bfffef79643bf469fcf05aa5a7d71f120b538?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo' height='40' width='40' loading='lazy' decoding='async'/> <cite class="fn">Ihor</cite> <span class="says">says:</span> </div><!-- .comment-author .vcard -->
<div class="comment-meta commentmetadata"><a href="https://willem.aandewiel.nl/index.php/2024/08/16/arduino-to-platformio-project-conversion/#comment-4990">
14 January 2025 at 01:30 </a>
</div><!-- .comment-meta .commentmetadata -->
<div class="comment-body"><p>Hi, thanks for sharing your converter!</p>
<p>in my case, it finishes with the error:</p>
<p> INFO &#8211; :2863 &#8211; =======================================================================================================<br />
INFO &#8211; :2864 &#8211; [Step 5] add all local includes to the &#8216;project_name.ino&#8217; file (insert &#8216;#include &#8220;x.h&#8221;&#8216; to x.ino)<br />
INFO &#8211; :2865 &#8211; =======================================================================================================<br />
INFO &#8211; :1388 &#8211;<br />
INFO &#8211; :1389 &#8211; Processing: add_local_includes_to_project_header(): testProject<br />
ERROR &#8211; :1451 &#8211; An error occurred at line 1394: [Errno 2] No such file or directory: &#8216;/Users/igorlab/Dropbox/Projects/Clion/test_ino2clion/arduinoIDE2platformIO-convertor-main/testProject/PlatformIO/testProject/include/testProject.h&#8217;</p>
<p>Can you please help me figure out what it can be?</p>
</div>
<div class="reply">
<a rel="nofollow" class="comment-reply-link" href="https://willem.aandewiel.nl/index.php/2024/08/16/arduino-to-platformio-project-conversion/?replytocom=4990#respond" data-commentid="4990" data-postid="8029" data-belowelement="comment-4990" data-respondelement="respond" data-replyto="Reply to Ihor" aria-label="Reply to Ihor">Reply</a> </div><!-- .reply -->
</div><!-- #comment-## -->
<ul class="children">
<li class="comment byuser comment-author-willema bypostauthor odd alt depth-2" id="li-comment-4995">
<div id="comment-4995">
<div class="comment-author vcard">
<img alt='' src='https://secure.gravatar.com/avatar/67b9a4878b4eb33d76757bcbdb5e1f8173f6b9e59b2763626c43be5dce815bfc?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/67b9a4878b4eb33d76757bcbdb5e1f8173f6b9e59b2763626c43be5dce815bfc?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo' height='40' width='40' loading='lazy' decoding='async'/> <cite class="fn">Willem Aandewiel</cite> <span class="says">says:</span> </div><!-- .comment-author .vcard -->
<div class="comment-meta commentmetadata"><a href="https://willem.aandewiel.nl/index.php/2024/08/16/arduino-to-platformio-project-conversion/#comment-4995">
17 January 2025 at 11:06 </a>
</div><!-- .comment-meta .commentmetadata -->
<div class="comment-body"><p>Hallo Ihor,</p>
<p>Heb je de versie van <a href="https://github.com/mrWheel/arduinoIDE2platformIO-convertor" target="_blank" rel="noopener nofollow ugc">github</a> geprobeerd?</p>
</div>
<div class="reply">
<a rel="nofollow" class="comment-reply-link" href="https://willem.aandewiel.nl/index.php/2024/08/16/arduino-to-platformio-project-conversion/?replytocom=4995#respond" data-commentid="4995" data-postid="8029" data-belowelement="comment-4995" data-respondelement="respond" data-replyto="Reply to Willem Aandewiel" aria-label="Reply to Willem Aandewiel">Reply</a> </div><!-- .reply -->
</div><!-- #comment-## -->
</li><!-- #comment-## -->
</ul><!-- .children -->
</li><!-- #comment-## -->
<li class="comment even thread-even depth-1" id="li-comment-4918">
<div id="comment-4918">
<div class="comment-author vcard">
<img alt='' src='https://secure.gravatar.com/avatar/15b2e992243c6d89a940e59795d285a511f2d6702845b7d0a1f85cbe33364a3e?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/15b2e992243c6d89a940e59795d285a511f2d6702845b7d0a1f85cbe33364a3e?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo' height='40' width='40' loading='lazy' decoding='async'/> <cite class="fn">Branko Tokic</cite> <span class="says">says:</span> </div><!-- .comment-author .vcard -->
<div class="comment-meta commentmetadata"><a href="https://willem.aandewiel.nl/index.php/2024/08/16/arduino-to-platformio-project-conversion/#comment-4918">
3 October 2024 at 23:50 </a>
</div><!-- .comment-meta .commentmetadata -->
<div class="comment-body"><p>Hi, I came across your fine project for converting in0. files to platform code.<br />
Unfortunately there is no info in the read.me. would like to try it on Mac OS.<br />
Any info how to use it?</p>
<p>thank you<br />
Branko</p>
</div>
<div class="reply">
<a rel="nofollow" class="comment-reply-link" href="https://willem.aandewiel.nl/index.php/2024/08/16/arduino-to-platformio-project-conversion/?replytocom=4918#respond" data-commentid="4918" data-postid="8029" data-belowelement="comment-4918" data-respondelement="respond" data-replyto="Reply to Branko Tokic" aria-label="Reply to Branko Tokic">Reply</a> </div><!-- .reply -->
</div><!-- #comment-## -->
<ul class="children">
<li class="comment byuser comment-author-willema bypostauthor odd alt depth-2" id="li-comment-4919">
<div id="comment-4919">
<div class="comment-author vcard">
<img alt='' src='https://secure.gravatar.com/avatar/67b9a4878b4eb33d76757bcbdb5e1f8173f6b9e59b2763626c43be5dce815bfc?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/67b9a4878b4eb33d76757bcbdb5e1f8173f6b9e59b2763626c43be5dce815bfc?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo' height='40' width='40' loading='lazy' decoding='async'/> <cite class="fn">Willem Aandewiel</cite> <span class="says">says:</span> </div><!-- .comment-author .vcard -->
<div class="comment-meta commentmetadata"><a href="https://willem.aandewiel.nl/index.php/2024/08/16/arduino-to-platformio-project-conversion/#comment-4919">
4 October 2024 at 12:09 </a>
</div><!-- .comment-meta .commentmetadata -->
<div class="comment-body"><p>Hi Branko,</p>
<p>You are right. I have to put that somewhere in the post or (and) in the README.md of the repo.</p>
<p>1) You have to clone the repo to your computer.<br />
2) In a terminal window you cd to the folder where you cloned the repo.<br />
3) Then you type “python3 arduinoIDE2platformIO.py &#8211;project_dir &lt;pathToArduinoProject&gt;</p>
<p>(there are two - before project_dir)</p>
<p>The converted project is located in &lt;pathToArduinoProject&gt;/platformIO/</p>
<p>All you have to do is edit the platformio.ini file to your needs.</p>
<p>Mind you: the convertor will not always do everything for you. Sometimes you have to iterate a compile -> solve compile errors -> compile -> solve compile errors.</p>
<p>If it compiles without errors test it. If it works as expected you can cleanup the arduinoGlue.h file with the crossReference.py file.</p>
<p>Have fun!</p>
</div>
<div class="reply">
<a rel="nofollow" class="comment-reply-link" href="https://willem.aandewiel.nl/index.php/2024/08/16/arduino-to-platformio-project-conversion/?replytocom=4919#respond" data-commentid="4919" data-postid="8029" data-belowelement="comment-4919" data-respondelement="respond" data-replyto="Reply to Willem Aandewiel" aria-label="Reply to Willem Aandewiel">Reply</a> </div><!-- .reply -->
</div><!-- #comment-## -->
</li><!-- #comment-## -->
</ul><!-- .children -->
</li><!-- #comment-## -->
</ol>
<div id="respond" class="comment-respond">
<h3 id="reply-title" class="comment-reply-title">Leave a Reply <small><a rel="nofollow" id="cancel-comment-reply-link" href="/index.php/2024/08/16/arduino-to-platformio-project-conversion/#respond" style="display:none;">Cancel reply</a></small></h3><form action="https://willem.aandewiel.nl/wp-comments-post.php" method="post" id="commentform" class="comment-form"><p class="comment-notes"><span id="email-notes">Your email address will not be published.</span> <span class="required-field-message">Required fields are marked <span class="required">*</span></span></p><p class="comment-form-comment"><label for="comment">Comment <span class="required">*</span></label> <textarea id="comment" name="comment" cols="45" rows="8" maxlength="65525" required="required"></textarea></p><p class="comment-form-author"><label for="author">Name <span class="required">*</span></label> <input id="author" name="author" type="text" value="" size="30" maxlength="245" autocomplete="name" required="required" /></p>
<p class="comment-form-email"><label for="email">Email <span class="required">*</span></label> <input id="email" name="email" type="text" value="" size="30" maxlength="100" aria-describedby="email-notes" autocomplete="email" required="required" /></p>
<p class="comment-form-url"><label for="url">Website</label> <input id="url" name="url" type="text" value="" size="30" maxlength="200" autocomplete="url" /></p>
<div class="sgr-main"></div> <p class="comment-form-attachment">
<label class="comment-form-attachment__label" for="attachment">
Attachment </label>
<input class="comment-form-attachment__input" id="attachment" name="attachment" type="file" accept=".jpg,.jpeg,.jpe,.gif,.png,.bmp,.tiff,.tif,.ico,.c" />
<span class="comment-form-attachment__file-size-notice">
The maximum upload file size: 4 MB. </span>
<span class="comment-form-attachment__file-types-notice">
You can upload: <abbr title="jpg, jpeg, jpe, gif, png, bmp, tiff, tif, ico">image</abbr>, <abbr title="c">other</abbr>. </span>
<span class="comment-form-attachment__autoembed-links-notice">
Links to YouTube, Facebook, Twitter and other services inserted in the comment text will be automatically embedded. </span>
<span class="comment-form-attachment__drop-area">
<span class="comment-form-attachment__drop-area-inner">
Drop file here </span>
</span>
</p>
<p class='comment-form-subscriptions'><label for='subscribe-reloaded'><select name='subscribe-reloaded' id='subscribe-reloaded'>
<option value='none' >Don&#039;t subscribe</option>
<option value='yes' >All new comments</option>
<option value='replies' selected='selected'>Replies to my comments</option>
</select> Notify me of followup comments via e-mail.</label></p><p class="form-submit"><input name="submit" type="submit" id="submit" class="submit" value="Post Comment" /> <input type='hidden' name='comment_post_ID' value='8029' id='comment_post_ID' />
<input type='hidden' name='comment_parent' id='comment_parent' value='0' />
</p><p style="display: none;"><input type="hidden" id="akismet_comment_nonce" name="akismet_comment_nonce" value="4130235690" /></p><p style="display: none !important;" class="akismet-fields-container" data-prefix="ak_"><label>&#916;<textarea name="ak_hp_textarea" cols="45" rows="8" maxlength="100"></textarea></label><input type="hidden" id="ak_js_1" name="ak_js" value="240"/><script>document.getElementById( "ak_js_1" ).setAttribute( "value", ( new Date() ).getTime() );</script></p></form> </div><!-- #respond -->
<p class="akismet_comment_form_privacy_notice">This site uses Akismet to reduce spam. <a href="https://akismet.com/privacy/" target="_blank" rel="nofollow noopener">Learn how your comment data is processed.</a></p>
</div><!-- #comments -->
</div><!-- #content -->
</div><!-- #container -->
<div id="primary" class="widget-area" role="complementary">
<ul class="xoxo">
<li id="search-3" class="widget-container widget_search"><form role="search" method="get" id="searchform" class="searchform" action="https://willem.aandewiel.nl/">
<div>
<label class="screen-reader-text" for="s">Search for:</label>
<input type="text" value="" name="s" id="s" />
<input type="submit" id="searchsubmit" value="Search" />
</div>
</form></li><li id="text-2" class="widget-container widget_text"> <div class="textwidget"><p>Sponsored by<a href="https://easytocloud.com/" target="_blank" rel="noopener"><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-1456" src="https://willem.aandewiel.nl/wp-content/uploads/2018/12/easytocloud-banner-inverse-400-300x39.png" alt="" width="300" height="39" srcset="https://willem.aandewiel.nl/wp-content/uploads/2018/12/easytocloud-banner-inverse-400-300x39.png 300w, https://willem.aandewiel.nl/wp-content/uploads/2018/12/easytocloud-banner-inverse-400.png 320w" sizes="auto, (max-width: 300px) 100vw, 300px" /> </a></p>
</div>
</li><li id="block-7" class="widget-container widget_block">
<ul class="wp-block-list">
<li>mxguarddog</li>
<li><a href="http://mxguarddog.com/">stop spam</a></li>
<li><a href="https://mxguarddog.de/">Spamschutz</a></li>
</ul>
</li><li id="block-5" class="widget-container widget_block">
<ul class="wp-block-list"></ul>
</li><li id="paypal_donations-2" class="widget-container widget_paypal_donations"><h3 class="widget-title">Donate</h3><p>If you like this site, please consider a donation. Just click on the yellow button</p>
<!-- Begin PayPal Donations by https://www.tipsandtricks-hq.com/paypal-donations-widgets-plugin -->
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank">
<div class="paypal-donations">
<input type="hidden" name="cmd" value="_donations" />
<input type="hidden" name="bn" value="TipsandTricks_SP" />
<input type="hidden" name="business" value="Willem@Aandewiel.nl" />
<input type="hidden" name="return" value="https://willem.aandewiel.nl/index.php/thank-you-for-your-donation/" />
<input type="hidden" name="item_number" value="www.aandewiel.nl" />
<input type="hidden" name="rm" value="0" />
<input type="hidden" name="currency_code" value="EUR" />
<input type="image" style="cursor: pointer;" src="https://willem.aandewiel.nl/wp-content/uploads/2022/09/bmc-button-75.png" name="submit" alt="PayPal - The safer, easier way to pay online." />
<img alt="" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1" />
</div>
</form>
<!-- End PayPal Donations -->
</li><li id="views-4" class="widget-container widget_views"><h3 class="widget-title">Views</h3><ul>
<li><a href="https://willem.aandewiel.nl/" title="Recent Projects">Recent Projects</a> - 433,904 keer bekeken / views</li><li><a href="https://willem.aandewiel.nl/index.php/2020/02/28/restapis-zijn-hip-nieuwe-firmware-voor-de-dsmr-logger/" title="restAPI&rsquo;s zijn hip! (nieuwe firmware voor de DSMR-logger)">restAPI&rsquo;s zijn hip! (nieuwe firmware voor de DSMR-logger)</a> - 293,341 keer bekeken / views</li><li><a href="https://willem.aandewiel.nl/index.php/2019/04/09/dsmr-logger-v4-slimme-meter-uitlezer/" title="DSMR-logger V4 (Slimme Meter uitlezer)">DSMR-logger V4 (Slimme Meter uitlezer)</a> - 199,654 keer bekeken / views</li><li><a href="https://willem.aandewiel.nl/index.php/2019/02/11/home-assistant-integratie-met-de-dsmr-logger/" title="Home-Assistant Integratie met de DSMR-logger">Home-Assistant Integratie met de DSMR-logger</a> - 133,942 keer bekeken / views</li><li><a href="https://willem.aandewiel.nl/index.php/2018/08/28/slimme-meter-uitlezer/" title="Slimme Meter uitlezer">Slimme Meter uitlezer</a> - 111,131 keer bekeken / views</li><li><a href="https://willem.aandewiel.nl/index.php/2022/01/02/yet-another-parametric-projectbox-generator/" title="Yet Another Parametric Projectbox generator">Yet Another Parametric Projectbox generator</a> - 56,069 keer bekeken / views</li><li><a href="https://willem.aandewiel.nl/index.php/2018/12/03/donoff-wifi-enabled-light-dimmer/" title="DONOFF &ndash; WiFi enabled light dimmer">DONOFF &ndash; WiFi enabled light dimmer</a> - 55,041 keer bekeken / views</li><li><a href="https://willem.aandewiel.nl/index.php/boekbespreking/" title="Boekbespreking">Boekbespreking</a> - 41,247 keer bekeken / views</li><li><a href="https://willem.aandewiel.nl/index.php/2018/09/27/aan-de-slag-met-de-esp8266/" title="Aan de slag met de ESP8266">Aan de slag met de ESP8266</a> - 40,253 keer bekeken / views</li><li><a href="https://willem.aandewiel.nl/index.php/2021/04/16/slimme-meter-poort-extender/" title="Slimme Meter Poort Extender (P1 HUB)">Slimme Meter Poort Extender (P1 HUB)</a> - 37,154 keer bekeken / views</li></ul>
</li><li id="recent-comments-4" class="widget-container widget_recent_comments"><h3 class="widget-title">Recent Comments</h3><ul id="recentcomments"><li class="recentcomments"><span class="comment-author-link">Willem Aandewiel</span> on <a href="https://willem.aandewiel.nl/index.php/2022/11/15/crisis-what-crisis/#comment-5370">Crisis? What Crisis? (een betere DSMR-logger)</a></li><li class="recentcomments"><span class="comment-author-link">Lukasz</span> on <a href="https://willem.aandewiel.nl/index.php/2022/11/15/crisis-what-crisis/#comment-5369">Crisis? What Crisis? (een betere DSMR-logger)</a></li><li class="recentcomments"><span class="comment-author-link">Gunnar Nilsson</span> on <a href="https://willem.aandewiel.nl/index.php/2022/01/02/yet-another-parametric-projectbox-generator/#comment-5344">Yet Another Parametric Projectbox generator</a></li><li class="recentcomments"><span class="comment-author-link">Willem Aandewiel</span> on <a href="https://willem.aandewiel.nl/index.php/2022/01/02/yet-another-parametric-projectbox-generator/#comment-5342">Yet Another Parametric Projectbox generator</a></li><li class="recentcomments"><span class="comment-author-link">Willem Aandewiel</span> on <a href="https://willem.aandewiel.nl/index.php/2022/01/02/yet-another-parametric-projectbox-generator/#comment-5341">Yet Another Parametric Projectbox generator</a></li><li class="recentcomments"><span class="comment-author-link">Gunnar Nilsson</span> on <a href="https://willem.aandewiel.nl/index.php/2022/01/02/yet-another-parametric-projectbox-generator/#comment-5340">Yet Another Parametric Projectbox generator</a></li><li class="recentcomments"><span class="comment-author-link">Willem Aandewiel</span> on <a href="https://willem.aandewiel.nl/index.php/2022/11/15/crisis-what-crisis/#comment-5294">Crisis? What Crisis? (een betere DSMR-logger)</a></li><li class="recentcomments"><span class="comment-author-link">Frank</span> on <a href="https://willem.aandewiel.nl/index.php/2022/11/15/crisis-what-crisis/#comment-5293">Crisis? What Crisis? (een betere DSMR-logger)</a></li><li class="recentcomments"><span class="comment-author-link">Willem Aandewiel</span> on <a href="https://willem.aandewiel.nl/#comment-5230">Recent Projects</a></li><li class="recentcomments"><span class="comment-author-link">rom</span> on <a href="https://willem.aandewiel.nl/#comment-5229">Recent Projects</a></li><li class="recentcomments"><span class="comment-author-link">rom</span> on <a href="https://willem.aandewiel.nl/#comment-5228">Recent Projects</a></li><li class="recentcomments"><span class="comment-author-link">rom</span> on <a href="https://willem.aandewiel.nl/#comment-5227">Recent Projects</a></li><li class="recentcomments"><span class="comment-author-link">rom</span> on <a href="https://willem.aandewiel.nl/#comment-5226">Recent Projects</a></li><li class="recentcomments"><span class="comment-author-link">Willem Aandewiel</span> on <a href="https://willem.aandewiel.nl/#comment-5225">Recent Projects</a></li><li class="recentcomments"><span class="comment-author-link">Rom</span> on <a href="https://willem.aandewiel.nl/#comment-5224">Recent Projects</a></li></ul></li><li id="wp_statistics_widget-5" class="widget-container widget_wp_statistics_widget"><h3 class="widget-title">Statistics</h3><ul><li><label>Last 7 Days Views:&nbsp;</label>4,598</li><li><label>Total Views:&nbsp;</label>319,509</li><li><label>Total Visitors:&nbsp;</label>496,961</li><li><label>Total Page Views:&nbsp;</label>4,480</li><li><label>Total Spams:&nbsp;</label>40,096</li></ul></li><li id="meta-2" class="widget-container widget_meta"><h3 class="widget-title">Meta</h3>
<ul>
<li><a href="https://willem.aandewiel.nl/wp-login.php">Log in</a></li>
<li><a href="https://willem.aandewiel.nl/index.php/feed/">Entries feed</a></li>
<li><a href="https://willem.aandewiel.nl/index.php/comments/feed/">Comments feed</a></li>
<li><a href="https://en-gb.wordpress.org/">WordPress.org</a></li>
</ul>
</li><li id="annual_archive_widget-7" class="widget-container Annual_Archive_Widget"><h3 class="widget-title">Archives</h3> <ul>
<li><a href='https://willem.aandewiel.nl/index.php/2026/'>2026</a>&nbsp;(1)</li>
<li><a href='https://willem.aandewiel.nl/index.php/2025/'>2025</a>&nbsp;(4)</li>
<li><a href='https://willem.aandewiel.nl/index.php/2024/'>2024</a>&nbsp;(5)</li>
<li><a href='https://willem.aandewiel.nl/index.php/2023/'>2023</a>&nbsp;(4)</li>
<li><a href='https://willem.aandewiel.nl/index.php/2022/'>2022</a>&nbsp;(7)</li>
<li><a href='https://willem.aandewiel.nl/index.php/2021/'>2021</a>&nbsp;(4)</li>
<li><a href='https://willem.aandewiel.nl/index.php/2020/'>2020</a>&nbsp;(5)</li>
<li><a href='https://willem.aandewiel.nl/index.php/2019/'>2019</a>&nbsp;(6)</li>
<li><a href='https://willem.aandewiel.nl/index.php/2018/'>2018</a>&nbsp;(4)</li>
<li><a href='https://willem.aandewiel.nl/index.php/2017/'>2017</a>&nbsp;(2)</li>
<li><a href='https://willem.aandewiel.nl/index.php/2016/'>2016</a>&nbsp;(1)</li>
<li><a href='https://willem.aandewiel.nl/index.php/2013/'>2013</a>&nbsp;(5)</li>
<li><a href='https://willem.aandewiel.nl/index.php/2010/'>2010</a>&nbsp;(1)</li>
<li><a href='https://willem.aandewiel.nl/index.php/2009/'>2009</a>&nbsp;(4)</li>
<li><a href='https://willem.aandewiel.nl/index.php/2008/'>2008</a>&nbsp;(1)</li>
<li><a href='https://willem.aandewiel.nl/index.php/2006/'>2006</a>&nbsp;(4)</li>
<li><a href='https://willem.aandewiel.nl/index.php/2005/'>2005</a>&nbsp;(3)</li>
<li><a href='https://willem.aandewiel.nl/index.php/2004/'>2004</a>&nbsp;(2)</li>
</ul>
</li> </ul>
</div><!-- #primary .widget-area -->
</div><!-- #main -->
<div id="footer" role="contentinfo">
<div id="colophon">
<div id="site-info">
<a href="https://willem.aandewiel.nl/" rel="home">
Willem&#039;s Website </a>
</div><!-- #site-info -->
<div id="site-generator">
<a href="https://wordpress.org/" class="imprint" title="Semantic Personal Publishing Platform">
Proudly powered by WordPress. </a>
</div><!-- #site-generator -->
</div><!-- #colophon -->
</div><!-- #footer -->
</div><!-- #wrapper -->
<script type="speculationrules">
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"\/*"},{"not":{"href_matches":["\/wp-*.php","\/wp-admin\/*","\/wp-content\/uploads\/*","\/wp-content\/*","\/wp-content\/plugins\/*","\/wp-content\/themes\/twentyten\/*","\/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
</script>
<script type="text/javascript">
//<![CDATA[
!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="https://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");
window.___gcfg = {lang: "en"};
(function() {
var po = document.createElement("script"); po.type = "text/javascript"; po.async = true;
po.src = "https://apis.google.com/js/plusone.js";
var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(po, s);
})();
//]]>
</script>
<div id="fb-root"></div>
<script>(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.0";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script><script type="text/javascript" src="https://willem.aandewiel.nl/wp-includes/js/comment-reply.min.js?ver=6.8.2" id="comment-reply-js" async="async" data-wp-strategy="async"></script>
<script type="text/javascript" id="spacexchimp_p008-frontend-js-js-extra">
/* <![CDATA[ */
var spacexchimp_p008_scriptParams = {"scroll_duration":"300"};
/* ]]> */
</script>
<script type="text/javascript" src="https://willem.aandewiel.nl/wp-content/plugins/simple-scroll-to-top-button/inc/js/frontend.js?ver=4.46" id="spacexchimp_p008-frontend-js-js"></script>
<script type="text/javascript" id="dco-comment-attachment-js-extra">
/* <![CDATA[ */
var dco_ca = {"commenting_form_not_found":"The commenting form not found."};
/* ]]> */
</script>
<script type="text/javascript" src="https://willem.aandewiel.nl/wp-content/plugins/dco-comment-attachment/assets/dco-comment-attachment.js?ver=2.4.0" id="dco-comment-attachment-js"></script>
<script type="text/javascript" src="https://willem.aandewiel.nl/wp-content/plugins/enlighter/cache/enlighterjs.min.js?ver=bU/DtqPSyMHvCUM" id="enlighterjs-js"></script>
<script type="text/javascript" id="enlighterjs-js-after">
/* <![CDATA[ */
!function(e,n){if("undefined"!=typeof EnlighterJS){var o={"selectors":{"block":"pre.EnlighterJSRAW","inline":"code.EnlighterJSRAW"},"options":{"indent":2,"ampersandCleanup":true,"linehover":true,"rawcodeDbclick":false,"textOverflow":"scroll","linenumbers":true,"theme":"enlighter","language":"generic","retainCssClasses":false,"collapse":false,"toolbarOuter":"","toolbarTop":"{BTN_RAW}{BTN_COPY}{BTN_WINDOW}{BTN_WEBSITE}","toolbarBottom":""}};(e.EnlighterJSINIT=function(){EnlighterJS.init(o.selectors.block,o.selectors.inline,o.options)})()}else{(n&&(n.error||n.log)||function(){})("Error: EnlighterJS resources not loaded yet!")}}(window,console);
/* ]]> */
</script>
<script type="text/javascript" src="https://www.recaptcha.net/recaptcha/api.js?hl=en_GB&amp;onload=sgr_2&amp;render=explicit&amp;ver=1770726130" id="sgr_recaptcha-js"></script>
<script defer type="text/javascript" src="https://willem.aandewiel.nl/wp-content/plugins/akismet/_inc/akismet-frontend.js?ver=1756203137" id="akismet-frontend-js"></script>
<a
id="ssttbutton"
href="#top"
class=""
>
<span class="fa-stack fa-lg">
<i class="ssttbutton-background fa fa-stack-2x"></i>
<i class="ssttbutton-symbol fa fa-caret-square-o-up fa-stack-1x"></i>
</span>
</a>
</body>
</html>