tag:blogger.com,1999:blog-23595784648045787232024-03-28T10:37:43.190+01:00chriga's blogUnknownnoreply@blogger.comBlogger60125tag:blogger.com,1999:blog-2359578464804578723.post-61655838188491820372017-07-22T01:30:00.000+02:002017-07-22T01:53:44.543+02:00Using .NET Standard 2.0.0 preview in Visual Studio.NET Standard is the new common library for all .NET platforms (.NET Framework, .NET Core, Xamarin). There is a good introduction on the .NET Blog (<a href="https://blogs.msdn.microsoft.com/dotnet/2016/09/26/introducing-net-standard/">https://blogs.msdn.microsoft.com/dotnet/2016/09/26/introducing-net-standard/</a>).<br />
You can create a new .NET Standard project within Visual Studio 2017. Click on "Create new project...". Then you can select the .NET Standard entry to create a Class Library (.NET Standard). As .NET Framework you can choose a version equal or greater than 4.6.1 to support .NET Standard 2.0.<br />
<br />
<a href="https://www.blogger.com/blogger.g?blogID=2359578464804578723" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=2359578464804578723" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><img alt="" height="276" src="data:image/png;base64,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" style="cursor: move;" width="400" /><br />
<br />
<a href="https://www.blogger.com/blogger.g?blogID=2359578464804578723" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=2359578464804578723" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a>After creating the project, you can see under Dependencies the NETStandard.Library.<br />
<br />
<img alt="" src="data:image/png;base64,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" /><br />
<br />
You can choose "Manage NuGet Packages..." from the context menu to have a closer look. You can see that version 1.6.1 is used, since it is the latest stable version that is compatible with the .NET Framework 4.7.<br />
<br />
<img alt="" src="data:image/png;base64,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" /> <br />
<br />
Furthermore you can see the messages "Blocked by project" and "Following versions are unavailable due to additional constraints in the project or packages.config" for version 2.0.0-preview2-25401-01 and some others.<br />
<a href="https://www.blogger.com/blogger.g?blogID=2359578464804578723" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><br /></a><a href="https://www.blogger.com/blogger.g?blogID=2359578464804578723" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a>
Following entries can you see in the project file.<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: blue;"><</span><span style="color: #a31515;">Project</span><span style="color: blue;"> </span><span style="color: red;">Sdk</span><span style="color: blue;">=</span>"<span style="color: blue;">Microsoft.NET.Sdk</span>"<span style="color: blue;">></span>
<span style="color: blue;"> <</span><span style="color: #a31515;">PropertyGroup</span><span style="color: blue;">></span>
<span style="color: blue;"> <</span><span style="color: #a31515;">TargetFramework</span><span style="color: blue;">></span>netstandard1.4<span style="color: blue;"></</span><span style="color: #a31515;">TargetFramework</span><span style="color: blue;">></span>
<span style="color: blue;"> </</span><span style="color: #a31515;">PropertyGroup</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Project</span><span style="color: blue;">></span></pre>
<br />
Nevertheless you can install the 2.0 version via Package Manager Console. Just enter<br />
<br />
Install-Package NETStandard.Library -IncludePrerelease -Version 2.0.0-preview2-25401-01<br />
<br />
If you look again in the project file, you will see 3 lines that were added.<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: blue;"><</span><span style="color: #a31515;">Project</span><span style="color: blue;"> </span><span style="color: red;">Sdk</span><span style="color: blue;">=</span>"<span style="color: blue;">Microsoft.NET.Sdk</span>"<span style="color: blue;">></span>
<span style="color: blue;"> <</span><span style="color: #a31515;">PropertyGroup</span><span style="color: blue;">></span>
<span style="color: blue;"> <</span><span style="color: #a31515;">TargetFramework</span><span style="color: blue;">></span>netstandard1.4<span style="color: blue;"></</span><span style="color: #a31515;">TargetFramework</span><span style="color: blue;">></span>
<span style="color: blue;"> </</span><span style="color: #a31515;">PropertyGroup</span><span style="color: blue;">></span>
<span style="color: blue;"> <</span><span style="color: #a31515;">ItemGroup</span><span style="color: blue;">></span>
<span style="color: blue;"> <</span><span style="color: #a31515;">PackageReference</span><span style="color: blue;"> </span><span style="color: red;">Update</span><span style="color: blue;">=</span>"<span style="color: blue;">NETStandard.Library</span>"<span style="color: blue;"> </span><span style="color: red;">Version</span><span style="color: blue;">=</span>"<span style="color: blue;">2.0.0-preview2-25401-01</span>"<span style="color: blue;"> /></span>
<span style="color: blue;"> </</span><span style="color: #a31515;">ItemGroup</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Project</span><span style="color: blue;">></span></pre>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
But this will not solve the problem. .NETStandard 2.0 is not used properly. In Visual Studio 15.2 you can not choose .NERStandard 2.0.<br />
<br />
<img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAawAAAE2CAIAAACyVzHeAAAgAElEQVR4nO2d34sbV57ozz+SNoHAkJdAMChevdx5mEw3hE3ArHd2EwjCPQh2gwzZ9ICTwU7IQ5SZZmK1GWYZ2AmeeANuBG7bsDKknRnMbe6dvleIcfBtz6BgGLqNHbct9/RySXZ2Se1D/Trn1KlSSSpVHak+H74Y1ak6VUdS1cfnW0ddRwwGhwRBEKUNUXgLCIIgCgwxGBz+7OJNwhiDweGV//tnItso/KQnCDmQIBJEgkSpAwkiQSRIlDqQIBJEgkSpAwkiQSRIlDqQIBJEgkSpI06Cn778tPB4+o23L9782cWfvCC+8/LquEJZeUmIl35YtNQykeAv3nze/2jEM2/2rrRe916MrIP2i0KIZz/4RVAS7Gr8faaL1utCCPFK2yYJfnFuccFjca03OBwMrjUWls71xjitIxV7a4teydj7HBK9c0t+s6cc4XuxLa41FhYWGtcMn4zb4BxavnFKOn/iQj/TTBJcfeMpIV5YCRdfXplEgp++/LQQ333phbmQ4JlXhBDixZZnsZMzKcHeyWfFSBIUQgzd5u/qbwsh/q7+9tDCmAt7obERLp7bOMxSgqlWTXz95yNBe+NaY2FpcVH7eK81FhYWcrL2tUZ4FsV80aYzLSrBT19+WjJgGJP1BC/+ZB4kePmDZ6LuyFCCGewzRbjdwBElKBO32V///T8KIZb/qekuLv9TUwjx13//j9pmkXP3i3OL0nmpXlRjXTx5S7B3bqlxbm0RCS4sNRpLi+e+CAs3Ti00Tk2p921sgH8g4xdtPtMiElx94ymzrUIJ/vC7/tXw3Z8E3nR5YSW6mCzBNHVtkaCbCPvdwIiwXEW6eGprvxiUvNI2Lyb0BF95/Rl5b/L+xetnoodTNnj+mWeFEM+fvKzZtv2iEM+8+cGL4/YEk3uFgQfjDGiQYG9tceHURuI5vdHw8xcv2wozmsZGdDF6AQQl1xoLS+c21tzN/cvVu3oXFk5tGI4VrF1alC+hjVNe16+3tti4NugZJZiinYmNcXsuUpW4y9uGcBt2rRF+m1+cW3RLovciDB9F4rvWto9ucy343hbPrQWvlfQ85kwzSdC7CRgrQb1k5SXfhjd/djGymCTBT19+Wjz16qfD6toiwTOvBFpJ7LX5Jdr2kepDJOiucs0rSTa+AeoGWkW3hWdecXfbTiNBY+8vWYKBB+MMaJaguQ8V77KNU8rJrS0OkeBCKC+pUOm/RKp4a6UDbTQCr/k3vPR38cW5xYVIt0hrZ3JjpPxu+rc1M5Jg8MkEn0lUgpFPZui7Nn10iZ+M6VOKOdPG6Qn+bOUl/9L4zsur3j3E0GXaYoIEo8cy17VKgvE9QbUv9sybvWAIxV2rLaa9Jxjk4O4LeXv1cPoGfsVfvPm8Z8bW60rfMOt02A33PqCI3AqcpCfo3fAO7i711hZlbWmLQ3uC/ir/clW3146lX1puU681Ftd6g8PeOT/7i15g0feV2E5DY9Q9mFtrUfgN8z+KSIOlDfRvfNi7NnzjyZ9MjART9QSH3hMMzfXpy0+HfcO3X/2OkHJYbTGtBM11bZGg+Vad0u+LKCy4Aee6SVmcSIKGw+mWdAdAXn/R6/354yEy6TyYXoJBFqzdH0yS4NB7guG563e7BocDb9gxrCgtppRgcFzjFRgcS9mbaz3ffWEKpo5rJ11yMe1MbsxMSdD96DaC/xWykKD20Y0nwbT3BC96Hb3Y0eGVl7wfzay+8ZSaIL/96nfkTpy6KEsw6FRG0uGYXdkiQd8jptHh9kn/HlyYh5rT3mBxhHT4xdafVcf1DIeLdBUjfU81E890dPhKZCzYODRskqDX+YodHZbvvqlndtgRUxaHpMNh3y3o1sldTkN+Ku2tt7a4eKqhj4HKPcGEpC/azsTG6ElfdAOrQu+5y3c51U/SmA4nv2vDR5f4ycS8Np1pMb8TXH3jqeD/ff13gv7YxdMvvfC0r0WPl354MbKYJEH3tccLK3F17ZFg6MFQLpq5hHjm2eflvqEQnq20RWWcJGZXSn9Nc1zkcPH5cuQ24ogSHMOACYXmS0i6zx35naB/UzywT5ixntoYRBbVDpqqxeAGfNxQQ+RYEelsNAy/hjNJUGlJY8PYzuTGyB9Lch/HhtA+xkBexm64+skMfdf6Rzf8k/EGuBrX4nee8DtBIkmCsxW9k8/G/AqnuCj6Wp005AQtO2uMVMt4C5UYM5DgXEtQGhe2Jwo/6SeK2LHsMWIsCQYJO5FRIMG5laCXfRf0t3HzKEE3U84wFR1Rgl4eZ2cuPMOBBOdWgtZG4Sc9QciRatSPIAhiXgMJEgRR6hAHAAAlBgkCQKlBggBQapAgAJQaJAgApUYc/aVDjBdFf3cAkAFIEAkClBokiAQBSg0SRIIApQYJIkGAUoMEkSBAqUGCSBCg1CDB8eMP9w6L/voAYFJiJfjuXce5O6YdbjrOhbZztO38yX0x6h7Grphv/I+Pv/1fX/570d8gAExEjATbzp8Gzs3BmCa6OZbCxqtVbPzVvzgbX/z/or9EABgfswRf7Tl/6nn/IsGh8c//++uiv0cAGBOzBC8M/Hx24LwqS+qG8yfHcZxQjrGFbd1rFwaOy80bzlE33Xa5622pLXoV297Og4re2p5XOJ6mM493PvuPh4+L/jIBYHRMEpTcd0HKiG86juOWS/fs4gq1FxcGsbYyGlMu9NynHdS9X3nDcRzn3aIN6MbJjf8s+tucVX4L80vRJ9dwDBKUs+BXe+HwiCypd+96bkoulEdIdFXdCPp+8RJUKxoPak8S/eIn3xb9bc4qv/3tb7swj8yqBMPM1OfdiG4uDAw+ihbGSlAqCTqbMy3Bv13/L34xMzZIcF6ZTQne8NNbP2S1eT1EyU1xhUPS4RtJSfTR+HQ4qmMbJPgP1/5zb//PRX+VMwwSnFdmUoLv3tVv3gUZ8U3HuemPZshjFMZCo9fkzbxxEumHON5QSfzAiFF8hUvwvc//o+gvceZBgvPKTEowIYy6KdxBxcav/g8/jskAJDivIME5j3/7f/xMOhuQ4LyCBOc8Mv0idrcvX/C4vL07au2dTa/i7vblceqnY2o7VyV4+aNGo/HRZbXk7MefqwXSBpc/0rYHW8hIgu75rV0eO5spz8bg6ohZzwMULJDg7vblCxc2d8LF7Z2kzSPsbMrVMyb1qTYBEQmePXtWs5wswc8/Pistfv7x2bMffXRWtSTYQXYS9E5C6T/ihDNTXjX86kCChUtwd/vyhAqbqqeKkeDHl2XRqRL8/OOzkiBdI6pehDy4efPm0MLMJSi9Ti/BIScwEixaggkOlFJkf4udzQuXt7c3pcQgzBT8Rf8r96tf3t42nTfKybS56XVGw92pS/6ivvPEtqVVqEGCn8vmUyRocqDeO4Rps7293W63Nzc35cLNzc12u729vR2U5CPB+JN2U706zOctErRAgmZNSN34MAfY2Qy+vXB93Cnird7dvnxhiASjpjL+f2vY+ZC2TSBB04uufjswdB8WzBvNg1EDdvNOh5NP2tjzFglaIEFjT1At39mMSiXxK1fcOtRo0smk9Szjdp62bamIkWBgPKUk7u7g5x+fZXgkZwIPGg3YncrASHDiSedYmpP2IPa8FVk0ESYhxoKFSDA8aFC/UAl6ZgtKtO7e5Y8aGlgwb1wPGg3YnUo6HClMedIeIEGbkfLIg4NgdFjruidnvinTYeksCJNg9X/UcMP06XB82yZKh7vdrqvBRqPh3/iTLaf/coa+YDFsb28bDdjNR4JpT9rY8xYJ2oF0vzb8ysLCuG808SvfCcYotqOFFzY3TdWDwZTNTb8n6dWIHRhJbNvkEvQ0ePbjz4c5EAvaRx4STH/Sxpy3SLAETP4jnCmT7i9G1NuBMAvMxl+MFN0AmDrG0V+r4M/m5hUkCAUiJ9hWdwMPkOD8ggQBUoEE5xUkCJAKJDivzKgErzaOHFnwaVyNr3prbenI0tott4r7QttPtBDAABKcV2ZXgr68bq0tHUnSoKHKkEIAA9Oa6AwsoOiTaziJEkwrMiQIALNKogSvNvyOoNGM0Rdu5/HIwsLC0toaEgQA+0m6J3gkzIVTSvBqw69za23pCBIEAOsZek8wOvQRL8Fba0uh90iHAWAGSL4nGIyMIEEAmE9S9gSlceKrjSOkwwAwLyTfE5QsdrXhFTYaSQMj/mYMjADATMBfjABAqUGCAFBqkCAAlBokCAClBgkCQKlBggBQapAgAJQaJAgApQYJFoPjOBcAwAKQIACUGiQIAKUGCQJAqUGCAFBqkCAAlBokCAClBgkCQKnJc/L11HsGAMiLPCdfz3DWESYwAYBsyHPydSSYRLsmRK095SNUmr00hQAlIs/J1zVzqf3MYKW/B3/KpquNI0tra8HUJbeUWVAaV90KM59i95qVSq1WmaqPkCCAgTwnX4/sOZRs8FJRcKC80IeyGXVTzzC9ZqXS7Ln/Tu0gSBDAQJ6TrxtLfKmp3UCpo5d86PmY3NO3n2LBXrMiXGrt6GK0oF0TlWbbK6y1w/X+LpUNlMJer1mRcnFdjO2aqDSbNXVvB22vIGjQ0AZE2oyBwQLynHzdcCPPrRHWMwzFDJOgv58ZTodD90kWbNeUW4TaouyPdq3S7HlScsukl9K9Rqm016yEm/q1/f3rh3IrhvvQ7lwGLUnTALXNSBAsIM/J102jGbfWlpYajSU579Y2SiXBA83AM4Xc/wu7ZL1mJdKHMnWpgn6VbBTja0U5vunktb6qdDHF7DnsCkb3b3ptaDNA8eQ5+bryO0Elm5W7cFJGHJ8OH1xtHPE2CBo2q7cGQ5dE9eB6I1gOF9X81d9PegkG9cPC+PuScUYLbJ1egpgPrIO/GCkaPSXUVaFZyV9s14SWSqaRoCS8aIoaO0Jt2ltQFs2s0zTA/N4BCgAJFkzUA56gtHGHyDCEkl2mTodrtYq6Fz1HNvXVjHvzDx96c2gDIm1GgmABSBBCIkMiAPMPEgSfKf9MEcBOkCAc+GkqCoQyggQBoNQgQQAoNUgQAEoNEiyGdwAgRxIuRiRYDO+8844DALmABG0ECQLkBhK0ESQIkBtI0EaQIEBuIEEbQYIAuYEEbSQiwX6r6j9ZoNrqO47jdOr+qxGJVOy3ql7J2PscQngEAPtAgjaiSLDfqgpR74SLrY6TpQRTrZqETj10N4B1jCpB46NPjczhvJe5IUmw36pKBgyZGQn2W9V6q1VFgmArY0hQfpJzwgObkeD4hBKMc6AkrE7dz5S9DcPcud6JLkZNF5R06qLa6nib+xt16qJar3ud0cixgrXVqtzQYJf9VrXecfpIEOxlEgkaZz6K2RJGQZGgWR/xLuvUFW1qi0MkKEJ5SYWRJihVQhn7B/Jf+q1HgmAxk0lQtqBxWvSrwWzrtyLVU07KXkZG6glK3TPfOLK2tMWhPcF+WGroOWrHUtYGFuzUNfUhQbCYrCQYMy16OBtd8gzFCbPQlZER7gmG6xXTuDlwUFFaTCnBYL9SoeFYyt7cUn9d6Et1XBvALiaXoD+ncNK06ME86iYJDpmPuIwoo8OdukgYHZbvvqma0bpfkpuS0uGw7xZ065Tbg9FkWdpbv1Wt1uvRXh89QbCYjO4JDpkWPXGadiQYQf+doPQzwcjvBP11gX20wQt9LEPpoKlaDEY5pJGPSPdQOVZEqZ26MHRckSBYzKSjw775jNOi+yWhIuOmaScdVpjdvxjRh2EArGf83wnqtjJNi95oLLklYS/RME178qTsZWRWJUiPD2YQy/5iJOk3NyViBiXoZsooEGYPuyQYTarLyQxKEGBWsUGCt9aWghSbbuDBARIEyBEbJAg6SBAgN5CgjSBBgNxAgjYyrTm1AMBEwsWIBAGg1CBBACg1SBAASg0SBIBSgwQBoNQgQQAoNUgQAEoNEgSAUoMEAaDUIEEAKDUmCQZPRQ0frD/i06/GqAIAUAQRCcoPPb21tsZzrwBgrolIkHmQAKBMmOcYiUyolDCH+tXGkaW1tWAKEW0KduNa5mIPade0uXtFpdmb+vGme4wxaNfsaxOUBOPAiPcgaGmeuYRJ4642jvil4Xqlimktk89pZG4B4w7bNSFq7QyPkhVIEAojfnT41trSEXUqYfP0waaJhpPXMg2xgdwkaKdrrG0YzD9JP5Hxx0iQYA4oFghzZK/b1q6JSq1W8ZZ7zYqXODfDWn6hELW2nGSHHb+wsNLsafs0HrHZ9vZZa4e7D1upHPGgXQsO1VZa5ZaGGyub+Q0IqrRrQi0AmDLRgZE1X0nB71yGpsMjSpB02EByx61dC+0TprS9ZkWEG4TrA8cl9gTlfZqPGH0pHTxyxMCC7VqlUnHX9ZoVvzG++3rNivlNVZq9XrOiSBgJQg4kTr7u3RSURGaYQ30MCTIXexT1otc6bVrfSukyVpo9pZ8l9cyGSjDdEY2vo0cMhVdptt3XfpEkt4Owz6jvtlLBe1AA4/7FSFZzqDMXu4equbCrl16C2oDHKBJMPmKsBLUjunXdbmGvWam1g52lkqCoVCK7BJg+Y0owqznUmYvdR8kuRegOo5KM6bDmvFEkOPyI0deGbLrXrMiJcK1Wi6bwkhANuw2LSIchL0aSYFZzqDMXexT5og8GPmo1Q78sTF1jBkZE0NFSB0YO4tWWfMSE/qM62BE6VH2tbJy8W1/sSBDyggcozDKGnBQARgMJzjDG8V0AGAkkOHNEs1AAGB8kCAClBgkCQKlBggBQapBgMYi/+SVBELlF0sWY22UPMuJvftnd+5ogiBwCCdoIEiSI3AIJ2ggSJIjcAgnaCBIkiNwCCdoIEiSI3AIJ2ggSJIjcYlQJhg9VleZagoyJkeCV40KI166oJcfe2vJX+Ry/+PXaa0Ljufdud/e+7l5c9guW1zI4gYIGTFzl4nJck/z3MuqBCCJVjCFBaeJMHnU1HeIleOy5o+L4RaXEl6DREWr51upzgWi2Vt+6mFAxZWQiwdtvHRXiteXjJgmuvebrmyCmExNIkFmQpkaCBN+6uPrc0dUNuWTr67QSvLgswrqmDUaO7HqCe1dMErxyXG8wQYwQ//pv/3No4WQ9wSV52qUj0mNQwwejen1FfwPThMUH2qwjjcbS0P3EbjAXJElwS+4cjSjBvSvHhdyxkpLo165096Qk2ku6rxwXx956b1lJqPfcHqVbshrs31j3+GvHvCTXVCXS1IgELy6L15a9RmJDYsS4+YeHx3/w6ke/uiQXfvSrS8d/8OrNPzwMSsa/JyilwooZl9ZuHVxtqImylDkHs9TFTzXnl4abpj7QnJAswZgXAbJKYnJPEeTURnuqu3WlFt6zu3Lcr77x3rHIrTqlriTrhCpBRZMEJcmSFxOjhubBqAG74/cE5SmQpF6eJ0dtrkx1viRfXMkT0ZlmWRp6oHlhmATdLtKV0XuCfmytPudZKZIvC3kUQl7rv94y5uOJdeOq6E019gSvGF4TROoIPGg0YHeSdDicJD1mTrhba0telpqlBBMPNC8Ml+De7beOiuMXx5Wg2yNTNCoPm9x+6+iIEkyuiwSJQsP1oNGA3YwGRmJnhfNFqaXD4e28cO5iQ45sTIeTDzQnqBKMMZ13l22kgZFV2aHPvXdb78q5qtpafS6hJ2jMbYfXHSkdjr5lV/rFX07EjMbNPzw0GrA7mQQlS0mJ6pHG1WD29CORlFmRWLBZo2Gajv1AvgUZHWAxH2guSCVBRSjK7wTVoQ99YEQdvvAHNF67EtwuFEeXjyf0BPfCzFca5Uiua6yihVGC4YgK3UBiSsFfjNgIfzFCELkFErQRJEgQuQUStBEkSBC5BRK0ESRIELkFErQRJEgQuQUStBEkSBC5BRK0kcIn3yKIUkXSxZjbZQ8y4vQdgiByi6SLMbfLHmTE6TsOAOQCErQRJAiQG0jQRpAgQG4gQRsxSbBTF0LUO2pJtdX3V/nUO+qyEEJ420krlB2NS9CAiat06uYm+Q0e9TAA6UGCNhIjwWq1KqtClqDREmp5vxXW7rdanYSKKclEgv1WVYh6vW6QYMcvnLCdAEmI03f29vYePHiwv78/GAyePHmiXIxFWaDkxEmw1WlVQxuMKEHDVjZIMCiPSFAq68vvGyBTxOk73W53Z2dnd3d3f38fCVpBrAT7skVGlKDTqQtNikpyHMmVO3VRbbUiCWm/VfVKWvXYPLtTF9V6veotm6pEmqpLsK8JP5MMHiCCOH1nfX19c3NzZ2fn/v37g8FAuRiLskDJSZBgzAuhSUitEuDZyN/IaE91t0E+GnnVb1UjN+uUupKsE6oEFZEgFIM4fef8+fPr6+vdbndvbw8JWkGiBAMjjNoT9HHvwkXvCYYuje7Wf62bSRZdTN24KnpTkSAUgzh958MPP/zkk09+97vf7e7uPn78WLkYi7JAyRkiQW+MY1wJhmMkqqrC7tqIEkyuO64EuScI+SBO3/nggw9+/etfI0GLkCQYYzovrx1pYKQlO7Ta6utdOfdlsNIoQWNuO7zuSOlw1K2MDsMUQYI2MlyCilCU3wXGjwfrIyFhUb0jDV7U6wk9QWk30ihHcl1jFQ2TBKWKpMIwPZCgjfAXIwC5gQRtBAkC5AYStBEkCJAbSNBGkCBAbiBBG0GCALmBBG0ECQLkBhK0ER6llWoVQBYgQRvhUVrDVgFkBhK0ER6llW4VQAYgQRvhUVrpVgFkABK0ER6llW4VQAYgQRvhUVrpVgFkABK0ER6llW4VQAYgQRvhUVrqrUwkCFMECdoIj9JCgpAbSNBG+IsRgNxAgjaCBAFyAwnaCBIEyA0kaCNIECA3kKCNIEGA3ECCNoIEAXIDCdoIj9IKi/Xf/QBkDBK0ER6lJTVy8nYCJIEEbYRHaakof3kHkC1I0EZ4lNYoawEmAgnaCI/SMu4UYBogQRvhUVpyWzEgTBUkaCM8SitaE2BKIEEb4VFa3m65EwjTBwnaCI/SavWDnfJTQZguSNBG+IsRgNxAgjaCBAFyAwnaCBIEyA0kaCNIECA3kKCNIEGA3ECCNoIEAXIDCdoIj9JyHMeRfiTD7wVheiBBG+FRWu7GnU6wCRqEaYEEbYRHaY2yFmAikKCN8Cit9CsBJgQJ2giP0jI2F2AaIEEb4VFa+kr+dBimBhK0ER6lNdpqgAlAgjbCo7Ra/XBweOIBHIAkkKCN8Cgtv4PJ7wRh6iBBG+EvRgByAwnaCBIEyA0kaCNIECA3kKCNIEGA3ECCNoIEAXIDCdoIEgTIDSRoIzxKS4YJ2GGqIEEb4VFaahX+ag6mCBK0ER6lFdBvVest+V0DZAwStBEepRUeq95R//oYIGOQoI3wKC2/tdGnNgBkDBK0ER6lpdRDgjBNkKCN8CgtbchbezIEQIYgQRvhUVrKNvQEYZogQRvhUVpIEHIDCdoIfzECkBtI0EaQIEBuIEEbQYIAuYEEbQQJAuQGErQRJAiQG0jQRpAgQG4gQRvhUVouzDcHOYAEbYRHaQVbIz+YNuL0nR//+Mc///nPr1+//vvf//6Pf/zjlxJIsBh4lJZfyo+kYerQE7QRHqWlHIm/G4ZpggRthEdpxTQJIHuQoI3wKK107wQgA5CgjfAordFWA0wAErQRHqWlP0WGjiBMDSRoIzxKS3tfdANheiBBG+EvRgByAwnaCBIEyA0kaCNIECA3kKCNiNN3CILILZCgdRR+ThBEqQIJWkfh5wRBlCqQoHWYvqd7Hcdxbt9TS75ptfxVPp1Ld+q39bse/d/cFafviEuHfsFhPYNTJ2jAxFUuHcY1yX8vox6IIEYIJGgdpu/pXsf5pv/Q6VxSSnwJGh2hlrce9QPRtB61LiVUTBmZSPBu66Hj3D7smCRYv+3rmyCmGUjQOkzf072O803r0qP+w0dVuSS9BC8dOmFd0wYjR3Y9wdP3TBK819EbTBBTCSRoHabvydOH1DkaUYKn73UcuWMlJdG374nTUhLtJd33Os43rd8cKgn1abdH6ZY8CvZvrNu5/Y2X5JqqRJoakeClQ+f2oddIbEhMM5CgdZi+p6jyjPcEZZXE5J5OkFMb7anu1pVaeM/uXsevXv3NN5FbdUpdSdYJVYKKJglKkiUvJqYXSNA6TN+TJKxLh87te6P3BP1oPep7Vorky448CiGv9V+3jPl4Yt24KnpTjT3Be4bXBJF1IEHrMH1Psj7uth46nUvjStDtkSkalYdN7rYejijB5LpIkLA+kKB1SF9PjOm8u2wjDYw8kh3a/81dvSvnqqr1qJ/QEzTmtsPrjpQOR9+yK/3iLxViXgMJWof09cR29yShKL8TVIc+9IERdfjCH9C4fS+4Xeg8POwk9ARPh5mvNMqRXNdYRQujBMMRFbqBxFQDCVpH4ecEQZQqkKB1FH5OEESpAglaR+HnBEGUKpCgdQieJwiQF0jQRpAgQG4gQRtBggC5gQRtRCizzWU11drQeYrT1B33yCJmrs0iYUp3cBwkaCfjSjD5qh5VgjFTbo5MOO+wZSBBcBwkaCdzJ0E7XWNtwyBXkKCNmCTYqbtzlyszrPuzngtR7+hzq0emLk+UYLgnvbaod7wqHX+O9aCyfHz/EPV6VSgzqcuzwisbmFvoH6XeCXcfd0TpvwjpTfVbVbdUf1NaC9VZ3uUZ6C3tusJUQII2EiNBSTWBqZSL1di1ibovupmUsfZbVcNmnXqgonBbaYNO3XdctAX6fuI30I7ib5lwROnjqVar7rp+qxo0xvSmpF2Iaqvfb1UlCSO/8oEEbSS2J6glp/1WVXGKajetE5YgQckD0iHj0mHl6CFBhzHWwulbmPqIofCqrY772i9K96aqValB+ucJpQAJ2khaCTqO45tBv8JDBfhSmIoEtY7TKBJMamH6I7p13W5hv1Wtd4KdpXpTolrVdyl9nlAKkKCNjCRBR0kA1VTPMaa3Q9Ph5CMq2au6o1EkmNTC9Ed0+q2qnAjX63XpAKneVLTRkc9z1DElmCWQoI2kldl2HY0AAAJlSURBVKBpZMFf8lPHar0+tCfoyJlmuEraW0Jvbux0OKGF8a/1I8oOVV+b35Rxt34arH+eSLAUIEEb4S9GAHIDCdoIEgTIDSRoI0gQIDeQoI0U/ng1gihVIEHr+PLLL+XFvb29bre7vr5+/vz5Dz/88AMAyJTz58+vr693u929vb3BYCBffUiwGDQJPnjwYGdnZ3Nzc319/ZNPPvk1AGTK+vr65ubmzs7O/fv3kaAVaBLc39/f3d3d2dnpdru/A4Cs6Xa7Ozs7u7u7+/v7T548ka8+JFgMmgQHg8H+/v79+/f39vZ2ASBr9vb2Hjx4sL+/PxgMkKAVaBJ88uTJkydPBoPBYDB4DABZ415c7oWmXYxIsBg0CRrZ2tpaWVlZXFw8duzY4uLiysrK1tZWDm0DKBVIsBiSJfj48eP3339/eXn5+vXrX3311V/+8pevvvrq+vXry8vL77///qNHj3JrJ8DcgwSLIVmCZ86c+elPf/rtt99qv/n89ttvV1dXz5w5E1OvXRO19jSam5Z2TVSavSnsuNesBHtu14QQUzoOlBAkWAwJEtza2jp58qRrvc8+++zEiRPHjh07ceLEZ5995haePHkyJi+eXwkqh0j/JnNoD8w8SLAYEiT4ox/9qNPpOI5z48aNoyquBzudzsrKiqlqSSSY/hBIEIaDBIshQYLf+973Hj9+7DjOiRMnNAmeOHHCcZyHDx9+//vfN1WVJdhrVryHRnlFYUGwUbsmKs1mzS2M2qJd0yrEbO/vudJsRqTTrolKs+1tUGuHrQi2S3cUV2fhtl65/i7l5XDjgv9rALv5b43/lIsfBsfDAAAAAElFTkSuQmCC" /><br />
<br />
It is supported with Visual Studio 15.3.<br />
<br />
<a href="https://www.blogger.com/blogger.g?blogID=2359578464804578723" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=2359578464804578723" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbYAAAElCAIAAAAHmVDKAAAfDklEQVR4nO2dT4gk132AK7eABTnGvuxEB4N98Pogu9E2BAJyDgNCgSUgsAJprNCniD7ostiwKDloFBZ2enZ88cFipc1hhg5rgTPtwERZ5OxBE9oTEdS9cloSyDOrXWZWo42sZSNyqBy6/rxX9aq6uupVv193fx8/RPereq9q5rW+fb96Pe95j2DuPASABcFzrYtVxHWnA0BRUKQDXHc6ABTFrEjvxwPCVqBIgMUFRaJIAMgERaJIAMgERaJIAMgERaJIAMgERaJIAMgERaJIAMgERdYeo7sPUSTAglJVke2h7w8/KuWOj/r+4+7WwNv6dDx5MWsLpSvON/7o7w5v/fcDFAmwiFRT5Nan45Oz/kk5T4WKnEctx/GHlw+v/8enKBJg4aikyOatx+Nbw8l/UeTU+Pv936FIgMWiiiKH3ZMwUz75tKkqbOfTse/7vh+qM7twK2G9YffEn9DfGXiTRH7C8CPvxx/1/cTbsOJW0HhUMTh668zXLuo4/mrnw8/+5/euOx0AilJBkbEZQ1cGYvL9SXn8rDCrMPFi2D3JcpnRp2phaMbERSfPSXfOfP+s7dqPk/jTn41cd/qicguWF9cfrkzKK1LNr5u3HoeTNloi3B5OzJVfqM7bpES2cxaODrMVqVc0XVRQev7Hr77nutMXlVu3bg1gGVlKRSo5b8BEUsmsOWWrdGG2IuOSaKC62Io8v/X+6K7rPl9YUOSysoyK3Dnz4+ePCfGFyXJsrqzCaYl2dBVDej7ITrTTshahyD//+Qefnv2e6ZrSoMhlZQkV2R4mHxqGufZHff9xf/g4PXNiLDRZT511CWdvlK8WBRM4mdM1Ri26V+Tf/NNH0a/XdacvKihyWVlCRWaHUUbuDeU2/uHffqf+el13+qKCIpcVFLnSitw5vJ/49bru9EUFRS4rKHKlFZn+9Vbor6ODm9cDbh4czVp7tB9UPDq4WaZ+MWprXFfkzasvvfTS1Zt6yeXX39YLlBNuXk2cD1KwpMjJ5zvxv8dov+CnMfq/Qy9mGYvFUeTRwc3r1/dH8duD2b5hOdpXq1um8AexAilFXr58OeFAVZFvv35Zefv265cvX716WXcoyMCeIoMPofLPdM4nUz2U+X8HilwURR4d3KwouFot5kaRr99UNagr8u3XLyv6nPhStybMg3feeWdqoXVFKq+LK9J8GopcEEXmGFJJvsMzRvvXbx4c7CspR5yDhG/DD0RY/ebBgelTpX3U9veDgWzcnP4ufJtsPPfeigrWoMi3VS9qijQZMjmyhLo5ODjo9Xr7+/tq4f7+fq/XOzg4iErmo8jsD+2+/n+H9rlFkYujSLNElAQhzi5G+5GT4uNZH6Dg8NHBzetTFJn2mPHfakPjU+6tgiJNLwbJx5CxGXHkvElYMu3HwbwT7fwPbfJziyIXR5HGUaRePtpPKyf3A6GZd6rvlI9aYlSa1XjReytEhiIjH2olWU8l3379MpM2cyaypNGPg1qma6IPnvIZK/KhfZj83JoVCbVSqvszHOlEkfFFo/pOFRl4LypJDBVvXn0pAY6cNxNLGv04qCXRThUW/NA+RJECKP8BMMxoJ5LZ/Jy6YKKtfEbi9Fr/1zg+sXiinX1vlRLtwWAwkeRLL70UPnBUHZj8LhDjSDccHBwY/TiYjyKLfmiTn1sU6YDynwHlKXLcoXFhVn/nfiBG0czJQbrw+v6+qXo0xbO/H45CgxqZ0zW591ZdkYEkL7/+9jRD4kh5zEORxT+0+ucWRTrAxqehBqp/rahmiv11jf4YEhaBxfvrGqgV151uxjhjLQr+AHFZQZGg4brTVdTUXfQQ8iGKXF5QJGi47vRFBUUuKygSNFx3+qKCIpeVpVTkXmdt7VxIZy/7xOH2+tr69nBSZfIi0U66cMlx3emLCopcVpZVkaHahtvra3mSNFSZUrjkuO70RaWuzfdAAK4/XJnYUGRRzaHIANedDgBFsaHIvU44iDR6M/1iMvBcO3fu3Pr2NooEALFYeBa5FmfZBRW51wnrDLfX11AkAEjF1rPI9IRMtiKH2+uxFUm0AUAuVp5FRvM1KLIQrjsdAIpidxSpzG3vddZItDNw3ekAUBQrzyIVx+11gsJOJ2+6JjyN6RoAkAx/XeMA150OAEVBkQ5w3ekAUBQU6QDXnQ4ARUGRDnDd6QBQFBTpANedDgBFQZEOcN3pAFAUFOkA150OAEVBkQ5w3ekAUBQU6YDi3eP7/nUAcAeKdEB9/+IBgF1QpANcdzoAFAVFOsB1pwNAUVCkA1x3OgAUBUU6wHWnA0BRUKQDXHc6ABQFRTrAdacDQFEsLKl77ty5vF20zTvbqO0kCgu3vLC47nQAKIqtjRmKqKy4Im2tQy50YxzXnQ4ARbGyvVdBE6HIgCod1mt5Xqtnq/szrtDYOCxSCLD82FDkXkfZ06vIPtrBtl4Ze9ckvKaPUaODYQvhRmF7nbX17e1oS5yhtrtOZ29SQUjyXr67DjcajVarUautUCRAjJXtvSLnFFRk/g6IqZZjBUcvNUFHQoxtqXpzqNWUQOneOtxoNDYOJ/+1+CHQQZEAMXY3ibWyj7axJFSePoRUBon5l5a1HW3ZzgrdqDnycKPhTWj10m/TBb2W19joBYWtXnw8bFI7QSs8PNxoKFl+Upu9ltfY2GjprT3sBQXRDU29gdQ942dwh5VnkVEuXJMigxpxPcME0TRFhu0scKIdm1FxZK+lPZpMvFXt0ms1Ng4DZU3KlJfKM06l9HCjEZ8a1g7bT15qUjFuI/HENLqTIjeg3zOKBHfYHUUq6trrrJVPtFOjveH2+nqns65m9ImTCinyUcLPjijXVerYMR7OHW40UuMv03AsGpOpvjG+1oQUelA9Goosqa2MluNhZLp902vDPQM4w8qzSMU5e50w+e3kTdfsRfMqxumaOInW8mR1+Kfk2tmJ9qO9zlpwQnRjAh5Jluqp2DRpeUysEr2P3+qZcdhOcUVG9ePC7OehWb6LXF5ckXgRpMBf1zigTEclk82kSBLOCt/2Wl4iSS2iSEWH6eQ3c1bd1FpUls7Zi9yA+WcHmB8o0gEl+iltiUBfidmQ1OSIlrcWTrRbrYbeSjL7No3zjK2Fl4+tOvUGUveMIsEdKNIBrju9KqmJGoClBUU6wHWnV6Pmr2UCiAJFOsB1p5dmkgAjSFghUKQDXHc6ABQFRTrAdacDQFFQpANcdzoAFAVFOqB49/wYAOYIihTBTIr0AWAuoEgpoEgAgaBIKaBIAIGgSCmgSACBoEgpoEgAgaBIKVRQ5LjbDNd3aHbHvu/7/Xb4akZSFcfdZlBSus1pF/TafdutAtgCRUqhpCLH3abqmHG32/dtKrLQoXJMbr3dRpEgGLuKzFhSt1BF58t+O6aUIsfdplEwC6HIqFkUCXKxrkhlI5kZpIciSykyy5CKzvrtMAcPToyz8nY//Tbtwaik3/aa3X5wenhSv+012+1gIJu6VnS02VRvVLsIigTR1KXIGa2HIssq0jywyzZdwkhJQeUrMlSj9oAyPbbUqsSqDi+kXxNFgmjmocjJXjHhfjIThtvrQaG+S2K887WhVrg1jba5TVgoYf+ZKtQ0ilSGds3uOBg1xlJLvJ06ikyO/fTzE9fSjkYq7Le1K6BIEM08E+3oaPrg5JBhm9dpWyRqu4Mt9EC0jCKnPouMj2sDzkl2HVVU3hZUZNSuUmi4ltbapDQ18EWRIJr6pmsU18UbDYZbZps2vF5PeDNdK73RtrLloT5KXTxKKTIYuGXOaEeOilPj6ERNVeHbKYl2cCy2oT5cNaThSmvjbrPZbicfDaBIEE19iXZILMRQcmZFrq2vr+s5daqWWZGL7EWFkor0ta9Fpr4XGR6L3JSYUknOsMTvw8a0UWS73dTmY1JDS+1aKeGavgSJIkE09SvSkF5nJdr688vkuVmJ9pJM9JRX5OKADmHhqF+R4czM2nqnE48D45Rcn66J7GeqFabexumaFU20F4jM+XcAuSzmX9csUX4dsdSKnOTgCBIWj4VU5PJk1wpLrUiARWWBFBl/lXLRvwJpBEUCCGSBFLnkoEgAgaBIKaBIAIGgSCnMpEgAmBsoUgTFFQkAbkGRDnDd6QBQFBTpANedDgBFQZEOcN3pAFAUFOkA150OAEVBkQ5w3ekAUBQU6QDXnQ4ARUGRDnDd6QBQFBTpANedDgBFQZEOcN3pAFAUC3vXnDt3Lne5MnaFTeK60wGgKLY2ic1ZtAxFJnHd6QBQFEsbM+StDY4ik7judAAoiq29axRHhjvMhAPLvc7a+vZeUBjvTaMNQpO702hb1iwdJfqp1/ISNDYOrX8akter9xol6LXk3RMsN9YVqZTvdda3h0EabtjjMK1I48aHS0iF/rLuCGODvZbntXoWr2ILFAnzxqIio92u42mctc5e4sy9Tsqk6k7Z6e2zl5EK/TU3Rco0kdgbg6XF9rNIw0NJ9UzTYBNFzoDmiDj7DoZ8vZbXaLUawfvDjUaQkm/EtcJCz2v11PQ9HjTGhY2Nw0Sbxitu9II2W724+fgutSs+7LWiS/W0u5qUxidrp4U3EFXptTy9AKAerM1oh15Mb1molMQCVVQaHyfRnkr+oK/Xit0UJ8uHGw0vPiE+HhkwdxSptmm+YvqlcvHUFSNH9lqNRmNy7HCjEd5MaMbDjYb5h2psHB5uNDRFo0ioDwvfi0y6TMm1o0S701mflMQjzL1OeE5HfXwZftGS6RojuhISA77EuEwbbjY2DrUxmjKqm6rIYlc0vk5fMdZhY6M3eR0WKep7GI83k802GlgR5ofUv67J+xbRwlOhv3QJxsPE4opMTMPMosj8K2YqMnHFSd3JkPJwo9HqRY0VUqTXaKSaBKgNoYpMp+vLRIX+0vJWLzaLUVjGRDthxFkUOf2K6deGPP1wo6Gm2K1WK/1wQNGlodm4iEQbakaUIofb61HyvrRDyEfWEu1oOqbVMozp4qQ4Y7rGiwZp+nTNw2zx5V8xZ+ypT8HEhtVfayfnNxtqH0VCzYhS5Kow7042ZLsAUAgU6YA597FxThoAioAiHTCXnk3ntwAwMyjSAa47HQCKgiId4LrTAaAoKNIBrjsdAIqCIh0wQ/f85c8IgphboEgRzKTIwfFjgiDmEChSCiiSIAQGipQCiiQIgYEipYAiCUJgoEgpoEiCEBgoUgookiAEhm1FRmvixlsyzLh+WYkqS0FlRb510fO8F97SS55++XZ4KOTijcdbL3gJzr/yvtbajRfDIy9uWficRXdSqUp028m7VW7YcIggKoRVRapL3g63t/csyWM1sKHIp88/5V28oZWEijQaKqP89pXzkRlvX3n5Rk4LBcOGIoM7Mbb21sXghiveJ0Ekw6oil3n3rdqxosiXb1w5/9SVX6gltx/PrMgbL3pxI7lnFg07o8gw3n/5Kf3QjRej4fMvXnmagSRRMP5x79+nFtpNtI3beIUF4fY1yhY0e5219e3taGuaoV7FeNTYzjJgR5G3H2+9ECWbZRV5/NZFLWNV8vQX3hooCW8oprcuek+//Eoq1b195XxQciW6kLHuxReeDjJ6UxXT7Wnpv6ZFRZcEkRPvfHBy8fkfXv35jlp49ec7F5//4TsfnEQl1qdrgkXClb0PczYy3OushaXxca2K6ehybohoS5EZLyJUueSP1IIHl9ln6u1PxHTjRS/OeYPqv3jlac+QGsd1FafnVAlC+TcgCBRJlIuEJdN+HNQ1oz3cXl/Tt8Y2b4dt2jg7/+jybqttT5GRJkqPIsO4feV84Cz9zHgyJ91++Pq2MeXPrZtVJY73X37KMCGDIonSEVnS6MdBfV/6CWduUGRRbCry+P2Xn/Iu3qisyMloTrOtOpkTPRMsrMj8ulMUmXoEGQXPIokKMbGk0Y8D29M126Gwom/uTE20Z1QkiXZSkRkeDB7qlZuuuaKq9vwr7yeHgROR3b5yPmcUacyap9fNTrQNw8O0eZnRJsrEOx+cGP04qGO6JvheZPAwUtHcXjTxsl1+FGluZxmwrEjNMtr3IvV5mMzpGn1SJZxmeeGt6DGl99SLF3NGkcfqdxWjuZf8usYq6o+T+CkM11K+80QQFsLFX9eoX5+U0I4MyiqSIIgaw4Ei098MctuOEFAkQQiMuSky+DJQ/LeJjtsRB4okCIHBMhZSQJEEITBQpBRQJEEIDBQpBRRJEAIDRUphJkUSBDG3QJEimEGRl+4QBDG3QJEimEmRPgDMBRQpBRQJIBAUKQUUCSAQFCmFaorstz3Pa/f1kgub4/BQSLuvv/c8zwvOSzQWnl6d6E4qV+m3zbcU3vCslwGYCoqUQmVFXrhwQfWHqkijOjLKx5txM+PNzX5OCwWxosjx5gXPa7fbBkX2w8KK9wlgwLt05/j4+P79+6enp2dnZ59//jmKdEN1RW72Ny/EiiirSEOxBEVG5SlFKmVj9RcAYAPv0p3BYDAajY6Ojk5PT1GkMywocqyqpawi/X5by1iVvLzd9w1ZeL/tXdjcTKW6480LQclmdCFj3Xb7QvDeVCV1b0lFjhP/Llh5NgAQ4l26s7u7u7+/PxqN7t27d3Z2hiLdYEWRGS+8hJn0KmkCV4VnG8/U248y3dSr8eaF1ENCra7i9JwqUUUUCXPFu3Tn2rVru7u7g8Hg+Pi4oiLjJXWVHb6gEJYUGWmi9CgyZPL0L/0sMlZuuv3wddJbqgYz6mZVSd4zioS54l2689prr7355pvvvvvu0dHRZ599VlGRylavy7VYWd1YU2Qw4VJZkfHMjS6yeKg3oyLz65ZVJM8ioVa8S3deffXVN954w7Yil2vvrTlQSpEZHgwS5XLTNZuqai9sjpPDwMnL6KBRkcaseXrdmRLttHmZ0Qb71KZI1ZDD7fW1NWUR3HhZ3GCcGZ5g2oD7UWI3m05nfWo7mScIxqYiNcto34PUE+bM6ZrEo8ugqN1XplTa7ZxRpNKMMveSX9dYJX1vKUUqFUmywTrWFZnY3utRwpvr28NHex09BVdy8mjnxOztD8PS+NTCFxJNtUQbAGqhnlGkuvGWMkIM1JnY3VXfpSvUWv7miKa9vaZeSDYoEkAgdSXaw+31+JVpLDfcXg/yX5uKzL2QbFAkgEDmMF2TuVNhqNFEoh0/Roz34jZk38ZEO/9CokGRAAKpT5GKw5QUeK2z92ivk9zCMJ5mUVQWndbpGEaRweUyp33MFxIMigQQiF1FQnlQJIBAUKQUqilytRdDyz8EUAEUKYXKilzZxdByDgFUBUVKoboiV3QxtOmHAMqDIqVgQZEruRhagUMA5UGRUrCiyBVcDK3AIYDyoEgpWFLkyi2GVuAQQHlQpBSsKXLVFkObfgigPChSCqUUyWJoxkMA1kCRUrCpyFVbDC15CMAaKFIK1RJtAKgFFCkFFAkgEBQpBRQJIBAUKQUUCSAQFCkFFAkgEBQpBRQJIBAUKYVqilzpxdCi+2WLWLAOipRCZUWu6mJowU1Wv08AAyhSCtUVudqLofmJv2EEsAKKlIIFRa70YmhTjwKUAUVKwYoiV3gxNNJsqAUUKQVLilzNxdDihTEA7IIipWBNkSu3GBqPIKFGUKQUSimSxdB4Agn1giKlYFORq7QYWtgoX42EWkCRUqiWaANALaBIKaBIAIGgSCmgSACBoEgpoEgAgaBIKaBIAIGgSCmgSACBoEgpVFPkKi+GFn/th+9HgnVQpBQqK3JVF0Pz+/1+dAqSBMugSClUV+TKL4bG39mAfVCkFCwocsUXQ8OQUAMoUgpWFLmai6ElbhfAIihSCpYUuZqLoUWN8yfaYBkUKQVrily5xdAKHwaYHRQphVKKZDG0eEK78rQSgAEUKQWbilylxdDU1dAYQoJ1UKQUqiXaAFALKFIKKBJAIChSCigSQCAoUgooEkAgKFIKKBJAIChSCigSQCAoUgrVFLnKi6EFxN+2BLAHipRCZUWu7GJoURX+/hDsgyKlUF2Rq7wY2njzQntT/fEB7IAipWBBkSu7GNp480K7r/+VN4AdUKQUrChyJRdDC9WIIqEGUKQULCly5RZDi+uhSKgBFCkFa4pcrcXQUvPzWBKsgiKlUEqRLIamHGQUCTWAIqVgU5ErtRia+jOjSLANipRCtUQbAGrBu3TnJz/5yU9/+tNf/epX77333m9/+9sPP/wQRToARQIIhFGkFFAkgEBQpBRQJIBAUKQUUCSAQFCkFFAkgEBQpBSqKXKlF0NjD0SoDxQphcqKXN3F0DLX/wGoDIqUQnVFruxiaP02XxmHukCRUrCgyBVdDC3OszElWAdFSsGKIldyMbQiPxFASVCkFCwpcuUWQ5vlRwKYGRQpBWuKXK3F0GY5DDA7KFIKpRTJYmjKQbZAhBpAkVKwqcjVWgzN8tc4AVRQpBSqJdoAUAsoUgooEkAgKFIKKBJAIChSCigSQCAoUgooEkAgKFIKKBJAIChSCtUUudKLofnq94X4XiRYBUVKobIiV3oxNNQINYEipVBdkau6GBproUGNoEgpWFDkai6G1m977TZ5NtQEipSCFUWu4mJoShtk3GAdFCkFS4pcvcXQEn+3zd9pg1VQpBSsKXLVFkNDkVAnKFIKpRTJYmjJe8KQYBcUKQWbilytxdCU3WsQJNgGRUqhWqINALWAIqWAIgEEgiKlgCIBBIIipTCTIgmCmFugSBGgSIKQGShSBCiSIGQGihRBNUXe7fu+P7yrl3zV3QoPhfR37rSHyact41sfa63tfBEe+aJt4RMW3UmlKtFtJ+9WuWHDIYKoHChSBJUV+dX4xO/vaCWhIo2GyijfejCOzLj1oLuT00LBsKHI4E6Mrd3tBzdc8T4JwhwoUgTVFdndeTA+edBUS0oocucLP24k98yiYWcUGcbH3RP90M4X0fC5eesrBpKE9UCRIrCgyK077WGUbJZV5KW7fS1jVfL04V1PSXhDMd3t+191b6VS3a0HwV++3HoQXchYtz/8KsjoTVVMt6el/5oWFV0SU+KJJ72/vun+NhYhUKQIrCgy40WEKpf8kVrw4DL7TL39iZh2vvDjnDeo3rz1lW9IjeO6itNzqgSh/BsQBIosGU88+Qd/8gMsWSRQpAgsKTLSROlRZBhbD8aBs/Qz48mcdPvh6y1jyp9bN6tKHB93TwwTMiiyZDzxpO/7WLJIoEgRWFPkpY+7J35/p7IiJ6M5zbbqZE70TLCwIvPrTlFk6hFkFDyLLBdPPDn5xwpLTg0UKYJSiszwYPBQr9x0zQNVteNbHyeHgRORbT0Y54wijVnz9LrZibZheJg2LzPas0SoSCw5NVCkCGwqUrOM9r1IfR4mc7pGn1QJp1mGd6PHlP7JF/2cUeQl9buK0dxLfl1jFfXHSfwUhmsp33kipoWiSCyZHyhSBNUSbYKYMXRFYsmcQJEiQJHEXCOlSCyZFShSBCiSmGuYFPm/X/0flkwHihTBTIpMf7gBZuLr3/imsfzhw98/88xz7x78Zs73IxYUKQUUCfMkS5G+79+/f4IlI1CkFFAkzJMcRfq+/8knR88889zcbkYyKFIKpRRpcd/ofttrdsfqixJ1y17Z86o0UA/VfijxqIr88svHkxfPPPOcGo5uTRYoUgr1KzL///lZFameVsUm8fbZwlgVRX755eOvfe3rv/znf/V9/wc/+Itf/vJfnN6XOFCkFFZYkTJNJPbG7DBR5MSP7x785jvfedr3/U8+OZq8gAgUKYVqiuy3vWa32/Y8NWcdd5uTAq/d7wfHvGDMFr8PHJuryLilZG2v3Q+q9INz4srq9cNLtNtNZdQYt9PsjhMnmO8wvEq7HzefdUXlHxDlhxp3m5PS5A+VuEP1FzI5I/nzLDRf/8Y3Iz/6vv/ss8//+tcHkxcMJFVQpBQqK1IRUeQx7X9l47Aobcb0aUouPO42Daf125Go4nOVE/rt0IDpO0i2k31C4irhmTlXVH49zWZzcmzcbUY3Y/qhlCa8Znc87jYVRS+BGkOeeea5yI++77978Jtvffv7vu+PRh9897tNp7cmCxQpBQujyETaO+42NePo7ksM4HIUqVhCuWRWoq1dPSYabGY6uvgdFr5irMNmtz95HRYV+6GaTeWGkr/PZePZZ58fjT7wff973/sz1/ciCBQpBfuK9H0/9Eby//9YEKEyalFkYtA1iyLz7rD4FSd1J0PKcbfZ7keNFfqhvGYz2aTy+1w27n5671vf/v6PfvS3h//5X67vRRAoUgo1KdLXUks9ifSNifPURDv/ilperDc0iyLz7rD4Ff1xt6mm2O12W7lAoR8qfdOp3+esM12wSKBIKdhXpGm+I3wXJqXNdnvqKNJXc9j4kNJazkiwdKKdc4fZr5NXVA2rvzb/UMZmwwQ7+ftEkSsBipRCKUUCQL2gSCmgSACBoEgpoEgAgaBIKcykSIIg5hYoUgTFFfnhhx+qb4+PjweDwe7u7rVr11577bVXAcAq165d293dHQwGx8fHZ2dnKNINpRV5//790Wi0v7+/u7v75ptvvgEAVtnd3d3f3x+NRvfu3UORziityNPT06Ojo9FoNBgM3gUA2wwGg9FodHR0dHp6+vnnn6NIN5RW5NnZ2enp6b17946Pj48AwDbHx8f3798/PT09OzubKPL/AS+6mNJK91B7AAAAAElFTkSuQmCC" /><br />
<a href="https://www.blogger.com/blogger.g?blogID=2359578464804578723" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><br /></a><a href="https://www.blogger.com/blogger.g?blogID=2359578464804578723" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a>
<br />
<br />
<a href="https://www.blogger.com/blogger.g?blogID=2359578464804578723" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=2359578464804578723" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: blue;"><</span><span style="color: #a31515;">Project</span><span style="color: blue;"> </span><span style="color: red;">Sdk</span><span style="color: blue;">=</span>"<span style="color: blue;">Microsoft.NET.Sdk</span>"<span style="color: blue;">></span>
<span style="color: blue;"> <</span><span style="color: #a31515;">PropertyGroup</span><span style="color: blue;">></span>
<span style="color: blue;"> <</span><span style="color: #a31515;">TargetFramework</span><span style="color: blue;">></span>netstandard2.0<span style="color: blue;"></</span><span style="color: #a31515;">TargetFramework</span><span style="color: blue;">></span>
<span style="color: blue;"> </</span><span style="color: #a31515;">PropertyGroup</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Project</span><span style="color: blue;">></span>
</pre>
<br />Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-2359578464804578723.post-27143764027525715372016-01-09T00:55:00.000+01:002017-05-24T00:11:18.743+02:00The differences between TextBlock and Label in WPFYou can use two elements to show text in GUI, so-called "Label". These are<br />
<div>
<ul>
<li>Label: <span style="color: blue; font-family: "consolas"; font-size: 13px;"><</span><span style="color: #a31515; font-family: "consolas"; font-size: 13px;">Label</span><span style="color: blue; font-family: "consolas"; font-size: 13px;">></span><span style="background-color: white; font-family: "consolas"; font-size: 13px;">Text</span><span style="color: blue; font-family: "consolas"; font-size: 13px;"></</span><span style="color: #a31515; font-family: "consolas"; font-size: 13px;">Label</span><span style="color: blue; font-family: "consolas"; font-size: 13px;">></span></li>
<li>TextBlock: <span style="color: blue; font-family: "consolas"; font-size: 13px;"><</span><span style="color: #a31515; font-family: "consolas"; font-size: 13px;">TextBlock</span><span style="color: blue; font-family: "consolas"; font-size: 13px;">></span><span style="background-color: white; font-family: "consolas"; font-size: 13px;">Text</span><span style="color: blue; font-family: "consolas"; font-size: 13px;"></</span><span style="color: #a31515; font-family: "consolas"; font-size: 13px;">TextBlock</span><span style="color: blue; font-family: "consolas"; font-size: 13px;">></span></li>
</ul>
<div>
Both produce nearly the same result. But there are differences. TextBlock inherits from FrameworkElement whereas Label inherits from ContentControl --> Control --> FrameworkElement.</div>
</div>
<div>
<br /></div>
<div>
This difference lead to all differences that these elements have.</div>
<div>
<br /></div>
<div>
One consequence can directly shown if we rewrite the code from above.</div>
<div>
<ul>
<li>Label: <span style="color: blue; font-family: "consolas"; font-size: 13px;"><</span><span style="color: #a31515; font-family: "consolas"; font-size: 13px;">Label</span><span style="color: red; font-family: "consolas"; font-size: 13px;"> Content</span><span style="color: blue; font-family: "consolas"; font-size: 13px;">=</span><span style="color: blue; font-family: "consolas"; font-size: 13px;">"Text"</span><span style="color: blue; font-family: "consolas"; font-size: 13px;"> /></span></li>
<li>TextBlock: <span style="color: blue; font-family: "consolas"; font-size: 13px;"><</span><span style="color: #a31515; font-family: "consolas"; font-size: 13px;">TextBlock</span><span style="color: red; font-family: "consolas"; font-size: 13px;"> Text</span><span style="color: blue; font-family: "consolas"; font-size: 13px;">=</span><span style="color: blue; font-family: "consolas"; font-size: 13px;">"Text"</span><span style="color: blue; font-family: "consolas"; font-size: 13px;"> /></span></li>
</ul>
</div>
<div>
TextBlock has no Content, just Text. So TextBlock is restricted to strings, while Label can also have other types as content like images.</div>
<div>
<pre style="background: white; font-family: Consolas; font-size: 13px;"><span style="color: blue;"><</span><span style="color: #a31515;">Label</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Image</span><span style="color: red;"> Source</span><span style="color: blue;">=</span><span style="color: blue;">"text.png"</span><span style="color: blue;"> /></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Label</span><span style="color: blue;">></span></pre>
</div>
<div>
One other frequently mentioned consequence from the different roots of Label and TextBlock is that Label supports Access Keys (Mnemonics), while TextBlock don't.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXwX-6y1evT0iiyfbgEEf38-NZankiQgKiRUvoSIkS56ddCTO-dirQPz74J_ODxXHJ-qR8HYx12jL_YHanbPvqS2G5KNRJdpZTs3eBrogEuQT-kSbg8KMWKGzyNyngE1yUzrgDBdovuqY/s1600/LabelAccessKey.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXwX-6y1evT0iiyfbgEEf38-NZankiQgKiRUvoSIkS56ddCTO-dirQPz74J_ODxXHJ-qR8HYx12jL_YHanbPvqS2G5KNRJdpZTs3eBrogEuQT-kSbg8KMWKGzyNyngE1yUzrgDBdovuqY/s1600/LabelAccessKey.PNG" /></a></div>
<div>
<pre style="background: white; font-family: Consolas; font-size: 13px;"><span style="color: blue;"><</span><span style="color: #a31515;">Label</span><span style="color: red;"> Content</span><span style="color: blue;">=</span><span style="color: blue;">"_Text"</span>
<span style="color: red;"> Target</span><span style="color: blue;">="{</span><span style="color: #a31515;">Binding</span><span style="color: red;"> ElementName</span><span style="color: blue;">=</span><span style="color: blue;">InputField</span><span style="color: blue;">}</span><span style="color: blue;">"</span><span style="color: blue;"> /></span>
<span style="color: blue;"><</span><span style="color: #a31515;">TextBox</span><span style="color: red;"> x</span><span style="color: blue;">:</span><span style="color: red;">Name</span><span style="color: blue;">=</span><span style="color: blue;">"InputField"</span><span style="color: blue;"> /></span></pre>
</div>
<div>
<br /></div>
<div>
Furthermore a Label is grayed out, if its IsEnabled property is false, whereas TextBlock isn't. You can also use the Template property for a custom control template or the ContentTemplate property to apply a DataTemplate to its content.</div>
<div>
<br /></div>
<div>
Summarized you can say the difference is that with a Label you can do more than with a TextBlock. You can do whatever a ContentControl can do, while a TextBlock can only do what a FrameworkElement can do. But the huge advantage of the TextBlock is that it is much more lightweight.</div>
<div>
<br /></div>
<div>
So use TextBlock, whenever you just need text. If text is insufficient, use Label.</div>
<div>
<br /></div>
<div>
<br /></div>
Unknownnoreply@blogger.com21tag:blogger.com,1999:blog-2359578464804578723.post-11901037131414081782015-12-17T22:15:00.000+01:002015-12-17T22:15:26.650+01:00Setting the Background of a WPF TextBox depending on Validation in a Template/Style using TemplateBinding 2<br />
I showed how to change the Background of a TextBox, if some own ValidationRule failed in the post <a href="http://chrigas.blogspot.com/2015/06/setting-background-of-wpf-textbox.html">Setting the Background of a WPF TextBox depending on Validation in a Template/Style using TemplateBinding</a>. But the solution has a minor issue.<br />
<br />
If the VisualState is ReadOnly and the Trigger Validation.HasError is called the Background changes as expected. But if the Trigger is not any longer true, the Background will not set back to the ReadOnly style, again.<br />
<br />
To fix this issue the VisualState of ReadOnly is removed. <br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"> <span style="color: blue;"><</span><span style="color: #a31515;">VisualState</span><span style="color: red;"> x</span><span style="color: blue;">:</span><span style="color: red;">Name</span><span style="color: blue;">=</span><span style="color: blue;">"ReadOnly"</span><span style="color: blue;"> /></span></pre>
<br />
And a Trigger for the IsReadOnly property is defined. This Trigger must be placed above the Validation.HasError Trigger. Otherwise the TextBox would have always the ReadOnly color and never the HasError color.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"> <span style="color: blue;"><</span><span style="color: #a31515;">Style.Triggers</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Trigger</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"IsReadOnly"</span>
<span style="color: red;"> Value</span><span style="color: blue;">=</span><span style="color: blue;">"True"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"Background"</span>
<span style="color: red;"> Value</span><span style="color: blue;">="</span><span style="color: #a31515;"><span style="color: blue;">LightBlue</span></span><span style="color: blue;"></span><span style="color: blue;">"</span><span style="color: blue;"> /></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Trigger</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Trigger</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"Validation.HasError"</span>
<span style="color: red;"> Value</span><span style="color: blue;">=</span><span style="color: blue;">"True"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"ToolTip"</span>
<span style="color: red;"> Value</span><span style="color: blue;">="{</span><span style="color: #a31515;">Binding</span><span style="color: red;"> RelativeSource</span><span style="color: blue;">={</span><span style="color: #a31515;">x</span><span style="color: blue;">:</span><span style="color: #a31515;">Static</span><span style="color: red;"> RelativeSource</span><span style="color: blue;">.</span><span style="color: blue;">Self</span><span style="color: blue;">},</span>
<span style="color: red;"> Path</span><span style="color: blue;">=(</span><span style="color: blue;">Validation</span><span style="color: blue;">.</span><span style="color: blue;">Errors</span><span style="color: blue;">).</span><span style="color: blue;">CurrentItem</span><span style="color: blue;">.</span><span style="color: blue;">ErrorContent</span><span style="color: blue;">}</span><span style="color: blue;">"</span><span style="color: blue;"> /></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"Background"</span>
<span style="color: red;"> Value</span><span style="color: blue;">=</span><span style="color: blue;">"Orange"</span><span style="color: blue;"> /></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"BorderThickness"</span>
<span style="color: red;"> Value</span><span style="color: blue;">=</span><span style="color: blue;">"2"</span><span style="color: blue;"> /></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"BorderBrush"</span>
<span style="color: red;"> Value</span><span style="color: blue;">=</span><span style="color: blue;">"Red"</span><span style="color: blue;"> /></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Trigger</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Style.Triggers</span><span style="color: blue;">></span></pre>
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: blue;"> </span></pre>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2359578464804578723.post-30389117028178454362015-11-03T18:43:00.000+01:002015-11-03T18:43:29.711+01:00Reading and Writing Values from INI Files with C#INI files is often used by legacy software. But sometimes also by not so legacy software. So sometimes it is needed to access INI files from .NET/C#, but there is no class or method in .NET/C# that can read or write INI files. But there are some functions in kernel32.dll that can be used by Platform Invoke (PInvoke). These functions (GetPrivateProfileString, GetPrivateProfileSection and WritePrivateProfileString) are provided for compatibility, nevertheless they can be used.<br />
<br />
You need to add a using that allows using PInvoke.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: blue;">using</span> System.Runtime.InteropServices;
</pre>
<br />
Then you can declare the methods that you want to access.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;">[<span style="color: #2b91af;">DllImport</span>(<span style="color: #a31515;">"kernel32"</span>, CharSet = <span style="color: #2b91af;">CharSet</span>.Unicode)]
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">extern</span> <span style="color: blue;">int</span> GetPrivateProfileString(<span style="color: blue;">string</span> section, <span style="color: blue;">string</span> key,
<span style="color: blue;">string</span> defaultValue, <span style="color: #2b91af;">StringBuilder</span> value, <span style="color: blue;">int</span> size, <span style="color: blue;">string</span> filePath);
[<span style="color: #2b91af;">DllImport</span>(<span style="color: #a31515;">"kernel32.dll"</span>, CharSet = <span style="color: #2b91af;">CharSet</span>.Unicode)]
<span style="color: blue;">static</span> <span style="color: blue;">extern</span> <span style="color: blue;">int</span> GetPrivateProfileString(<span style="color: blue;">string</span> section, <span style="color: blue;">string</span> key, <span style="color: blue;">string</span> defaultValue,
[<span style="color: #2b91af;">In</span>, <span style="color: #2b91af;">Out</span>] <span style="color: blue;">char</span>[] value, <span style="color: blue;">int</span> size, <span style="color: blue;">string</span> filePath);
[<span style="color: #2b91af;">DllImport</span>(<span style="color: #a31515;">"kernel32.dll"</span>, CharSet = <span style="color: #2b91af;">CharSet</span>.Auto)]
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">extern</span> <span style="color: blue;">int</span> GetPrivateProfileSection(<span style="color: blue;">string</span> section, <span style="color: #2b91af;">IntPtr</span> keyValue,
<span style="color: blue;">int</span> size, <span style="color: blue;">string</span> filePath);
[<span style="color: #2b91af;">DllImport</span>(<span style="color: #a31515;">"kernel32"</span>, CharSet = <span style="color: #2b91af;">CharSet</span>.Unicode, SetLastError = <span style="color: blue;">true</span>)]
[<span style="color: blue;">return</span>: <span style="color: #2b91af;">MarshalAs</span>(<span style="color: #2b91af;">UnmanagedType</span>.Bool)]
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">extern</span> <span style="color: blue;">bool</span> WritePrivateProfileString(<span style="color: blue;">string</span> section, <span style="color: blue;">string</span> key,
<span style="color: blue;">string</span> value, <span style="color: blue;">string</span> filePath);</pre>
<br />
Now we can use these methods to access an INI file. Therefor we have defined a size into that the results should fit. You can extend or reduce the size as needed.<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: blue;">public</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> capacity = 512;
</pre>
You can read values with the following code.<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: blue;">public</span> <span style="color: blue;">static</span> <span style="color: blue;">string</span> ReadValue(<span style="color: blue;">string</span> section, <span style="color: blue;">string</span> key, <span style="color: blue;">string</span> filePath, <span style="color: blue;">string</span> defaultValue = <span style="color: #a31515;">""</span>)
{
<span style="color: blue;">var</span> value = <span style="color: blue;">new</span> <span style="color: #2b91af;">StringBuilder</span>(capacity);
GetPrivateProfileString(section, key, defaultValue, value, value.Capacity, filePath);
<span style="color: blue;">return</span> value.ToString();
}
<span style="color: blue;">public</span> <span style="color: blue;">static</span> <span style="color: blue;">string</span>[] ReadSections(<span style="color: blue;">string</span> filePath)
{
<span style="color: green;">// first line will not recognize if ini file is saved in UTF-8 with BOM</span>
<span style="color: blue;">while</span> (<span style="color: blue;">true</span>)
{
<span style="color: blue;">char</span>[] chars = <span style="color: blue;">new</span> <span style="color: blue;">char</span>[capacity];
<span style="color: blue;">int</span> size = GetPrivateProfileString(<span style="color: blue;">null</span>, <span style="color: blue;">null</span>, <span style="color: #a31515;">""</span>, chars, capacity, filePath);
<span style="color: blue;">if</span> (size == 0)
{
<span style="color: blue;">return</span> <span style="color: blue;">null</span>;
}
<span style="color: blue;">if</span> (size < capacity - 2)
{
<span style="color: blue;">string</span> result = <span style="color: blue;">new</span> <span style="color: #2b91af;">String</span>(chars, 0, size);
<span style="color: blue;">string</span>[] sections = result.Split(<span style="color: blue;">new</span> <span style="color: blue;">char</span>[] { <span style="color: #a31515;">'\0'</span> }, <span style="color: #2b91af;">StringSplitOptions</span>.RemoveEmptyEntries);
<span style="color: blue;">return</span> sections;
}
capacity = capacity * 2;
}
}
<span style="color: blue;">public</span> <span style="color: blue;">static</span> <span style="color: blue;">string</span>[] ReadKeys(<span style="color: blue;">string</span> section, <span style="color: blue;">string</span> filePath)
{
<span style="color: green;">// first line will not recognize if ini file is saved in UTF-8 with BOM</span>
<span style="color: blue;">while</span> (<span style="color: blue;">true</span>)
{
<span style="color: blue;">char</span>[] chars = <span style="color: blue;">new</span> <span style="color: blue;">char</span>[capacity];
<span style="color: blue;">int</span> size = GetPrivateProfileString(section, <span style="color: blue;">null</span>, <span style="color: #a31515;">""</span>, chars, capacity, filePath);
<span style="color: blue;">if</span> (size == 0)
{
<span style="color: blue;">return</span> <span style="color: blue;">null</span>;
}
<span style="color: blue;">if</span> (size < capacity - 2)
{
<span style="color: blue;">string</span> result = <span style="color: blue;">new</span> <span style="color: #2b91af;">String</span>(chars, 0, size);
<span style="color: blue;">string</span>[] keys = result.Split(<span style="color: blue;">new</span> <span style="color: blue;">char</span>[] { <span style="color: #a31515;">'\0'</span> }, <span style="color: #2b91af;">StringSplitOptions</span>.RemoveEmptyEntries);
<span style="color: blue;">return</span> keys;
}
capacity = capacity * 2;
}
}
<span style="color: blue;">public</span> <span style="color: blue;">static</span> <span style="color: blue;">string</span>[] ReadKeyValuePairs(<span style="color: blue;">string</span> section, <span style="color: blue;">string</span> filePath)
{
<span style="color: blue;">while</span> (<span style="color: blue;">true</span>)
{
<span style="color: #2b91af;">IntPtr</span> returnedString = <span style="color: #2b91af;">Marshal</span>.AllocCoTaskMem(capacity * <span style="color: blue;">sizeof</span>(<span style="color: blue;">char</span>));
<span style="color: blue;">int</span> size = GetPrivateProfileSection(section, returnedString, capacity, filePath);
<span style="color: blue;">if</span> (size == 0)
{
<span style="color: #2b91af;">Marshal</span>.FreeCoTaskMem(returnedString);
<span style="color: blue;">return</span> <span style="color: blue;">null</span>;
}
<span style="color: blue;">if</span> (size < capacity - 2)
{
<span style="color: blue;">string</span> result = <span style="color: #2b91af;">Marshal</span>.PtrToStringAuto(returnedString, size - 1);
<span style="color: #2b91af;">Marshal</span>.FreeCoTaskMem(returnedString);
<span style="color: blue;">string</span>[] keyValuePairs = result.Split(<span style="color: #a31515;">'\0'</span>);
<span style="color: blue;">return</span> keyValuePairs;
}
<span style="color: #2b91af;">Marshal</span>.FreeCoTaskMem(returnedString);
capacity = capacity * 2;
}
}</pre>
<br />
You can write values with the following code.<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: blue;">public</span> <span style="color: blue;">static</span> <span style="color: blue;">bool</span> WriteValue(<span style="color: blue;">string</span> section, <span style="color: blue;">string</span> key, <span style="color: blue;">string</span> value, <span style="color: blue;">string</span> filePath)
{
<span style="color: blue;">bool</span> result = WritePrivateProfileString(section, key, value, filePath);
<span style="color: blue;">return</span> result;
}</pre>
Sections and keys will be created, if they not exist.<br />
<br />
Or you can delete values with the following code.<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: blue;">public</span> <span style="color: blue;">static</span> <span style="color: blue;">bool</span> DeleteSection(<span style="color: blue;">string</span> section, <span style="color: blue;">string</span> filepath)
{
<span style="color: blue;">bool</span> result = WritePrivateProfileString(section, <span style="color: blue;">null</span>, <span style="color: blue;">null</span>, filepath);
<span style="color: blue;">return</span> result;
}
<span style="color: blue;">public</span> <span style="color: blue;">static</span> <span style="color: blue;">bool</span> DeleteKey(<span style="color: blue;">string</span> section, <span style="color: blue;">string</span> key, <span style="color: blue;">string</span> filepath)
{
<span style="color: blue;">bool</span> result = WritePrivateProfileString(section, key, <span style="color: blue;">null</span>, filepath);
<span style="color: blue;">return</span> result;
}</pre>
<br />
<br />Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-2359578464804578723.post-12430132473829872882015-10-01T22:05:00.000+02:002015-10-01T22:05:58.284+02:00Audino - Arduino MP3-PlayerThere are several obstacles when creating a MP3 player. Especially if it is a special MP3 player like the <a href="https://en.hoerbert.com/" target="_blank">Hörbert</a>. There are some other pages that address recreating the Hörbert (<a href="https://groups.google.com/d/msg/qlocktwo/C3vUD9SUbPE/_Vm-T705y4kJ" target="_blank">here</a>, and <a href="https://groups.google.com/d/msg/qlocktwo/C3vUD9SUbPE/jl5W-2LnbL0J" target="_blank">here</a>), but there are still missing some information. So let's get started with the first challenge: the components.<br />
<br />
<h3>
1. Components</h3>
<br />
We need<br />
<br />
An Arduino Uno R3 board<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJT1oDkywtP7uASFoTbZ2imK29KdbjrgBUSbx8CBSq5mYNGtDebYqwGukrO9oDDl1xzdioGhT-amVcNoGmRum3BSRKL9nLOIDET5dHTkkX2UqnTAIELl2cFtjaoKHpZHGMmUe40OGoZr4/s1600/DSC_0049.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="132" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJT1oDkywtP7uASFoTbZ2imK29KdbjrgBUSbx8CBSq5mYNGtDebYqwGukrO9oDDl1xzdioGhT-amVcNoGmRum3BSRKL9nLOIDET5dHTkkX2UqnTAIELl2cFtjaoKHpZHGMmUe40OGoZr4/s200/DSC_0049.JPG" width="200" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQOzD4jXhE5RjCx8liSbNDzHFu0sH6dpuUkSVHa35vzobqMwUIXtWWN9KJn0lkLcYRXIEpVz3EOzK7hTsssK72yAPEtfY9R5G_9dXzHWR2N1lZuJqjRRcmnnCiwn2pP2Ks6zRo_h1x44I/s1600/DSC_0051.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="132" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQOzD4jXhE5RjCx8liSbNDzHFu0sH6dpuUkSVHa35vzobqMwUIXtWWN9KJn0lkLcYRXIEpVz3EOzK7hTsssK72yAPEtfY9R5G_9dXzHWR2N1lZuJqjRRcmnnCiwn2pP2Ks6zRo_h1x44I/s200/DSC_0051.JPG" width="200" /></a><br />
<br />
A MP3 shield<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigg3abbjk25SA40X5lmm_O5v5l1_ReLzykKJD1mCLZ2u8mYvfoeOX3yNM5eC6uUGDja1V_BWnIPkA1vR5ptCVWfLKQegFhXPhz5j_XpycYgSGFwaI0V9wPbLQI0M3n7zNt8xxnx6lr5Q0/s1600/DSC_0062.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="132" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigg3abbjk25SA40X5lmm_O5v5l1_ReLzykKJD1mCLZ2u8mYvfoeOX3yNM5eC6uUGDja1V_BWnIPkA1vR5ptCVWfLKQegFhXPhz5j_XpycYgSGFwaI0V9wPbLQI0M3n7zNt8xxnx6lr5Q0/s200/DSC_0062.JPG" width="200" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
A rotary potentiometer<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTNo0tjlPEGtfOusvcfkM1s_8Gq3iralCYAvkmNxM9nCClYGFZRivYztCFRjFTI3kba59UdqrRD2gQqvu6ij2sKQjSkUAxwiLe8uDVYt4SaAU_eK2ZmKskQVSDGl8CNtH_MEWe2Pm-ISo/s1600/DSC_1266.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="83" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTNo0tjlPEGtfOusvcfkM1s_8Gq3iralCYAvkmNxM9nCClYGFZRivYztCFRjFTI3kba59UdqrRD2gQqvu6ij2sKQjSkUAxwiLe8uDVYt4SaAU_eK2ZmKskQVSDGl8CNtH_MEWe2Pm-ISo/s200/DSC_1266.JPG" width="200" /></a><br />
<br />
<br />
<br />
<br />
<br />
<br />
A turning knob<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnPX__0421muHm7V_qvOxb99gXByYb06fvScKlSF-N0Wskx7_AC_Bh-KQfHRTC8M8_ml7DZ-B6qq76X_qDpsQIHJdepzPIijFLSL-v4ts3PyNi6cal2uq_0Dtylsa5Y-ZHyvrIxcu2RSc/s1600/DSC_0124.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnPX__0421muHm7V_qvOxb99gXByYb06fvScKlSF-N0Wskx7_AC_Bh-KQfHRTC8M8_ml7DZ-B6qq76X_qDpsQIHJdepzPIijFLSL-v4ts3PyNi6cal2uq_0Dtylsa5Y-ZHyvrIxcu2RSc/s200/DSC_0124.JPG" width="195" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
A toggle switch<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIMQ6sS-xznC7nepbwTJKUlrmVpoQapEbJ8Roo8XP94_s2ZwL9fgmU2truf5aYbgQQphv-GHpuQ2FZ9nNo6DfyPueHh7M7hvjPDy51h2zy-Tx61rMvBCirowurH9Wn2LduZzWWKNRl20o/s1600/DSC_1265.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="133" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIMQ6sS-xznC7nepbwTJKUlrmVpoQapEbJ8Roo8XP94_s2ZwL9fgmU2truf5aYbgQQphv-GHpuQ2FZ9nNo6DfyPueHh7M7hvjPDy51h2zy-Tx61rMvBCirowurH9Wn2LduZzWWKNRl20o/s200/DSC_1265.JPG" width="200" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
A battery holder</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrsyVDsDDl4-VfUxIg1B5tyxXeeq6_AtGM3ZrPiyamMPtjOV49zyatLzzKNR2tN9ny26nZUt4NQo3vkX5LwJowwaf5v5FQyPdz6mMl0VOFCMhgmH_kGpbCZ7_YqtQb6Pgj8zhdNKu_7hk/s1600/DSC_0060.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="132" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrsyVDsDDl4-VfUxIg1B5tyxXeeq6_AtGM3ZrPiyamMPtjOV49zyatLzzKNR2tN9ny26nZUt4NQo3vkX5LwJowwaf5v5FQyPdz6mMl0VOFCMhgmH_kGpbCZ7_YqtQb6Pgj8zhdNKu_7hk/s200/DSC_0060.JPG" width="200" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: left;">
A speaker</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3y_yNrIkdGnsMILkI8I2cDmGUi9Spk2d0N0oSh5YB72VaayFOFJ1Y3LB18DI0S03fhjD4FY6jOSZWc_J0J8uSgLDiaQLxAp1_Ys2RA4dWE1n1fp23KckIQpwIiKzjUvwJ8Qe7yDMvCFA/s1600/DSC_0058.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="132" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3y_yNrIkdGnsMILkI8I2cDmGUi9Spk2d0N0oSh5YB72VaayFOFJ1Y3LB18DI0S03fhjD4FY6jOSZWc_J0J8uSgLDiaQLxAp1_Ys2RA4dWE1n1fp23KckIQpwIiKzjUvwJ8Qe7yDMvCFA/s200/DSC_0058.JPG" width="200" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: left;">
A protective grille</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhImjcVW5A7kSVQ9c8_UEmDdHt6vfYdv6ZQ_crQSVr2vYUjhRIbtkiz6wtt4wWf8Hl9R3IVpfP_hrVKLCUEwWu_e1OI2nWLME3c-592oP6TyRCn-a0noO4IhLbmhtnMVYE458EJSJVW084/s1600/DSC_0120.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="132" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhImjcVW5A7kSVQ9c8_UEmDdHt6vfYdv6ZQ_crQSVr2vYUjhRIbtkiz6wtt4wWf8Hl9R3IVpfP_hrVKLCUEwWu_e1OI2nWLME3c-592oP6TyRCn-a0noO4IhLbmhtnMVYE458EJSJVW084/s200/DSC_0120.JPG" width="200" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Some buttons<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMIRHk8U2Nw3gPaQzfKup6cGIm-KgHg8lud-qRBWlOXH6Yevr3BKrATzFPal4uR_eZH_151A4d0SctPMuXG_qs_GmAtWs-uxGGKp3Bic8F3YihhlseYTEvUpD8M5spn81uPGeQ01nLg9U/s1600/DSC_0127.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="132" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMIRHk8U2Nw3gPaQzfKup6cGIm-KgHg8lud-qRBWlOXH6Yevr3BKrATzFPal4uR_eZH_151A4d0SctPMuXG_qs_GmAtWs-uxGGKp3Bic8F3YihhlseYTEvUpD8M5spn81uPGeQ01nLg9U/s200/DSC_0127.JPG" width="200" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Some caps<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZOngHqj6u-mWtY86pi7cY_riH6ABD2mo9i6wU0crf_wmff92LOxAqmXzGQnOzPeCM9hOnGAh0KB9xEdW9bAGzUK1n_V8QtAotZR2C_ejou2xHKCN5SbC6f9Ek6owpMaAU9sdQz9-InXs/s1600/DSC_0128.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="132" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZOngHqj6u-mWtY86pi7cY_riH6ABD2mo9i6wU0crf_wmff92LOxAqmXzGQnOzPeCM9hOnGAh0KB9xEdW9bAGzUK1n_V8QtAotZR2C_ejou2xHKCN5SbC6f9Ek6owpMaAU9sdQz9-InXs/s200/DSC_0128.JPG" width="200" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Some resistors<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjVN0qzUPFTPKTYggldZ9VIQkWAIUXjtpYkH0ltMQqdzEoy_RzB9VSc7Xa3GNliEnIzUQmS-lnp71c2ER83fuU2NVeIU5KrXJdSKX4dVDZwh-EU4TtFdUaVhLb4Xn6bnOllbVO-hGj2UE/s1600/DSC_0122.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="132" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjVN0qzUPFTPKTYggldZ9VIQkWAIUXjtpYkH0ltMQqdzEoy_RzB9VSc7Xa3GNliEnIzUQmS-lnp71c2ER83fuU2NVeIU5KrXJdSKX4dVDZwh-EU4TtFdUaVhLb4Xn6bnOllbVO-hGj2UE/s200/DSC_0122.JPG" width="200" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
A dot matrix/strip grid board<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlNtrfiw_EkgK5pLcI4k0JtdwXIwJFkdsLZf4pksjSYjz-hRJKfjiOPIXKmyWo5y8xesTXRJB_w5JepW9L8X6B8jYR9AQYuT5ypn7drNTLJTxoHLSukd0skcUKPWezT8_mSyJuvC3WgpM/s1600/DSC_0215.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="132" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlNtrfiw_EkgK5pLcI4k0JtdwXIwJFkdsLZf4pksjSYjz-hRJKfjiOPIXKmyWo5y8xesTXRJB_w5JepW9L8X6B8jYR9AQYuT5ypn7drNTLJTxoHLSukd0skcUKPWezT8_mSyJuvC3WgpM/s200/DSC_0215.JPG" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<br />
Some wires<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbIKFv6WBNEAOuRCQIOkInGiZHC9YtdjyXY6aFf1jJZlkZm71IsDvDb8lzTXOVSY2pOaCa4WU96do49tmrH1jJjVSGit8P_lZRjZsdHdz6gMFlDm9xdF8oAFYrhoH_CJGR3Tir6UaKkU8/s1600/DSC_0216.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="188" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbIKFv6WBNEAOuRCQIOkInGiZHC9YtdjyXY6aFf1jJZlkZm71IsDvDb8lzTXOVSY2pOaCa4WU96do49tmrH1jJjVSGit8P_lZRjZsdHdz6gMFlDm9xdF8oAFYrhoH_CJGR3Tir6UaKkU8/s200/DSC_0216.JPG" width="200" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9IqEC8i2bVV3p-3UCnI6vykPHNY7pXOaC5N_fjjZzhjUAhkuSofwDvD99WOwP4iQs5QHtalXYl0RVk8Oei7Pc19Xwabd5hfbUqFI8Jb235INser-aDeFWnQNN28G45KAOl84LckLVTMc/s1600/DSC_0061.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="132" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9IqEC8i2bVV3p-3UCnI6vykPHNY7pXOaC5N_fjjZzhjUAhkuSofwDvD99WOwP4iQs5QHtalXYl0RVk8Oei7Pc19Xwabd5hfbUqFI8Jb235INser-aDeFWnQNN28G45KAOl84LckLVTMc/s200/DSC_0061.JPG" width="200" /></a></div>
<br />
<br />
<br />
<br />
<br />
Some shrink tube <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirGdUCV8Ben5IyP2prakuEleXp7avgY1J3l83of8IV0nrPpHnrdbG3Q8Tyxv4RLt2mRVD4y3c9AHE5vOMXwIXMz41AeytY1_h5w2sLvk5ig1d9f6KPi4Tm2pNoghK1VtklChXYsGFmOkE/s1600/DSC_0217.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="132" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirGdUCV8Ben5IyP2prakuEleXp7avgY1J3l83of8IV0nrPpHnrdbG3Q8Tyxv4RLt2mRVD4y3c9AHE5vOMXwIXMz41AeytY1_h5w2sLvk5ig1d9f6KPi4Tm2pNoghK1VtklChXYsGFmOkE/s200/DSC_0217.JPG" width="200" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Some screws, nuts and spacers/standoffs<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBu6WOZQFNr1GdLnaUuygKx3ksmwxJIQK-coa2aUGqXFx-0OcsfR4KXuO24AMC9Ss7b5-S4vtqSm861BOlhzy1ATtxsjvDIjL6nG2KhX4AJDNALiQNK2SZnQwZ9M9uwkjqt_DxzYweVqk/s1600/DSC_0271.JPG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBu6WOZQFNr1GdLnaUuygKx3ksmwxJIQK-coa2aUGqXFx-0OcsfR4KXuO24AMC9Ss7b5-S4vtqSm861BOlhzy1ATtxsjvDIjL6nG2KhX4AJDNALiQNK2SZnQwZ9M9uwkjqt_DxzYweVqk/s200/DSC_0271.JPG" width="195" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh40EnpB2mEMYrjrtjmydSJoSKZ-OD8czqIArMvWCysOGfnAzUEsqhbbzxfJi2JjuchyXEAhi8b4BwxaL3zA1lupkc53FjMUY2zvfniRD7ujNjczxY3QaE7sGAwXNMZqJx93BcSxygPSbY/s1600/DSC_1274.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="133" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh40EnpB2mEMYrjrtjmydSJoSKZ-OD8czqIArMvWCysOGfnAzUEsqhbbzxfJi2JjuchyXEAhi8b4BwxaL3zA1lupkc53FjMUY2zvfniRD7ujNjczxY3QaE7sGAwXNMZqJx93BcSxygPSbY/s200/DSC_1274.JPG" width="200" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBu6WOZQFNr1GdLnaUuygKx3ksmwxJIQK-coa2aUGqXFx-0OcsfR4KXuO24AMC9Ss7b5-S4vtqSm861BOlhzy1ATtxsjvDIjL6nG2KhX4AJDNALiQNK2SZnQwZ9M9uwkjqt_DxzYweVqk/s1600/DSC_0271.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXUW02G7QxdA6zPkmc3DL12v7cT_2FVnXW6D_NKudhg5EzkgkToPKQez73QYaM57vqDvczffD1DoD9_8MuM7DC1Ht7wxIy58u5Vu4U2IC-4fRwvdYWtYn8f0_vtGSjsuW1kCh6Hm-jXpo/s1600/DSC_1268.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="123" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXUW02G7QxdA6zPkmc3DL12v7cT_2FVnXW6D_NKudhg5EzkgkToPKQez73QYaM57vqDvczffD1DoD9_8MuM7DC1Ht7wxIy58u5Vu4U2IC-4fRwvdYWtYn8f0_vtGSjsuW1kCh6Hm-jXpo/s200/DSC_1268.JPG" width="200" /></a></div>
<br />
<h3>
</h3>
<h3>
2. MP3 Shield</h3>
<br />
<span class="" id="result_box" lang="en"><span class="hps">To</span> <span class="hps">put</span> <span class="hps">the MP3 Shield on</span> <span class="hps">the</span> <span class="hps">Arduino board</span>, <span class="hps">soldering</span> of headers <span class="hps">is needed </span></span><span class="" id="result_box" lang="en"><span class="hps">(<a href="https://learn.adafruit.com/adafruit-music-maker-shield-vs1053-mp3-wav-wave-ogg-vorbis-player/assembly" target="_blank">https://learn.adafruit.com/adafruit-music-maker-shield-vs1053-mp3-wav-wave-ogg-vorbis-player/assembly</a>).</span></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXkMAU-alaHOJdpov5waByuh8NCV2_bhZV5CouyRQLxOz88TVYORde7QQaufuRLcRaklhuBMV4W15n3WX42QxJczdMuyUEzrvNj2MDgKD300iOqpgx3d0FLvXTuOJnjaNpf081dtYr91c/s1600/DSC_0117.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXkMAU-alaHOJdpov5waByuh8NCV2_bhZV5CouyRQLxOz88TVYORde7QQaufuRLcRaklhuBMV4W15n3WX42QxJczdMuyUEzrvNj2MDgKD300iOqpgx3d0FLvXTuOJnjaNpf081dtYr91c/s200/DSC_0117.JPG" width="132" /></a></div>
<br />
<br />
The VS1053 library is downloaded and installed to obtain access to the "MP3 Shield" (<a href="https://learn.adafruit.com/adafruit-music-maker-shield-vs1053-mp3-wav-wave-ogg-vorbis-player/installing-software" target="_blank">https://learn.adafruit.com/adafruit-music-maker-shield-vs1053-mp3-wav-wave-ogg-vorbis-player/installing-software</a>).<br />
<br />
With the example sketch "player_simple" the MP3 Shield can be tested. <span class="" id="result_box" lang="en"><span class="hps">Care must be taken</span> <span class="hps">that the</span> <span class="hps">"shield-example object"</span> <span class="hps">is created </span><span class="hps">instead of the</span> <span class="hps">"breakout-example object"</span><span class="">.</span></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQRncbyMN0TT1LIkyYyypfTnB_C0hgr76u00GFfhJXv_KXOIHjEwWbuwBtq8VZfX-KxL1Kpalo_UAkyHRwP7vosGzZ_Wl5eqsllqn8o2QjswhIJpVJp5GqAasFtVb-Cp2GBhZgIdLnLCM/s1600/Arduino_player_simple.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="126" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQRncbyMN0TT1LIkyYyypfTnB_C0hgr76u00GFfhJXv_KXOIHjEwWbuwBtq8VZfX-KxL1Kpalo_UAkyHRwP7vosGzZ_Wl5eqsllqn8o2QjswhIJpVJp5GqAasFtVb-Cp2GBhZgIdLnLCM/s400/Arduino_player_simple.png" width="400" /></a></div>
The output of the Serial Monitor shows the success.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKBcpQVfcfFaC8Gap_XKY39XckXig-mCDsowRBZ_cZve87xHGT8PcQ1INmB6eG1BrRG0kqHVJD2CUfPnp6k_EL6st7pYfe6xz2K7tbiU61AnzIC_dUPk9iTF0pIm1364fmwRzpaB7pGAY/s1600/Arduino_player_simple_output.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKBcpQVfcfFaC8Gap_XKY39XckXig-mCDsowRBZ_cZve87xHGT8PcQ1INmB6eG1BrRG0kqHVJD2CUfPnp6k_EL6st7pYfe6xz2K7tbiU61AnzIC_dUPk9iTF0pIm1364fmwRzpaB7pGAY/s400/Arduino_player_simple_output.png" width="400" /></a></div>
<br />
<h3>
3. Buttons and dot matrix/strip grid board</h3>
I want to use just one analog pin to recognize which button is pressed. Therefore several resistors are needed. At the push of a button, a parallel circuit emerges, several resistors are skipped and a voltage change occurs. The voltage change can be recognized at the analog pin, the value indicates the button.<br />
<br />
The voltage values for the 11 buttons are shown here:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMGhLNVFoMKYyYB_JhuYnBhBqZF22AZfNrMWDa-LVwKMpjGro913clxaQ5MLGoko13Fh5FvPrMNpVCPf_16epc0ZkEtlPVO3fUxP1nt3UNiTdIHts0qO_5qqLYSfGsVMRpwf5dydhwrNg/s1600/Analog_Spannungswerte.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="326" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMGhLNVFoMKYyYB_JhuYnBhBqZF22AZfNrMWDa-LVwKMpjGro913clxaQ5MLGoko13Fh5FvPrMNpVCPf_16epc0ZkEtlPVO3fUxP1nt3UNiTdIHts0qO_5qqLYSfGsVMRpwf5dydhwrNg/s400/Analog_Spannungswerte.png" width="400" /></a></div>
<br />
According to this table the wire layout is created. The wires are connected with the Arduino board/MP3 shield. Red with the 5V pin to supply the buttons with power, black with GND pin, and white with an analog pin to get the signal of the buttons.<br />
<br />
Buttons and resistors will be soldered at the back.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyyw9En63mfxe1U8cdlAHmfz2UawRy5ufdeO79NyHjVX2lOdSAX45fdipilHl2QLkHlNCCVZWH_bJfaGM0Q3hyphenhyphenixrCmP80DqI8Xr55QwganaYNF7X5Bd9UZbof3tAJCsHXIzeHI8q5KiI/s1600/rasterplatine_back_Steckplatine.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="307" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyyw9En63mfxe1U8cdlAHmfz2UawRy5ufdeO79NyHjVX2lOdSAX45fdipilHl2QLkHlNCCVZWH_bJfaGM0Q3hyphenhyphenixrCmP80DqI8Xr55QwganaYNF7X5Bd9UZbof3tAJCsHXIzeHI8q5KiI/s320/rasterplatine_back_Steckplatine.png" width="320" /></a></div>
Some wires can be seen at the front.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDKMgDrVjDIWr0u81yA1eAQQVfJE9a6okKqkjCawOqe972F_Xk_AquExx-2-vakEDknf-0ERbAkzbRti4dNyjaWA5PimLi6DmtGo3f6dgYblSkCrjQGEl0sXBjzq7_Q99vWxcPLN1k8OA/s1600/rasterplatine_front_Steckplatine.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDKMgDrVjDIWr0u81yA1eAQQVfJE9a6okKqkjCawOqe972F_Xk_AquExx-2-vakEDknf-0ERbAkzbRti4dNyjaWA5PimLi6DmtGo3f6dgYblSkCrjQGEl0sXBjzq7_Q99vWxcPLN1k8OA/s320/rasterplatine_front_Steckplatine.png" width="295" /></a></div>
The arduino board is screwed onto the dot matrix/strip grid board, also the battery holder.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_2AOnfQiLsw5krXCsKL3iqNphQ50sYb5bjXYhhOgJvRK9kHFBfV7DY9FDMdvYHhs5u0M9ueCEkUzz_UeVnHa3d3aJN_cde1iqx8PWGNL12NRku5iexCO0imn5WvHwK5CPJecgW5I4NVQ/s1600/DSC_0270.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_2AOnfQiLsw5krXCsKL3iqNphQ50sYb5bjXYhhOgJvRK9kHFBfV7DY9FDMdvYHhs5u0M9ueCEkUzz_UeVnHa3d3aJN_cde1iqx8PWGNL12NRku5iexCO0imn5WvHwK5CPJecgW5I4NVQ/s320/DSC_0270.JPG" width="320" /></a></div>
<br />
Not only the buttons need a connection to the 5V pin, also the potentiometer needs to be supplied with power. Therefore another wire will be used to tap the 5V power supply.<br />
<br />
<h3>
4. Connecting the other components</h3>
The potentiometer has 3 pins. On each pin wires with male connectors are soldered. The left wire (red) is connected to the soldered 5V power supply wire. The middle wire (yellow) is connected to analog pin of the arduino board / mp3 shield. The right wire (black) is connected to a GND pin of the arduino board / mp3 shield.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGLeUBxqwWt_oFq-9QGtIyLaTqYbjElV8Glls2GMgrKcjS1gFAhexa2nbkBJWExNGn_fpJGWSKOfJrlZ3nxwhYnrKSThcgjjfjV11UvDwVw4P40UONm1SkHcK4tYG_2xOnB-iye-l0dX0/s1600/DSC_0280.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGLeUBxqwWt_oFq-9QGtIyLaTqYbjElV8Glls2GMgrKcjS1gFAhexa2nbkBJWExNGn_fpJGWSKOfJrlZ3nxwhYnrKSThcgjjfjV11UvDwVw4P40UONm1SkHcK4tYG_2xOnB-iye-l0dX0/s320/DSC_0280.JPG" width="320" /></a></div>
<br />
<br />
The battery holder is connected to the arduino power jack. The power supply line is cut through to connect the switch button.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAGb6cPglILYDg86of2DZJeWGDvpPX4dMCiEXF50zTRqTxmqWM72QYeMWAYM4IU79NkpsIaw0cpgufklqM6DCRMuCWSM5MpSDZ1pW_uyGV2RRYXq_qj4ScSF1gDpZ6FwUCfMF8wO9IHeE/s1600/DSC_0279.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAGb6cPglILYDg86of2DZJeWGDvpPX4dMCiEXF50zTRqTxmqWM72QYeMWAYM4IU79NkpsIaw0cpgufklqM6DCRMuCWSM5MpSDZ1pW_uyGV2RRYXq_qj4ScSF1gDpZ6FwUCfMF8wO9IHeE/s320/DSC_0279.JPG" width="320" /></a></div>
<br />
Two wires are soldered on the speaker. Then the wires are connected to the MP3 shield.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg18UL-3bMf2TYVeDUkY1hG7HJk-socBQEA9n8pGfR64f9ScRCS7zgUJ0Ie1DP8d5sLoPAEGxezF4gC8sR431I774kBzxNQqdg6PQ5uLhYk-zjq4F7exeEkKUROhuLm12FBiNvjuqWbkA4/s1600/DSC_0278.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg18UL-3bMf2TYVeDUkY1hG7HJk-socBQEA9n8pGfR64f9ScRCS7zgUJ0Ie1DP8d5sLoPAEGxezF4gC8sR431I774kBzxNQqdg6PQ5uLhYk-zjq4F7exeEkKUROhuLm12FBiNvjuqWbkA4/s320/DSC_0278.JPG" width="320" /></a></div>
<br />
And so far that is the result<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3Vs9rakt_fgyrBv873asx0F04PdMd6uvSq44QlSwxnWgLLCW3hbheNuCJajqw8I82vANq_d1Cc_b8pLfaKW7MeJduxakRpawxmDZPcC8bzk20dNGe_Tj4-mftFOpxCA4n3V5L65wPgLg/s1600/DSC_0276.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3Vs9rakt_fgyrBv873asx0F04PdMd6uvSq44QlSwxnWgLLCW3hbheNuCJajqw8I82vANq_d1Cc_b8pLfaKW7MeJduxakRpawxmDZPcC8bzk20dNGe_Tj4-mftFOpxCA4n3V5L65wPgLg/s320/DSC_0276.JPG" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNAJcmg_7jNYW_bso2aOjMpb0ARZpabG43STGeeeuOQLy_5JSZQywIiLWo_L6MNUZVPIg1SOcBNhfv0_h569A9x5flklcYV2kHJCHZv5V9yNGiLwmzy6YVtgVBjqpUnRq1sHHAdpdrMlM/s1600/DSC_0281.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNAJcmg_7jNYW_bso2aOjMpb0ARZpabG43STGeeeuOQLy_5JSZQywIiLWo_L6MNUZVPIg1SOcBNhfv0_h569A9x5flklcYV2kHJCHZv5V9yNGiLwmzy6YVtgVBjqpUnRq1sHHAdpdrMlM/s320/DSC_0281.JPG" width="320" /></a></div>
<br />
<h3>
5. Housing</h3>
The hardware needs now some housing. Potentiometer and switch button are mounted on the top of the housing. The dot matrix/strip grid board and the speaker with the protective grille are mounted on the front. Through the back the screwed components can be accessed.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXNtrGKaSuTZAeewx1_hAQFzcSujQhrgQySGtmDnSJiqYmqTAUfILK1JajnCzFaNhANC_KTPLeLGDWZ3ffxKpepbvzNw0J45uDCaA4QJMu2vFHdIvP5no7ckQ58M12rQnEs17xQ1jyGhM/s1600/DSC_0422.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXNtrGKaSuTZAeewx1_hAQFzcSujQhrgQySGtmDnSJiqYmqTAUfILK1JajnCzFaNhANC_KTPLeLGDWZ3ffxKpepbvzNw0J45uDCaA4QJMu2vFHdIvP5no7ckQ58M12rQnEs17xQ1jyGhM/s320/DSC_0422.JPG" width="320" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7mkkvv1kyLR-vsmI3Zr0LiL_RUikkZpK4NQpA___KfxOaEFwdg6YLqKigzRAjnxeFJLuS9vilm0fqtb578cv_QGpzG6a1zlzfsbwdpeTJb9YWxvCfJOEifWeSfBJMeUHKWWp-fWnAps4/s1600/DSC_0421.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="304" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7mkkvv1kyLR-vsmI3Zr0LiL_RUikkZpK4NQpA___KfxOaEFwdg6YLqKigzRAjnxeFJLuS9vilm0fqtb578cv_QGpzG6a1zlzfsbwdpeTJb9YWxvCfJOEifWeSfBJMeUHKWWp-fWnAps4/s320/DSC_0421.JPG" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<h3>
6. Sketch</h3>
The sketch let the potentiometer act as volume control, recognizes the buttons and goes to the start, next, previous, first or last mp3 track or fast-forwards the mp3 track. The current mp3 track will also be remembered, so next time the Audino is switched on the remembered track will be played again.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: blue;">#include</span> <span style="color: #a31515;"><SPI.h></span>
<span style="color: blue;">#include</span> <span style="color: #a31515;"><Adafruit_VS1053.h></span>
<span style="color: blue;">#include</span> <span style="color: #a31515;"><SD.h></span>
<span style="color: blue;">#define</span> <span style="color: #6f008a;">SHIELD_CS</span> 7 <span style="color: green;">// VS1053 chip select pin (output)</span>
<span style="color: blue;">#define</span> <span style="color: #6f008a;">SHIELD_DCS</span> 6 <span style="color: green;">// VS1053 Data/command select pin (output)</span>
<span style="color: blue;">#define</span> <span style="color: #6f008a;">DREQ</span> 3 <span style="color: green;">// VS1053 Data request, ideally an Interrupt pin</span>
<span style="color: blue;">#define</span> <span style="color: #6f008a;">CARDCS</span> 4 <span style="color: green;">// Card chip select pin</span>
<span style="color: #2b91af;">Adafruit_VS1053_FilePlayer</span> musicPlayer =
<span style="color: #2b91af;">Adafruit_VS1053_FilePlayer</span>(<span style="color: #6f008a;">SHIELD_CS</span>, <span style="color: #6f008a;">SHIELD_DCS</span>, <span style="color: #6f008a;">DREQ</span>, <span style="color: #6f008a;">CARDCS</span>);
<span style="color: green;">// VS1053 play speed parameter</span>
<span style="color: blue;">#define</span> <span style="color: #6f008a;">para_playSpeed</span> 0x1E04
<span style="color: green;">// constants won't change</span>
<span style="color: green;">// the number of the pin that is used for the pushbuttons</span>
<span style="color: blue;">const</span> <span style="color: blue;">int</span> buttonsPin = A0;
<span style="color: green;">// the pin of the potentiometer that is used to control the volume</span>
<span style="color: blue;">const</span> <span style="color: blue;">int</span> volumePin = A1;
<span style="color: green;">// wait before next click is recognized</span>
<span style="color: blue;">const</span> <span style="color: blue;">int</span> buttonPressedDelay = 1000;
<span style="color: green;">// variables will change</span>
<span style="color: #2b91af;">byte</span> currentFolder = 1;
<span style="color: blue;">unsigned</span> <span style="color: blue;">int</span> currentFile = 0;
<span style="color: blue;">unsigned</span> <span style="color: blue;">int</span> numberOfFiles[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
<span style="color: green;">// the current volume level, set to min at start</span>
<span style="color: #2b91af;">byte</span> volumeState = 254;
<span style="color: green;">// last button that was pressed</span>
<span style="color: #2b91af;">byte</span> lastPressedButton = 0;
<span style="color: green;">// is the last pressed button released</span>
<span style="color: #2b91af;">boolean</span> released = <span style="color: #6f008a;">true</span>;
<span style="color: green;">// remember if the back button was pressed last time</span>
<span style="color: #2b91af;">byte</span> lastReleasedButton = 0;
<span style="color: green;">// the time at the back button was pressed last time</span>
<span style="color: blue;">long</span> lastBackButtonTime = 0;
<span style="color: blue;">char</span> currentTrackFileName[] = <span style="color: #a31515;">"/0/current.txt"</span>;
<span style="color: green;">// the setup routine runs once when you turn the device on or you press reset</span>
<span style="color: blue;">void</span> setup()
{
<span style="color: green;">// disable LED L</span>
pinMode(13, <span style="color: #6f008a;">OUTPUT</span>);
digitalWrite(13, <span style="color: #6f008a;">LOW</span>);
<span style="color: green;">// initialize serial communication at 9600 bits per second</span>
<span style="color: green;">//Serial.begin(9600);</span>
<span style="color: green;">// initialise the music player</span>
<span style="color: blue;">if</span> (!musicPlayer.begin())
{
<span style="color: green;">//Serial.println("VS1053 not found");</span>
<span style="color: blue;">while</span> (1); <span style="color: green;">// don't do anything more</span>
}
<span style="color: green;">// initialise the SD card</span>
SD.begin(<span style="color: #6f008a;">CARDCS</span>);
<span style="color: green;">// If DREQ is on an interrupt pin (on uno, #2 or #3) we can do background</span>
<span style="color: green;">// audio playing</span>
musicPlayer.useInterrupt(<span style="color: #6f008a;">VS1053_FILEPLAYER_PIN_INT</span>); <span style="color: green;">// DREQ int</span>
musicPlayer.sineTest(0x44, 100); <span style="color: green;">// Make a tone to indicate VS1053 is working </span>
<span style="color: green;">// read the number of tracks in each folder</span>
<span style="color: blue;">for</span> (<span style="color: #2b91af;">byte</span> i = 0; i < 10; i++)
{
<span style="color: #2b91af;">String</span> temp = <span style="color: #a31515;">"/"</span>;
temp.concat(i);
<span style="color: blue;">char</span> filename[3];
temp.toCharArray(filename, <span style="color: blue;">sizeof</span>(filename));
numberOfFiles[i] = countFiles(SD.open(filename));
<span style="color: green;">//Serial.print(filename);</span>
<span style="color: green;">//Serial.print(": ");</span>
<span style="color: green;">//Serial.println(numberOfFiles[i]);</span>
}
<span style="color: green;">// read remembered track</span>
<span style="color: blue;">if</span> (SD.exists(currentTrackFileName))
{
<span style="color: #2b91af;">File</span> file = SD.open(currentTrackFileName, <span style="color: #6f008a;">FILE_READ</span>);
<span style="color: blue;">if</span> (file)
{
currentFolder = file.readStringUntil(<span style="color: #a31515;">'\n'</span>).toInt();
currentFile = file.readStringUntil(<span style="color: #a31515;">'\n'</span>).toInt() - 1;
}
file.close();
}
delay(100); <span style="color: green;">// init delay</span>
}
<span style="color: green;">// counts the number of files in directory</span>
<span style="color: blue;">unsigned</span> <span style="color: blue;">int</span> countFiles(<span style="color: #2b91af;">File</span> <span style="color: grey;">dir</span>)
{
<span style="color: blue;">unsigned</span> <span style="color: blue;">int</span> counter = 0;
<span style="color: blue;">while</span> (<span style="color: #6f008a;">true</span>)
{
<span style="color: #2b91af;">File</span> entry = <span style="color: grey;">dir</span>.openNextFile();
<span style="color: blue;">if</span> (!entry)
{
<span style="color: green;">// no more files</span>
<span style="color: blue;">break</span>;
}
counter++;
entry.close();
}
<span style="color: grey;">dir</span>.close();
<span style="color: blue;">return</span> counter;
}
<span style="color: green;">// the loop routine runs over and over again forever</span>
<span style="color: blue;">void</span> loop()
{
<span style="color: green;">// play next song if player stopped</span>
<span style="color: blue;">if</span> (musicPlayer.stopped())
{
playNext();
}
<span style="color: green;">// check the volume and set it</span>
checkVolume();
<span style="color: green;">// check if a button is pressed and perform some action</span>
checkButtons();
delay(1); <span style="color: green;">// delay in between reads for stability</span>
}
<span style="color: green;">// checks the value of the potentiometer</span>
<span style="color: green;">// if it has changed by 2 then set the new volume</span>
<span style="color: blue;">void</span> checkVolume()
{
<span style="color: green;">// read the state of the volume potentiometer</span>
<span style="color: blue;">int</span> read = analogRead(volumePin);
<span style="color: green;">// set the range of the volume from max=0 to min=254</span>
<span style="color: green;">// (limit max volume to 20 and min to 60) </span>
<span style="color: #2b91af;">byte</span> state = map(read, 0, 1023, 20, 60);
<span style="color: green;">// recognize state (volume) changes in steps of two</span>
<span style="color: blue;">if</span> (state < volumeState - 1 || state > volumeState + 1)
{
<span style="color: green;">// remember the new volume state</span>
volumeState = state;
<span style="color: green;">// set volume max=0, min=254</span>
musicPlayer.setVolume(volumeState, 254);
<span style="color: green;">// print out the state of the volume</span>
<span style="color: green;">//Serial.print(volumePin);</span>
<span style="color: green;">//Serial.print(" volume ");</span>
<span style="color: green;">//Serial.println(volumeState);</span>
}
}
<span style="color: green;">// check if some button is pressed</span>
<span style="color: green;">// play first track, if button is not pressed last time</span>
<span style="color: green;">// play next track, if a button is pressed again</span>
<span style="color: blue;">void</span> checkButtons()
{
<span style="color: green;">// get the pressed button</span>
<span style="color: #2b91af;">byte</span> pressedButton = getPressedButton();
<span style="color: green;">// if a button is pressed</span>
<span style="color: blue;">if</span> (pressedButton != 0)
{
<span style="color: green;">//Serial.print("Taste: ");</span>
<span style="color: green;">//Serial.println(pressedButton);</span>
<span style="color: green;">// if a track/play list button is pressed</span>
<span style="color: blue;">if</span> (pressedButton < 10 && released)
{
musicPlayer.stopPlaying();
<span style="color: blue;">if</span> (currentFolder == pressedButton)
{
playNext();
}
<span style="color: blue;">else</span>
{
currentFolder = pressedButton;
currentFile = 1;
playCurrent();
}
}
<span style="color: green;">// if a function button is pressed</span>
<span style="color: blue;">else</span>
{
<span style="color: blue;">if</span> (pressedButton == 10 && released)
{
musicPlayer.stopPlaying();
<span style="color: blue;">long</span> time = millis();
<span style="color: green;">// this is the second press within 1 sec., so we </span>
<span style="color: green;">// got to the previous track</span>
<span style="color: blue;">if</span> (lastReleasedButton == 10 &&
((time - lastBackButtonTime) < buttonPressedDelay))
{
playPrevious();
}
<span style="color: blue;">else</span>
{
playCurrent();
}
lastBackButtonTime = time;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (pressedButton == 11 && released)
{
<span style="color: green;">// increase play speed</span>
musicPlayer.sciWrite(<span style="color: #6f008a;">VS1053_REG_WRAMADDR</span>, <span style="color: #6f008a;">para_playSpeed</span>);
musicPlayer.sciWrite(<span style="color: #6f008a;">VS1053_REG_WRAM</span>, 3);
<span style="color: green;">//Serial.println("increase speed");</span>
}
}
released = <span style="color: #6f008a;">false</span>;
lastReleasedButton = pressedButton;
}
<span style="color: blue;">else</span>
{
released = <span style="color: #6f008a;">true</span>;
<span style="color: green;">// reset play speed</span>
<span style="color: blue;">if</span> (lastPressedButton == 11)
{
musicPlayer.sciWrite(<span style="color: #6f008a;">VS1053_REG_WRAMADDR</span>, <span style="color: #6f008a;">para_playSpeed</span>);
musicPlayer.sciWrite(<span style="color: #6f008a;">VS1053_REG_WRAM</span>, 1);
}
}
<span style="color: green;">// remember pressed button</span>
lastPressedButton = pressedButton;
}
<span style="color: blue;">void</span> playPrevious()
{
currentFile--;
<span style="color: blue;">if</span> (currentFile < 1)
{
currentFile = numberOfFiles[currentFolder];
}
playCurrent();
}
<span style="color: blue;">void</span> playNext()
{
currentFile++;
<span style="color: blue;">if</span> (currentFile > numberOfFiles[currentFolder])
{
currentFile = 1;
}
playCurrent();
}
<span style="color: blue;">void</span> playCurrent()
{
<span style="color: blue;">if</span> (numberOfFiles[currentFolder] > 0)
{
rememberCurrentTrack();
<span style="color: #2b91af;">String</span> temp = <span style="color: #a31515;">"/"</span>;
temp.concat(currentFolder);
temp.concat(<span style="color: #a31515;">"/"</span>);
temp.concat(currentFile);
temp.concat(<span style="color: #a31515;">".mp3"</span>);
<span style="color: blue;">char</span> filename[temp.length() + 1];
temp.toCharArray(filename, <span style="color: blue;">sizeof</span>(filename));
musicPlayer.startPlayingFile(filename);
<span style="color: green;">//Serial.print("Play ");</span>
<span style="color: green;">//Serial.println(filename);</span>
}
}
<span style="color: blue;">void</span> rememberCurrentTrack()
{
<span style="color: blue;">if</span> (SD.exists(currentTrackFileName))
{
SD.remove(currentTrackFileName);
}
<span style="color: #2b91af;">File</span> file = SD.open(currentTrackFileName, <span style="color: #6f008a;">FILE_WRITE</span>);
<span style="color: blue;">if</span> (file)
{
file.println(currentFolder);
file.println(currentFile);
}
file.close();
}
<span style="color: green;">// returns 0 if no button is pressed,</span>
<span style="color: green;">// else the number of the pressed button is returned (1 - 11)</span>
<span style="color: #2b91af;">byte</span> getPressedButton()
{
<span style="color: blue;">int</span> buttonsPinValue = analogRead(buttonsPin);
<span style="color: #2b91af;">byte</span> pressedButton = 0;
<span style="color: blue;">if</span> (buttonsPinValue > 823)
{
<span style="color: green;">// button 6 has a value of about 878</span>
pressedButton = 6;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 725)
{
<span style="color: green;">// button 5 has a value of about 768</span>
pressedButton = 5;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 649)
{
<span style="color: green;">// button 4 has a value of about 683</span>
pressedButton = 4;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 586)
{
<span style="color: green;">// button 3 has a value of about 614</span>
pressedButton = 3;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 535)
{
<span style="color: green;">// button 2 has a value of about 559</span>
pressedButton = 2;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 492)
{
<span style="color: green;">// button 1 has a value of about 512</span>
pressedButton = 1;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 450)
{
<span style="color: green;">// if no button is pressed the value is of about 473</span>
pressedButton = 0;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 400)
{
<span style="color: green;">// button 8 has a value of about 427</span>
pressedButton = 11;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 340)
{
<span style="color: green;">// button 10 has a value of about 372</span>
pressedButton = 10;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 267)
{
<span style="color: green;">// button 9 has a value of about 307</span>
pressedButton = 9;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 178)
{
<span style="color: green;">// button 8 has a value of about 228</span>
pressedButton = 8;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 0)
{
<span style="color: green;">// button 7 has a value of about 128</span>
pressedButton = 7;
}
<span style="color: blue;">return</span> pressedButton;
}
</pre>
<br />
<h3>
7. PC-Software</h3>
The Audino is now ready for use. On the micro SD card the folders "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" must be created. Several mp3 tracks can be added to the folders 1 - 9. The mp3 tracks in each folder must be numbered consecutively (1.mp3, 2.mp3 ...). Hence just one channel is used the mp3 tracks should be in mono.<br />
<br />
I created a PC-Software to simplify the copy process. The playlists can be planed and created.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjD0ooypziYLkVOVW4N7QSbpFoI3MrOxB40Srl4JLB4A5tFxFDeV38qppUrkCK5is-3kg_VBFG0GIfULPMPI9g_lgJSYl4FfsLslQYYGbuD2B57ul0X7qZJVqytOglaBTIwk4cEkRcezsw/s1600/2015-05-12+21_28_10-Audino.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjD0ooypziYLkVOVW4N7QSbpFoI3MrOxB40Srl4JLB4A5tFxFDeV38qppUrkCK5is-3kg_VBFG0GIfULPMPI9g_lgJSYl4FfsLslQYYGbuD2B57ul0X7qZJVqytOglaBTIwk4cEkRcezsw/s320/2015-05-12+21_28_10-Audino.png" width="212" /></a></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3zaJC46kfdMxaWFqkytCqZ3yU0g70_nltGiV0kHRfHVLInXuI-7QdyBq2UqaBA2DheDpfke2ISlejXM0BOFDFBA11smgY7obq1mN2lhfV2P0bnFNDOCvodDwLS0lzi7cTOJFfTlXFcvo/s1600/2015-05-12+22_09_37-Audino.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3zaJC46kfdMxaWFqkytCqZ3yU0g70_nltGiV0kHRfHVLInXuI-7QdyBq2UqaBA2DheDpfke2ISlejXM0BOFDFBA11smgY7obq1mN2lhfV2P0bnFNDOCvodDwLS0lzi7cTOJFfTlXFcvo/s320/2015-05-12+22_09_37-Audino.png" width="214" /></a><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<h3>
8. Further Readings</h3>
In german:
<br />
<ol>
<li><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-1-auswahl-der.html"><b>Auswahl der Komponenten</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-2-das.html" target="_blank">Das Entwicklungsbrett</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-3-das-erste.html" target="_blank">Das erste Einschalten</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-4-die.html" target="_blank">Die Entwicklungsumgebung</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-5-knopfe.html" target="_blank">Knöpfe (digital)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-6-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (digital)</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-7-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (analog)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-8-potentiometer.html">Potentiometer</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-9-mp3-shield.html">Das MP3 Shield</a></b></li>
<li><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-10-auswahl-der.html"><b>Auswahl der Komponenten 2</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-11-auswahl-der.html">Auswahl der Komponenten (Zusammenfassung)</a> </b></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-12-punkt.html"><b>Punkt-Streifenrasterplatine und Knöpfe</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-13-punkt.html"><b>Punkt-Streifenrasterplatine und weitere Komponenten</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-14-das-gehause.html"><b>Das Gehäuse</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-15-sketch-1-setup.html"><b>Sketch 1 (setup-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/03/arduino-mp3-player-16-sketch-2-loop.html"><b>Sketch 2 (loop-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/04/arduino-mp3-player-17-sketch-3-der.html"><b>Sketch 3 (Der komplette Code)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/05/audino-arduino-mp3-player-18-pc-software.html"><b>PC-Software</b></a></li>
</ol>
<br />Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-2359578464804578723.post-8977935531228309102015-09-23T21:34:00.000+02:002015-09-23T09:20:55.612+02:00Set SVN Property Ignore with TortoiseSVNObjects that are not checked in, were marked with questionmarks by TortoiseSVN, if icon overlay is active and functional.<br />
<div class="level4">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiDZlM1JzRwNtpzbB8OIkjehv-2QClfaudbNqE-bSky6ArU0Ume7eOKSKPZ7MQYJ4m0aTgMcRqILN-hYcx_GT46MonqADTfq1VpYbJz15i_-CGF9kWYahlYHNN2BfEDqEVCajyqZ-gPdM/s1600/svn-unversioned.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiDZlM1JzRwNtpzbB8OIkjehv-2QClfaudbNqE-bSky6ArU0Ume7eOKSKPZ7MQYJ4m0aTgMcRqILN-hYcx_GT46MonqADTfq1VpYbJz15i_-CGF9kWYahlYHNN2BfEDqEVCajyqZ-gPdM/s1600/svn-unversioned.png" /></a></div>
<br />
If you are performing a "SVN Commit..." and "Show unversioned files" is checked, then this files will be shown.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdJS9mFsiCSisARu9HhrOvenQgHbZI0URyjCGol0DZmN202EfBpSs9bjBLoY2mbw8CjbUPYJBJLpuAPe-16T89daXNf3cBNZgPkZEuQQgFabWkj0D6GvMg4vDpeQtRz0KoXRxjhuDW_ss/s1600/Commit+-+TortoiseSVN.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdJS9mFsiCSisARu9HhrOvenQgHbZI0URyjCGol0DZmN202EfBpSs9bjBLoY2mbw8CjbUPYJBJLpuAPe-16T89daXNf3cBNZgPkZEuQQgFabWkj0D6GvMg4vDpeQtRz0KoXRxjhuDW_ss/s1600/Commit+-+TortoiseSVN.png" /></a></div>
Over time the number of files and folders can be grown and you can easily lose the overview so that needed files are not checked in. Also the risk increases that files are checked in that shouldn't (like compiled code).<br />
<br />
For example, Visual Studio creates the folder "bin" and "obj" automatically for the compiled code. But you never want to check in the folders and their content. You can ignore the folders and their content so that they will not shown, again. To do so right click on the object to ignore and then go to "TortoiseSVN→Add to ignore list". If you choose "(recursively)" the item will be ignored in this folder and all subfolders. <span class="" id="result_box" lang="en" tabindex="-1"><span class="hps">For files</span> <span class="hps">you have the choice</span> <span class="hps">whether</span> <span class="hps">all files with the</span> <span class="hps">same</span> <span class="hps">extension (*.extension)</span> <span class="hps">or</span> <span class="hps">just this particular </span><span class="hps">file (file.extension) is to be</span> <span class="hps">ignored</span><span class="">.</span></span><br />
<br />
Objects that are ignored, were marked by TortoiseSVN, if icon overlay is active and functional.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrxQJwcfdumWEkATE9-yc5Uk9qSs_j4zhfeEBsb2JuF2P9aWfM2l4hc49hrjuJ6P87hREkQgrGL_H2owaqMBAO6gKWW4h2Fo_DqzsLeu7HlIfkqNxPhcrqu-05mP1ns7xme4LmZQevTvs/s1600/svn-ignored.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrxQJwcfdumWEkATE9-yc5Uk9qSs_j4zhfeEBsb2JuF2P9aWfM2l4hc49hrjuJ6P87hREkQgrGL_H2owaqMBAO6gKWW4h2Fo_DqzsLeu7HlIfkqNxPhcrqu-05mP1ns7xme4LmZQevTvs/s1600/svn-ignored.png" /></a></div>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2359578464804578723.post-6855993082809383492015-09-02T21:35:00.001+02:002015-09-02T21:35:07.249+02:00Set SVN Property External with TortoiseSVN<div class="secedit editbutton_section editbutton_4">
<form action="/huhwiki/doku.php/programmierung/sonstiges/subversion" class="button btn_secedit" method="post">
</form>
</div>
<div class="level3">
<br />
An already existing project can be integrated into a new main project with the help of Subversion. This has several advantages:<br />
<ul>
<li>No need to make a local copy (but be carefull with changes)</li>
<li>You can choose the version of the existing project, always the newest or fixed at some revision</li>
<li>You can use relative paths that can be predefined by the structure of the main project</li>
</ul>
If you are using a certain revision, then you prevent that changes in external project affect negatively on your project.<br />
<br />
You can include an existing project with the property "svn:externals". This can be done at the root of the new main project.<br />
<br />
In the context menu go to "TortoiseSVN → Properties→New...→Externals→New...". Then you have to set the "Local path" to which the external project should be checked out and the URL of the external project. If you always want to have the newest version of the external project choose "HEAD revision", otherwise choose "Revision" and set the "Peg" revision. Furthermore you can also set the "Operative" revision, if it differs.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilmEc4CrGbr3nMKOWPlyArT95-OKG4ixZw2tkckJaRqsICZp5htgXqGJsVJe1_mDsx7ReFQnPDviDOJ7KW31QAX0jzeOs2miREMRQk6gNz8U1MfuqLc42eL3siHpDD-oGqvzdwmY5nvi4/s1600/External+-+TortoiseSVN.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="144" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilmEc4CrGbr3nMKOWPlyArT95-OKG4ixZw2tkckJaRqsICZp5htgXqGJsVJe1_mDsx7ReFQnPDviDOJ7KW31QAX0jzeOs2miREMRQk6gNz8U1MfuqLc42eL3siHpDD-oGqvzdwmY5nvi4/s320/External+-+TortoiseSVN.png" width="320" /></a></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5OLdUddTKkhCeEbOJ0UH8fozFaJfpgXvuEiOboxz7zRL_GftWN1aF1YVmBgKwO74pn9cOVTjBeQsNVMkp-QLh-aprGftBIg1FHEf9rFJWo_gLMZk6bxoYhQ1tHe2PuyoQuGUpIV7b-cw/s1600/External+-+relative+-+TortoiseSVN.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="144" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5OLdUddTKkhCeEbOJ0UH8fozFaJfpgXvuEiOboxz7zRL_GftWN1aF1YVmBgKwO74pn9cOVTjBeQsNVMkp-QLh-aprGftBIg1FHEf9rFJWo_gLMZk6bxoYhQ1tHe2PuyoQuGUpIV7b-cw/s320/External+-+relative+-+TortoiseSVN.png" width="320" /></a></div>
<br />
With "SVN Update" the external projects will be checked out to the defined path.<br />
<br />
<ul>
</ul>
</div>
<div class="secedit editbutton_section editbutton_5">
<form action="/huhwiki/doku.php/programmierung/sonstiges/subversion" class="button btn_secedit" method="post">
</form>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2359578464804578723.post-30377017863566216742015-08-31T20:00:00.000+02:002015-09-23T09:19:23.345+02:00Edit Subversion Properties with TortoiseSVNIn subversion you can set properties for versioned files and folders. There are some pre-defined properties that start e.g. with "svn:". To read and write properties in TortoiseSVN, you can use the context menu. Right click on some file or folder and then go to "TortoiseSVN → Properties".<br />
<div class="level3">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6cvZaxGIw7ej9wCb6xJ4rPuSd9mQPw51B51O5jjqmOE6ANznXwtwdT7aGmXYeHA6fGPDaJ9v-zPYscSdbKhmqTBJLdzrF8sRqgnboI6__TAHpt9fLkdbzKkRQboOF1VJs5ObpgRsHEwE/s1600/Properties+-+TortoiseSVN.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6cvZaxGIw7ej9wCb6xJ4rPuSd9mQPw51B51O5jjqmOE6ANznXwtwdT7aGmXYeHA6fGPDaJ9v-zPYscSdbKhmqTBJLdzrF8sRqgnboI6__TAHpt9fLkdbzKkRQboOF1VJs5ObpgRsHEwE/s400/Properties+-+TortoiseSVN.png" width="400" /></a></div>
In the upcoming diolog you can see and modify the properties that exist already. With "New..." you can set new properties. Some properties can then be selected and configured directly. To obtain all properties choose "Other".<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7RcAoVYpzlvlrTpAiJwtHcc26ygJAk3OtLoDzArVPb9kgvErJQ582ijGg4bOuJuDpyA0MBNsBesaZx8QBtHqmlFovtPQz1b91r_LA5WxUqg5oDv6b-leNfspJQFnTTMZrK4M7L2W1gzk/s1600/Other+-+Properties+-+TortoiseSVN.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="260" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7RcAoVYpzlvlrTpAiJwtHcc26ygJAk3OtLoDzArVPb9kgvErJQ582ijGg4bOuJuDpyA0MBNsBesaZx8QBtHqmlFovtPQz1b91r_LA5WxUqg5oDv6b-leNfspJQFnTTMZrK4M7L2W1gzk/s320/Other+-+Properties+-+TortoiseSVN.png" width="320" /></a></div>
A new dialog appears. Here you can select the "Property name". In "Property value" you can set the needed value.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPixnJa9ypvPTgJRSaaZPb3xO7qVguXQNU9ohYcMo3CUSCIaj6_ad_U-Jt8joDeZxkv3vlHkH4krR2gE76EP1IHyidiVoOslNq47GvZaHxo69PPY-A8sMD3ufaS7GfjJUmjTNvvbCesGo/s1600/Add+Properties+-+TortoiseSVN.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="282" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPixnJa9ypvPTgJRSaaZPb3xO7qVguXQNU9ohYcMo3CUSCIaj6_ad_U-Jt8joDeZxkv3vlHkH4krR2gE76EP1IHyidiVoOslNq47GvZaHxo69PPY-A8sMD3ufaS7GfjJUmjTNvvbCesGo/s320/Add+Properties+-+TortoiseSVN.png" width="320" /></a></div>
You can set the properties either for a folder or for one or more files. If you set it for a folder you can set the properties optionally to all subfolders and containing files. To do that check "Apply property recursively".<br />
<br /></div>
<div class="secedit editbutton_section editbutton_3">
<form action="/huhwiki/doku.php/programmierung/sonstiges/subversion" class="button btn_secedit" method="post">
</form>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2359578464804578723.post-85339932046202409032015-07-25T00:31:00.000+02:002015-07-25T00:31:07.171+02:00Minimum column width in WPF ListView/GridViewIt seems that it is not possible to set the minimum width of a column within XAML. But it can be forced withn code-behind. Laurent Bugnion has found the solution (<a href="http://geekswithblogs.net/lbugnion/archive/2008/05/06/wpf-listviewgridview-minimum-and-maximum-width-for-a-column.aspx" target="_blank">http://geekswithblogs.net/lbugnion/archive/2008/05/06/wpf-listviewgridview-minimum-and-maximum-width-for-a-column.aspx</a>).<br />
<br />
The ListView is defined in the XAML part.<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"> </pre>
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"> <span style="color: blue;"><</span><span style="color: #a31515;">ListView</span><span style="color: red;"> x</span><span style="color: blue;">:</span><span style="color: red;">Name</span><span style="color: blue;">=</span><span style="color: blue;">"MyListView"</span><span style="color: blue;">></span>
<span style="color: green;"><!-- ... --></span>
<span style="color: blue;"><</span><span style="color: #a31515;">ListView.ContextMenu</span><span style="color: blue;">></span></pre>
<br />
In the constructor of the code-behind part the event handler is added.<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"> </pre>
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"> ResultDataView.AddHandler(<span style="color: #2b91af;">Thumb</span>.DragDeltaEvent,
<span style="color: blue;">new</span> <span style="color: #2b91af;">DragDeltaEventHandler</span>(Thumb_DragDelta), <span style="color: blue;">true</span>);</pre>
<br />
The event handler takes care that column width is not set under 20 (in this example).<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: blue;"> </span></pre>
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"> <span style="color: blue;">private</span> <span style="color: blue;">void</span> Thumb_DragDelta(<span style="color: blue;">object</span> sender, <span style="color: #2b91af;">DragDeltaEventArgs</span> e)
{
<span style="color: #2b91af;">Thumb</span> senderAsThumb = e.OriginalSource <span style="color: blue;">as</span> <span style="color: #2b91af;">Thumb</span>;
<span style="color: #2b91af;">GridViewColumnHeader</span> header = senderAsThumb.TemplatedParent <span style="color: blue;">as</span>
<span style="color: #2b91af;">GridViewColumnHeader</span>;
<span style="color: blue;">if</span> (header == <span style="color: blue;">null</span>)
{
<span style="color: blue;">return</span>;
}
<span style="color: blue;">if</span> (header.Column.ActualWidth < 20)
{
header.Column.Width = 20;
}
}</pre>
<br />
<br />Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-2359578464804578723.post-15472473834586712772015-06-23T22:00:00.000+02:002015-06-24T00:09:40.663+02:00Setting the Background of a WPF TextBox depending on Validation in a Template/Style using TemplateBindingRecently I wanted to change the <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.control.background%28v=vs.110%29.aspx" target="_blank">Background</a> of a <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.textbox%28v=vs.110%29.aspx" target="_blank">TextBox</a>, if some own <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.validationrule%28v=vs.110%29.aspx" target="_blank">ValidationRule</a> failed. But I couldn't get this to work. I tried several things and I gained more insights into styling and especially into styling wrong validated elements. And finally I get it to work.<br />
<br />
If you are not familiar with WPF validation, here you can find excellent descriptions of how to use validation in WPF:
<br />
<ul>
<li><a href="http://blogs.msdn.com/b/wpfsdk/archive/2007/10/02/data-validation-in-3-5.aspx" target="_blank">http://blogs.msdn.com/b/wpfsdk/archive/2007/10/02/data-validation-in-3-5.aspx</a></li>
<li><a href="http://www.codeproject.com/Articles/15239/Validation-in-Windows-Presentation-Foundation" target="_blank">http://www.codeproject.com/Articles/15239/Validation-in-Windows-Presentation-Foundation</a></li>
</ul>
<br />
Now, I come to to initial situation.<br />
<br />
<h3>
Using ValidationRule in WPF </h3>
I had a <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.validationrule%28v=vs.110%29.aspx" target="_blank">ValidationRule</a>, something like that.<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: blue;">namespace</span> ErrorValidation
{
<span style="color: blue;">public</span> <span style="color: blue;">class</span> <span style="color: #2b91af;">RangeValidationRule</span> : <span style="color: #2b91af;">ValidationRule</span>
{
<span style="color: blue;">public</span> <span style="color: blue;">double</span> Min { <span style="color: blue;">get</span>; <span style="color: blue;">set</span>; }
<span style="color: blue;">public</span> <span style="color: blue;">double</span> Max { <span style="color: blue;">get</span>; <span style="color: blue;">set</span>; }
<span style="color: blue;">public</span> <span style="color: blue;">override</span> <span style="color: #2b91af;">ValidationResult</span> Validate(<span style="color: blue;">object</span> value,
<span style="color: #2b91af;">CultureInfo</span> cultureInfo)
{
<span style="color: blue;">double</span> enteredValue;
<span style="color: blue;">if</span> (<span style="color: blue;">double</span>.TryParse(value.ToString(), <span style="color: blue;">out</span> enteredValue))
{
<span style="color: blue;">if</span> ((enteredValue < Min) || (enteredValue > Max))
{
<span style="color: blue;">return</span> <span style="color: blue;">new</span> <span style="color: #2b91af;">ValidationResult</span>(<span style="color: blue;">false</span>,
<span style="color: blue;">string</span>.Format(<span style="color: #a31515;">"Entered value must be in the range [{0};{1}]."</span>,
Min, Max));
}
}
<span style="color: blue;">else</span>
{
<span style="color: blue;">return</span> <span style="color: blue;">new</span> <span style="color: #2b91af;">ValidationResult</span>(<span style="color: blue;">false</span>,
<span style="color: blue;">string</span>.Format(<span style="color: #a31515;">"Value '{0}' is not of type double."</span>, value));
}
<span style="color: blue;">return</span> <span style="color: blue;">new</span> <span style="color: #2b91af;">ValidationResult</span>(<span style="color: blue;">true</span>, <span style="color: blue;">null</span>);
}
}
}</pre>
To get access to the <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.validationrule%28v=vs.110%29.aspx" target="_blank">ValidationRule</a> the XML namespace is defined in the <span id="goog_1452881536"></span><a href="http://msdn.microsoft.com/en-us/library/ms747122%28v=vs.110%29.aspx" target="_blank">XAML</a>.<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: red;">xmlns</span><span style="color: blue;">:</span><span style="color: red;">validation</span><span style="color: blue;">=</span><span style="color: blue;">"clr-namespace:ErrorValidation"</span></pre>
I get access to the <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.validationrule%28v=vs.110%29.aspx" target="_blank">ValidationRule</a> in the Window/UserControl Resources.<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: blue;"><</span><span style="color: #a31515;">validation</span><span style="color: blue;">:</span><span style="color: #a31515;">RangeValidationRule</span><span style="color: red;"> x</span><span style="color: blue;">:</span><span style="color: red;">Key</span><span style="color: blue;">=</span><span style="color: blue;">"RangeValidationRule"</span><span style="color: blue;"> /></span></pre>
Now I can use the <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.validationrule%28v=vs.110%29.aspx" target="_blank">ValidationRule</a> to validate user input.<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"> <span style="color: blue;"><</span><span style="color: #a31515;">TextBox</span><span style="color: red;"> Margin</span><span style="color: blue;">=</span><span style="color: blue;">"12,0,12,12"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">TextBox.Text</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Binding</span><span style="color: red;"> Path</span><span style="color: blue;">=</span><span style="color: blue;">"InputField1"</span>
<span style="color: red;"> UpdateSourceTrigger</span><span style="color: blue;">=</span><span style="color: blue;">"PropertyChanged"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Binding.ValidationRules</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">validation</span><span style="color: blue;">:</span><span style="color: #a31515;">RangeValidationRule</span><span style="color: red;"> Min</span><span style="color: blue;">=</span><span style="color: blue;">"5"</span>
<span style="color: red;"> Max</span><span style="color: blue;">=</span><span style="color: blue;">"10"</span><span style="color: blue;"> /></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Binding.ValidationRules</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Binding</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">TextBox.Text</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">TextBox</span><span style="color: blue;">></span></pre>
<div class="separator" style="clear: both; text-align: center;">
</div>
The default style is used to mark user input that violates the <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.validationrule%28v=vs.110%29.aspx" target="_blank">ValidationRule</a>.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2i-E_7IeiDVsHlf4ISKxXFFG0iv9Uyh1RIpA1qFGCudbLQ9IkOoat0NDZBc8jKJ6FyK-ZEzQ3i0OEn3p_emzMffJ24GmlrsRyaKrnSPo-qVm4fHHQtR-eALUp64RqS9v2Lf6VEj2L8Qw/s1600/Validation-Default-Style.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="26" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2i-E_7IeiDVsHlf4ISKxXFFG0iv9Uyh1RIpA1qFGCudbLQ9IkOoat0NDZBc8jKJ6FyK-ZEzQ3i0OEn3p_emzMffJ24GmlrsRyaKrnSPo-qVm4fHHQtR-eALUp64RqS9v2Lf6VEj2L8Qw/s1600/Validation-Default-Style.png" width="400" /></a></div>
<br />
<h3>
Validation styles</h3>
So far, so good. But now I wanted to extend my existing <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.textbox%28v=vs.110%29.aspx" target="_blank">TextBox</a> style. If the validation failed, I wanted to change the <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.control.background%28v=vs.110%29.aspx" target="_blank">Background</a> of the <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.textbox%28v=vs.110%29.aspx" target="_blank">TextBox</a>. This was one of my not working tries.<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"> <span style="color: blue;"><</span><span style="color: #a31515;">Style</span><span style="color: red;"> x</span><span style="color: blue;">:</span><span style="color: red;">Key</span><span style="color: blue;">=</span><span style="color: blue;">"MyWrongTextBoxStyle"</span>
<span style="color: red;"> TargetType</span><span style="color: blue;">="{</span><span style="color: #a31515;">x</span><span style="color: blue;">:</span><span style="color: #a31515;">Type</span><span style="color: red;"> TextBox</span><span style="color: blue;">}</span><span style="color: blue;">"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"Margin"</span>
<span style="color: red;"> Value</span><span style="color: blue;">=</span><span style="color: blue;">"4"</span><span style="color: blue;"> /></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"Foreground"</span>
<span style="color: red;"> Value</span><span style="color: blue;">=</span><span style="color: blue;">"DarkBlue"</span><span style="color: blue;"> /></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"Template"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter.Value</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">ControlTemplate</span><span style="color: red;"> TargetType</span><span style="color: blue;">="{</span><span style="color: #a31515;">x</span><span style="color: blue;">:</span><span style="color: #a31515;">Type</span><span style="color: red;"> TextBoxBase</span><span style="color: blue;">}</span><span style="color: blue;">"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Border</span><span style="color: red;"> Name</span><span style="color: blue;">=</span><span style="color: blue;">"Border"</span>
<span style="color: red;"> CornerRadius</span><span style="color: blue;">=</span><span style="color: blue;">"2"</span>
<span style="color: red;"> BorderThickness</span><span style="color: blue;">=</span><span style="color: blue;">"1"</span>
<span style="color: red;"> Background</span><span style="color: blue;">=</span><span style="color: blue;">"White"</span>
<span style="color: red;"> BorderBrush</span><span style="color: blue;">=</span><span style="color: blue;">"LightBlue"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">VisualStateManager.VisualStateGroups</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">VisualStateGroup</span><span style="color: red;"> x</span><span style="color: blue;">:</span><span style="color: red;">Name</span><span style="color: blue;">=</span><span style="color: blue;">"CommonStates"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">VisualState</span><span style="color: red;"> x</span><span style="color: blue;">:</span><span style="color: red;">Name</span><span style="color: blue;">=</span><span style="color: blue;">"Normal"</span><span style="color: blue;"> /></span>
<span style="color: blue;"><</span><span style="color: #a31515;">VisualState</span><span style="color: red;"> x</span><span style="color: blue;">:</span><span style="color: red;">Name</span><span style="color: blue;">=</span><span style="color: blue;">"Disabled"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Storyboard</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">ColorAnimationUsingKeyFrames</span>
<span style="color: red;"> Storyboard.TargetName</span><span style="color: blue;">=</span><span style="color: blue;">"Border"</span>
<span style="color: red;"> Storyboard.TargetProperty</span><span style="color: blue;">=</span>
<span style="color: blue;"> "(Panel.Background).</span>
<span style="color: blue;"> (SolidColorBrush.Color)"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">EasingColorKeyFrame</span>
<span style="color: red;"> KeyTime</span><span style="color: blue;">=</span><span style="color: blue;">"0"</span>
<span style="color: red;"> Value</span><span style="color: blue;">=</span><span style="color: blue;">"LightGray"</span><span style="color: blue;"> /></span>
<span style="color: blue;"></</span><span style="color: #a31515;">ColorAnimationUsingKeyFrames</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Storyboard</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">VisualState</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">VisualState</span><span style="color: red;"> x</span><span style="color: blue;">:</span><span style="color: red;">Name</span><span style="color: blue;">=</span><span style="color: blue;">"ReadOnly"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Storyboard</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">ColorAnimationUsingKeyFrames</span>
<span style="color: red;"> Storyboard.TargetName</span><span style="color: blue;">=</span><span style="color: blue;">"Border"</span>
<span style="color: red;"> Storyboard.TargetProperty</span><span style="color: blue;">=</span>
<span style="color: blue;"> "(Panel.Background).</span>
<span style="color: blue;"> (SolidColorBrush.Color)"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">EasingColorKeyFrame</span>
<span style="color: red;"> KeyTime</span><span style="color: blue;">=</span><span style="color: blue;">"0"</span>
<span style="color: red;"> Value</span><span style="color: blue;">=</span><span style="color: blue;">"LightBlue"</span><span style="color: blue;"> /></span>
<span style="color: blue;"></</span><span style="color: #a31515;">ColorAnimationUsingKeyFrames</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Storyboard</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">VisualState</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">VisualState</span><span style="color: red;"> x</span><span style="color: blue;">:</span><span style="color: red;">Name</span><span style="color: blue;">=</span><span style="color: blue;">"MouseOver"</span><span style="color: blue;"> /></span>
<span style="color: blue;"></</span><span style="color: #a31515;">VisualStateGroup</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">VisualStateManager.VisualStateGroups</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">ScrollViewer</span><span style="color: red;"> Margin</span><span style="color: blue;">=</span><span style="color: blue;">"0"</span>
<span style="color: red;"> x</span><span style="color: blue;">:</span><span style="color: red;">Name</span><span style="color: blue;">=</span><span style="color: blue;">"PART_ContentHost"</span><span style="color: blue;"> /></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Border</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">ControlTemplate</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Setter.Value</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Setter</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"Validation.ErrorTemplate"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter.Value</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">ControlTemplate</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">StackPanel</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">DockPanel</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">AdornedElementPlaceholder</span><span style="color: red;"> x</span><span style="color: blue;">:</span><span style="color: red;">Name</span><span style="color: blue;">=</span><span style="color: blue;">"Placeholder"</span><span style="color: blue;"> /></span>
<span style="color: blue;"><</span><span style="color: #a31515;">TextBlock</span><span style="color: red;"> Foreground</span><span style="color: blue;">=</span><span style="color: blue;">"Red"</span>
<span style="color: red;"> FontSize</span><span style="color: blue;">=</span><span style="color: blue;">"18"</span>
<span style="color: red;"> Text</span><span style="color: blue;">=</span><span style="color: blue;">"!"</span><span style="color: blue;"> /></span>
<span style="color: blue;"></</span><span style="color: #a31515;">DockPanel</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">StackPanel</span><span style="color: red;"> Orientation</span><span style="color: blue;">=</span><span style="color: blue;">"Horizontal"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">TextBlock</span><span style="color: red;"> Foreground</span><span style="color: blue;">=</span><span style="color: blue;">"Red"</span>
<span style="color: red;"> Text</span><span style="color: blue;">=</span><span style="color: blue;">"The value '"</span><span style="color: blue;"> /></span>
<span style="color: blue;"><</span><span style="color: #a31515;">TextBlock</span><span style="color: red;"> Foreground</span><span style="color: blue;">=</span><span style="color: blue;">"Red"</span>
<span style="color: red;"> Text</span><span style="color: blue;">="{</span><span style="color: #a31515;">Binding</span><span style="color: red;"> ElementName</span><span style="color: blue;">=</span><span style="color: blue;">Placeholder</span><span style="color: blue;">,</span>
<span style="color: red;"> Path</span><span style="color: blue;">=</span><span style="color: blue;">AdornedElement</span><span style="color: blue;">.</span><span style="color: blue;">Text</span><span style="color: blue;">}</span><span style="color: blue;">"</span><span style="color: blue;"> /></span>
<span style="color: blue;"><</span><span style="color: #a31515;">TextBlock</span><span style="color: red;"> Foreground</span><span style="color: blue;">=</span><span style="color: blue;">"Red"</span>
<span style="color: red;"> Text</span><span style="color: blue;">=</span><span style="color: blue;">"' causes an error (see tooltip)"</span><span style="color: blue;"> /></span>
<span style="color: blue;"></</span><span style="color: #a31515;">StackPanel</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">StackPanel</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">ControlTemplate</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Setter.Value</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Setter</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Style.Triggers</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Trigger</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"Validation.HasError"</span>
<span style="color: red;"> Value</span><span style="color: blue;">=</span><span style="color: blue;">"True"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"ToolTip"</span>
<span style="color: red;"> Value</span><span style="color: blue;">="{</span><span style="color: #a31515;">Binding</span><span style="color: red;"> RelativeSource</span><span style="color: blue;">=</span>
<span style="color: blue;">{</span><span style="color: #a31515;">x</span><span style="color: blue;">:</span><span style="color: #a31515;">Static</span><span style="color: red;"> RelativeSource</span><span style="color: blue;">.</span><span style="color: blue;">Self</span><span style="color: blue;">},</span>
<span style="color: red;"> Path</span><span style="color: blue;">=(</span><span style="color: blue;">Validation</span><span style="color: blue;">.</span><span style="color: blue;">Errors</span><span style="color: blue;">)</span><span style="color: blue;">.</span><span style="color: blue;">CurrentItem</span><span style="color: blue;">.</span><span style="color: blue;">ErrorContent</span><span style="color: blue;">}</span><span style="color: blue;">"</span><span style="color: blue;"> /></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"Background"</span>
<span style="color: red;"> Value</span><span style="color: blue;">=</span><span style="color: blue;">"Orange"</span><span style="color: blue;"> /></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"BorderThickness"</span>
<span style="color: red;"> Value</span><span style="color: blue;">=</span><span style="color: blue;">"2"</span><span style="color: blue;"> /></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"BorderBrush"</span>
<span style="color: red;"> Value</span><span style="color: blue;">=</span><span style="color: blue;">"Red"</span><span style="color: blue;"> /></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Trigger</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Style.Triggers</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Style</span><span style="color: blue;">></span></pre>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGr9Hr-69UFVFxkmm5n1iW5xL4IzTV6mPJiRdnMpV_udYtBLAxngOy7OQVNmXgO_KfAalRkvBYtK0mea8qPE1OZKJEKNDFz2iitq2XiSsnc7py6rwHVqsqROlbSiSVnt_j4hiZvF101Pw/s1600/Validation-erroneousStyle.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="37" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGr9Hr-69UFVFxkmm5n1iW5xL4IzTV6mPJiRdnMpV_udYtBLAxngOy7OQVNmXgO_KfAalRkvBYtK0mea8qPE1OZKJEKNDFz2iitq2XiSsnc7py6rwHVqsqROlbSiSVnt_j4hiZvF101Pw/s1600/Validation-erroneousStyle.png" width="400" /></a></div>
<br />
I tried several combinations with <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.validation.errortemplate%28v=vs.110%29.aspx" target="_blank">Validation.ErrorTemplate</a> and <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.validation.haserror%28v=vs.110%29.aspx" target="_blank">Validation.HasError</a>. But when should I use <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.validation.errortemplate%28v=vs.110%29.aspx" target="_blank">Validation.ErrorTemplate</a> and when <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.validation.haserror%28v=vs.110%29.aspx" target="_blank">Validation.HasError</a>? I have not thought much about it, until now. But the answer is not very surprising.<br />
<br />
<a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.validation.errortemplate%28v=vs.110%29.aspx" target="_blank">Validation.ErrorTemplate</a> is used to add elements that decorate an existing element. So I cannot use it to change the <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.control.background%28v=vs.110%29.aspx" target="_blank">Background</a> of an existing element. But it can be used to add an image, an exclamation mark, TextBlock or something else next to the evaluated element.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFuvMG413zPzIDB6WGe2brupZBnwY2VAD7YEsqDVwQID6UDNkKS5cyuZjWzorhsIBDF4guvAj7tYIlTiZivXZjLr48QzoSFJknPPzN6tEHseyHCKPPGJPuKeTzm35ulgd9jUhTxHnZahI/s1600/Validation-ErrorTemplate.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="22" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFuvMG413zPzIDB6WGe2brupZBnwY2VAD7YEsqDVwQID6UDNkKS5cyuZjWzorhsIBDF4guvAj7tYIlTiZivXZjLr48QzoSFJknPPzN6tEHseyHCKPPGJPuKeTzm35ulgd9jUhTxHnZahI/s1600/Validation-ErrorTemplate.png" width="400" /></a></div>
<br />
<a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.validation.haserror%28v=vs.110%29.aspx" target="_blank">Validation.HasError</a> can be used to add a ToolTip or to change properties of an existing element.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxZi5w6PsgCvsbiyeRc6hplCCzlRqnXb6mvWHkT9KQukPr4GGdAedTCxWt6gF6arTq88fiqssbb9wrOtyzliEB3snMM-eP4FhJXY5QKfItUCq6rj3DgcYPx6O2gAZ3rbfGbi0DvJqYoiI/s1600/Validation-HasError.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="40" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxZi5w6PsgCvsbiyeRc6hplCCzlRqnXb6mvWHkT9KQukPr4GGdAedTCxWt6gF6arTq88fiqssbb9wrOtyzliEB3snMM-eP4FhJXY5QKfItUCq6rj3DgcYPx6O2gAZ3rbfGbi0DvJqYoiI/s1600/Validation-HasError.png" width="400" /></a></div>
So I should use it to change the color of the <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.control.background%28v=vs.110%29.aspx" target="_blank">Background</a>. But why is it not working?<br />
<br />
The problem is how the <a href="http://msdn.microsoft.com/en-us/library/bb613570%28v=vs.110%29.aspx" target="_blank">Template style</a> is defined. If I remove the <a href="http://msdn.microsoft.com/en-us/library/system.windows.setter%28v=vs.110%29.aspx" target="_blank">Setter</a> of the <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.control.template%28v=vs.110%29.aspx" target="_blank">Template</a> property in the <a href="http://msdn.microsoft.com/en-us/library/system.windows.style%28v=vs.110%29.aspx" target="_blank">Style</a>, it is working. So I have to change the <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.control.template%28v=vs.110%29.aspx" target="_blank">Template</a>.<br />
<br />
<h3>
TemplateBinding</h3>
To allow changing a property of a defined <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.control.template%28v=vs.110%29.aspx" target="_blank">Template</a>, <a href="http://msdn.microsoft.com/en-us/library/system.windows.templatebindingextension%28v=vs.110%29.aspx" target="_blank">TemplateBinding</a> is used. <a href="http://msdn.microsoft.com/en-us/library/ms742882%28v=vs.110%29.aspx" target="_blank">TemplateBinding is a markup extension</a>. The properties that are set by <a href="http://msdn.microsoft.com/en-us/library/system.windows.templatebindingextension%28v=vs.110%29.aspx" target="_blank">TemplateBinding</a> in the <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.control.template%28v=vs.110%29.aspx" target="_blank">Template</a> <a href="http://msdn.microsoft.com/en-us/library/system.windows.setter%28v=vs.110%29.aspx" target="_blank">Setter</a> can be referrenced outside the <a href="http://msdn.microsoft.com/en-us/library/system.windows.setter%28v=vs.110%29.aspx" target="_blank">Setter</a> of the <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.control.template%28v=vs.110%29.aspx" target="_blank">Template</a>. The default property values of the properties that are set by <a href="http://msdn.microsoft.com/en-us/library/system.windows.templatebindingextension%28v=vs.110%29.aspx" target="_blank">TemplateBinding</a> can be set by other <a href="http://msdn.microsoft.com/en-us/library/system.windows.setter%28v=vs.110%29.aspx" target="_blank">Setter</a>s. It is also possible to set the values in <a href="http://xaml/" target="_blank">XAML</a> parts that are using the <a href="http://msdn.microsoft.com/en-us/library/system.windows.style%28v=vs.110%29.aspx" target="_blank">Style</a>. And now it is also possible to set the values by a <a href="http://msdn.microsoft.com/en-us/library/system.windows.trigger%28v=vs.110%29.aspx" target="_blank">Trigger</a>, like the <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.control.background%28v=vs.110%29.aspx" target="_blank">Background</a> as I wanted. This is the working code that changes the <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.control.background%28v=vs.110%29.aspx" target="_blank">Background</a> of a <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.textbox%28v=vs.110%29.aspx" target="_blank">TextBox</a> in case of error.<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"> <span style="color: blue;"><</span><span style="color: #a31515;">Style</span><span style="color: red;"> x</span><span style="color: blue;">:</span><span style="color: red;">Key</span><span style="color: blue;">=</span><span style="color: blue;">"MyTextBoxStyle"</span>
<span style="color: red;"> TargetType</span><span style="color: blue;">="{</span><span style="color: #a31515;">x</span><span style="color: blue;">:</span><span style="color: #a31515;">Type</span><span style="color: red;"> TextBox</span><span style="color: blue;">}</span><span style="color: blue;">"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"Margin"</span>
<span style="color: red;"> Value</span><span style="color: blue;">=</span><span style="color: blue;">"4"</span><span style="color: blue;"> /></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"Foreground"</span>
<span style="color: red;"> Value</span><span style="color: blue;">=</span><span style="color: blue;">"DarkBlue"</span><span style="color: blue;"> /></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"Background"</span>
<span style="color: red;"> Value</span><span style="color: blue;">=</span><span style="color: blue;">"White"</span><span style="color: blue;"> /></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"BorderBrush"</span>
<span style="color: red;"> Value</span><span style="color: blue;">=</span><span style="color: blue;">"LightBlue"</span><span style="color: blue;"> /></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"BorderThickness"</span>
<span style="color: red;"> Value</span><span style="color: blue;">=</span><span style="color: blue;">"1"</span><span style="color: blue;"> /></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"Template"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter.Value</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">ControlTemplate</span><span style="color: red;"> TargetType</span><span style="color: blue;">="{</span><span style="color: #a31515;">x</span><span style="color: blue;">:</span><span style="color: #a31515;">Type</span><span style="color: red;"> TextBoxBase</span><span style="color: blue;">}</span><span style="color: blue;">"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Border</span><span style="color: red;"> Name</span><span style="color: blue;">=</span><span style="color: blue;">"Border"</span>
<span style="color: red;"> CornerRadius</span><span style="color: blue;">=</span><span style="color: blue;">"2"</span>
<span style="color: red;"> BorderThickness</span><span style="color: blue;">="{</span><span style="color: #a31515;">TemplateBinding</span><span style="color: red;"> BorderThickness</span><span style="color: blue;">}</span><span style="color: blue;">"</span>
<span style="color: red;"> Background</span><span style="color: blue;">="{</span><span style="color: #a31515;">TemplateBinding</span><span style="color: red;"> Background</span><span style="color: blue;">}</span><span style="color: blue;">"</span>
<span style="color: red;"> BorderBrush</span><span style="color: blue;">="{</span><span style="color: #a31515;">TemplateBinding</span><span style="color: red;"> BorderBrush</span><span style="color: blue;">}</span><span style="color: blue;">"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">VisualStateManager.VisualStateGroups</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">VisualStateGroup</span><span style="color: red;"> x</span><span style="color: blue;">:</span><span style="color: red;">Name</span><span style="color: blue;">=</span><span style="color: blue;">"CommonStates"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">VisualState</span><span style="color: red;"> x</span><span style="color: blue;">:</span><span style="color: red;">Name</span><span style="color: blue;">=</span><span style="color: blue;">"Normal"</span><span style="color: blue;"> /></span>
<span style="color: blue;"><</span><span style="color: #a31515;">VisualState</span><span style="color: red;"> x</span><span style="color: blue;">:</span><span style="color: red;">Name</span><span style="color: blue;">=</span><span style="color: blue;">"Disabled"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Storyboard</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">ColorAnimationUsingKeyFrames</span>
<span style="color: red;"> Storyboard.TargetName</span><span style="color: blue;">=</span><span style="color: blue;">"Border"</span>
<span style="color: red;"> Storyboard.TargetProperty</span><span style="color: blue;">=</span>
<span style="color: blue;"> "(Panel.Background).</span>
<span style="color: blue;"> (SolidColorBrush.Color)"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">EasingColorKeyFrame</span>
<span style="color: red;"> KeyTime</span><span style="color: blue;">=</span><span style="color: blue;">"0"</span>
<span style="color: red;"> Value</span><span style="color: blue;">=</span><span style="color: blue;">"LightGray"</span><span style="color: blue;"> /></span>
<span style="color: blue;"></</span><span style="color: #a31515;">ColorAnimationUsingKeyFrames</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Storyboard</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">VisualState</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">VisualState</span><span style="color: red;"> x</span><span style="color: blue;">:</span><span style="color: red;">Name</span><span style="color: blue;">=</span><span style="color: blue;">"ReadOnly"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Storyboard</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">ColorAnimationUsingKeyFrames</span>
<span style="color: red;"> Storyboard.TargetName</span><span style="color: blue;">=</span><span style="color: blue;">"Border"</span>
<span style="color: red;"> Storyboard.TargetProperty</span><span style="color: blue;">=</span>
<span style="color: blue;"> "(Panel.Background).</span>
<span style="color: blue;"> (SolidColorBrush.Color)"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">EasingColorKeyFrame</span>
<span style="color: red;"> KeyTime</span><span style="color: blue;">=</span><span style="color: blue;">"0"</span>
<span style="color: red;"> Value</span><span style="color: blue;">=</span><span style="color: blue;">"LightBlue"</span><span style="color: blue;"> /></span>
<span style="color: blue;"></</span><span style="color: #a31515;">ColorAnimationUsingKeyFrames</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Storyboard</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">VisualState</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">VisualState</span><span style="color: red;"> x</span><span style="color: blue;">:</span><span style="color: red;">Name</span><span style="color: blue;">=</span><span style="color: blue;">"MouseOver"</span><span style="color: blue;"> /></span>
<span style="color: blue;"></</span><span style="color: #a31515;">VisualStateGroup</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">VisualStateManager.VisualStateGroups</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">ScrollViewer</span><span style="color: red;"> Margin</span><span style="color: blue;">=</span><span style="color: blue;">"0"</span>
<span style="color: red;"> x</span><span style="color: blue;">:</span><span style="color: red;">Name</span><span style="color: blue;">=</span><span style="color: blue;">"PART_ContentHost"</span><span style="color: blue;"> /></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Border</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">ControlTemplate</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Setter.Value</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Setter</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"Validation.ErrorTemplate"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter.Value</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">ControlTemplate</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">StackPanel</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">DockPanel</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">AdornedElementPlaceholder</span><span style="color: red;"> x</span><span style="color: blue;">:</span><span style="color: red;">Name</span><span style="color: blue;">=</span><span style="color: blue;">"Placeholder"</span><span style="color: blue;"> /></span>
<span style="color: blue;"><</span><span style="color: #a31515;">TextBlock</span><span style="color: red;"> Foreground</span><span style="color: blue;">=</span><span style="color: blue;">"Red"</span>
<span style="color: red;"> FontSize</span><span style="color: blue;">=</span><span style="color: blue;">"18"</span>
<span style="color: red;"> Text</span><span style="color: blue;">=</span><span style="color: blue;">"!"</span><span style="color: blue;"> /></span>
<span style="color: blue;"></</span><span style="color: #a31515;">DockPanel</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">StackPanel</span><span style="color: red;"> Orientation</span><span style="color: blue;">=</span><span style="color: blue;">"Horizontal"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">TextBlock</span><span style="color: red;"> Foreground</span><span style="color: blue;">=</span><span style="color: blue;">"Red"</span>
<span style="color: red;"> Text</span><span style="color: blue;">=</span><span style="color: blue;">"The value '"</span><span style="color: blue;"> /></span>
<span style="color: blue;"><</span><span style="color: #a31515;">TextBlock</span><span style="color: red;"> Foreground</span><span style="color: blue;">=</span><span style="color: blue;">"Red"</span>
<span style="color: red;"> Text</span><span style="color: blue;">="{</span><span style="color: #a31515;">Binding</span><span style="color: red;"> ElementName</span><span style="color: blue;">=</span><span style="color: blue;">Placeholder</span><span style="color: blue;">,</span>
<span style="color: red;"> Path</span><span style="color: blue;">=</span><span style="color: blue;">AdornedElement</span><span style="color: blue;">.</span><span style="color: blue;">Text</span><span style="color: blue;">}</span><span style="color: blue;">"</span><span style="color: blue;"> /></span>
<span style="color: blue;"><</span><span style="color: #a31515;">TextBlock</span><span style="color: red;"> Foreground</span><span style="color: blue;">=</span><span style="color: blue;">"Red"</span>
<span style="color: red;"> Text</span><span style="color: blue;">=</span><span style="color: blue;">"' causes an error (see tooltip)"</span><span style="color: blue;"> /></span>
<span style="color: blue;"></</span><span style="color: #a31515;">StackPanel</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">StackPanel</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">ControlTemplate</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Setter.Value</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Setter</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Style.Triggers</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Trigger</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"Validation.HasError"</span>
<span style="color: red;"> Value</span><span style="color: blue;">=</span><span style="color: blue;">"True"</span><span style="color: blue;">></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"ToolTip"</span>
<span style="color: red;"> Value</span><span style="color: blue;">="{</span><span style="color: #a31515;">Binding</span><span style="color: red;"> RelativeSource</span><span style="color: blue;">=</span>
<span style="color: blue;">{</span><span style="color: #a31515;">x</span><span style="color: blue;">:</span><span style="color: #a31515;">Static</span><span style="color: red;"> RelativeSource</span><span style="color: blue;">.</span><span style="color: blue;">Self</span><span style="color: blue;">},</span>
<span style="color: red;"> Path</span><span style="color: blue;">=(</span><span style="color: blue;">Validation</span><span style="color: blue;">.</span><span style="color: blue;">Errors</span><span style="color: blue;">).</span><span style="color: blue;">CurrentItem</span><span style="color: blue;">.</span><span style="color: blue;">ErrorContent</span><span style="color: blue;">}</span><span style="color: blue;">"</span><span style="color: blue;"> /></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"Background"</span>
<span style="color: red;"> Value</span><span style="color: blue;">=</span><span style="color: blue;">"Orange"</span><span style="color: blue;"> /></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"BorderThickness"</span>
<span style="color: red;"> Value</span><span style="color: blue;">=</span><span style="color: blue;">"2"</span><span style="color: blue;"> /></span>
<span style="color: blue;"><</span><span style="color: #a31515;">Setter</span><span style="color: red;"> Property</span><span style="color: blue;">=</span><span style="color: blue;">"BorderBrush"</span>
<span style="color: red;"> Value</span><span style="color: blue;">=</span><span style="color: blue;">"Red"</span><span style="color: blue;"> /></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Trigger</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Style.Triggers</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Style</span><span style="color: blue;">></span>
</pre>
And this is the result.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2oRYQTaTs_9WjrQ7qoovBbq9Io65487IG4LVZd28VYoBA2CUDEnmw0h8vRmOdCmoyaZU6tz0d6g8W4XUaMxMfDeYYWqgviHnYbCg6M_q6AUeVlMdpi2JD2XE1TBgciGb3Y9C1PKOxssQ/s1600/Validation-Style.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="38" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2oRYQTaTs_9WjrQ7qoovBbq9Io65487IG4LVZd28VYoBA2CUDEnmw0h8vRmOdCmoyaZU6tz0d6g8W4XUaMxMfDeYYWqgviHnYbCg6M_q6AUeVlMdpi2JD2XE1TBgciGb3Y9C1PKOxssQ/s1600/Validation-Style.png" width="400" /></a></div>
<br />
<br />Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-2359578464804578723.post-3647033865299911942015-05-13T00:37:00.001+02:002015-05-13T00:37:32.284+02:00Audino - Arduino MP3-Player (18) - PC-SoftwareDer Audino kann nun verwendet werden. Dazu werden auf der SD-Karte 10 Ordner mit den Namen 0, 1, 2, 3, 4, 5, 6, 7, 8 und 9 angelegt. In den Ordnern 1 bis 9 können nun MP3-Dateien kopiert werden. Die Dateinamen werden ebenfalls durchnummeriert (1.mp3, 2.mp3, 3.mp3, 4.mp3, ...). Die MP3-Dateien sollten dabei im Mono-Format vorliegen, da nur ein Kanal verwendet wird.<br />
<br />
Um das Kopieren zu erleichtern, habe ich eine PC-Software erstellt, mit der die Abspiellisten geplant und erzeugt werden können.<br />
<br />
Über "Select SD card" wird der Speicherort ausgewählt. dies sollte die SD-Karte sein. Wurden hier schon mit der PC-Software MP3-Tracks kopiert, so werden die gemachten Einträge ausgelesen, sodass diese bearbeitet werden können. Über "Copy to SD card" werden die MP3-Tracks auf die SD-Karte kopiert und umbenannt. Die MP3-Tracks sollten bereits im Mono-Format vorliegen. Mit "Reset" werden alle Einträge gelöscht.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGTLXr0dqxojlB9fHjRuNzgKVUEFPCid9OccmgkxCusJB678RX_mVSep0Gd4Q7nlCBLqaCs0WSPSkIiMO6OOvzenX_zBAK2G-vg5BKkkiidGXp8hASa793VNNkQSzLAUYRqywiby-Bo_k/s1600/2015-05-12+21_28_10-Audino.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGTLXr0dqxojlB9fHjRuNzgKVUEFPCid9OccmgkxCusJB678RX_mVSep0Gd4Q7nlCBLqaCs0WSPSkIiMO6OOvzenX_zBAK2G-vg5BKkkiidGXp8hASa793VNNkQSzLAUYRqywiby-Bo_k/s640/2015-05-12+21_28_10-Audino.png" width="425" /></a></div>
<br />
In der Übersicht werden die 9 Knöpfe angezeigt. In den eckigen Klammern steht die Anzahl der Tracks gefolgt von der Spieldauer. Unten links steht die Gesamtanzahl der Tracks und die Gesamtspieldauer. Drückt man auf einen der 9 Knöpfe, kommt man in die Ansicht der hinzugefügten MP3-Tracks. Hier können weitere Tracks hinzugefügt oder wieder rausgelöscht werden.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfKcXX7A7u74BnwxR5CoAjKLThs_m8y7exf3hKS3xYdhEX-PPIsxfOAWAv-oKhE6jFw2BQCdJWCOSy_JSrJoWLNjjcNjFVKOuaqstjyT-1fCg8hIs6i1rvox_3f6WLIMdwvwyGWn3PrQc/s1600/2015-05-12+22_09_37-Audino.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfKcXX7A7u74BnwxR5CoAjKLThs_m8y7exf3hKS3xYdhEX-PPIsxfOAWAv-oKhE6jFw2BQCdJWCOSy_JSrJoWLNjjcNjFVKOuaqstjyT-1fCg8hIs6i1rvox_3f6WLIMdwvwyGWn3PrQc/s640/2015-05-12+22_09_37-Audino.png" width="427" /></a></div>
<br />
Bei Interesse kann ich die PC-Software gerne zur Verfügung stellen.<br />
<br />
Damit wäre das Projekt "Audino" nun endgültig abgeschlossen<br />
<br />
<br />
<h4>
Weitere Blogeinträge</h4>
<ol>
<li><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-1-auswahl-der.html"><b>Auswahl der Komponenten</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-2-das.html" target="_blank">Das Entwicklungsbrett</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-3-das-erste.html" target="_blank">Das erste Einschalten</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-4-die.html" target="_blank">Die Entwicklungsumgebung</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-5-knopfe.html" target="_blank">Knöpfe (digital)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-6-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (digital)</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-7-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (analog)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-8-potentiometer.html">Potentiometer</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-9-mp3-shield.html">Das MP3 Shield</a></b></li>
<li><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-10-auswahl-der.html"><b>Auswahl der Komponenten 2</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-11-auswahl-der.html">Auswahl der Komponenten (Zusammenfassung)</a> </b></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-12-punkt.html"><b>Punkt-Streifenrasterplatine und Knöpfe</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-13-punkt.html"><b>Punkt-Streifenrasterplatine und weitere Komponenten</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-14-das-gehause.html"><b>Das Gehäuse</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-15-sketch-1-setup.html"><b>Sketch 1 (setup-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/03/arduino-mp3-player-16-sketch-2-loop.html"><b>Sketch 2 (loop-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/04/arduino-mp3-player-17-sketch-3-der.html"><b>Sketch 3 (Der komplette Code)</b></a></li>
<li><b>PC-Software</b></li>
</ol>
<br />Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-2359578464804578723.post-62641185608829420912015-04-04T00:02:00.000+02:002015-05-13T00:41:06.479+02:00Audino - Arduino MP3-Player (17) - Sketch 3 (Der komplette Code)Nachdem die letzten beiden Beiträge den Sketch behandelt und ausführlich erklärt haben, ist hier nochmal der ganze Quellcode dargestellt, der auf das Arduino-Board gespielt wird.
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: blue;">#include</span> <span style="color: #a31515;"><SPI.h></span>
<span style="color: blue;">#include</span> <span style="color: #a31515;"><Adafruit_VS1053.h></span>
<span style="color: blue;">#include</span> <span style="color: #a31515;"><SD.h></span>
<span style="color: blue;">#define</span> <span style="color: #6f008a;">SHIELD_CS</span> 7 <span style="color: green;">// VS1053 chip select pin (output)</span>
<span style="color: blue;">#define</span> <span style="color: #6f008a;">SHIELD_DCS</span> 6 <span style="color: green;">// VS1053 Data/command select pin (output)</span>
<span style="color: blue;">#define</span> <span style="color: #6f008a;">DREQ</span> 3 <span style="color: green;">// VS1053 Data request, ideally an Interrupt pin</span>
<span style="color: blue;">#define</span> <span style="color: #6f008a;">CARDCS</span> 4 <span style="color: green;">// Card chip select pin</span>
<span style="color: #2b91af;">Adafruit_VS1053_FilePlayer</span> musicPlayer =
<span style="color: #2b91af;">Adafruit_VS1053_FilePlayer</span>(<span style="color: #6f008a;">SHIELD_CS</span>, <span style="color: #6f008a;">SHIELD_DCS</span>, <span style="color: #6f008a;">DREQ</span>, <span style="color: #6f008a;">CARDCS</span>);
<span style="color: green;">// VS1053 play speed parameter</span>
<span style="color: blue;">#define</span> <span style="color: #6f008a;">para_playSpeed</span> 0x1E04
<span style="color: green;">// constants won't change</span>
<span style="color: green;">// the number of the pin that is used for the pushbuttons</span>
<span style="color: blue;">const</span> <span style="color: blue;">int</span> buttonsPin = A0;
<span style="color: green;">// the pin of the potentiometer that is used to control the volume</span>
<span style="color: blue;">const</span> <span style="color: blue;">int</span> volumePin = A1;
<span style="color: green;">// wait before next click is recognized</span>
<span style="color: blue;">const</span> <span style="color: blue;">int</span> buttonPressedDelay = 1000;
<span style="color: green;">// variables will change</span>
<span style="color: #2b91af;">byte</span> currentFolder = 1;
<span style="color: blue;">unsigned</span> <span style="color: blue;">int</span> currentFile = 0;
<span style="color: blue;">unsigned</span> <span style="color: blue;">int</span> numberOfFiles[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
<span style="color: green;">// the current volume level, set to min at start</span>
<span style="color: #2b91af;">byte</span> volumeState = 254;
<span style="color: green;">// last button that was pressed</span>
<span style="color: #2b91af;">byte</span> lastPressedButton = 0;
<span style="color: green;">// is the last pressed button released</span>
<span style="color: #2b91af;">boolean</span> released = <span style="color: #6f008a;">true</span>;
<span style="color: green;">// remember if the back button was pressed last time</span>
<span style="color: #2b91af;">byte</span> lastReleasedButton = 0;
<span style="color: green;">// the time at the back button was pressed last time</span>
<span style="color: blue;">long</span> lastBackButtonTime = 0;
<span style="color: blue;">char</span> currentTrackFileName[] = <span style="color: #a31515;">"/0/current.txt"</span>;
<span style="color: green;">// the setup routine runs once when you turn the device on or you press reset</span>
<span style="color: blue;">void</span> setup()
{
<span style="color: green;">// disable LED L</span>
pinMode(13, <span style="color: #6f008a;">OUTPUT</span>);
digitalWrite(13, <span style="color: #6f008a;">LOW</span>);
<span style="color: green;">// initialize serial communication at 9600 bits per second</span>
<span style="color: green;">//Serial.begin(9600);</span>
<span style="color: green;">// initialise the music player</span>
<span style="color: blue;">if</span> (!musicPlayer.begin())
{
<span style="color: green;">//Serial.println("VS1053 not found");</span>
<span style="color: blue;">while</span> (1); <span style="color: green;">// don't do anything more</span>
}
<span style="color: green;">// initialise the SD card</span>
SD.begin(<span style="color: #6f008a;">CARDCS</span>);
<span style="color: green;">// If DREQ is on an interrupt pin (on uno, #2 or #3) we can do background</span>
<span style="color: green;">// audio playing</span>
musicPlayer.useInterrupt(<span style="color: #6f008a;">VS1053_FILEPLAYER_PIN_INT</span>); <span style="color: green;">// DREQ int</span>
musicPlayer.sineTest(0x44, 100); <span style="color: green;">// Make a tone to indicate VS1053 is working </span>
<span style="color: green;">// read the number of tracks in each folder</span>
<span style="color: blue;">for</span> (<span style="color: #2b91af;">byte</span> i = 0; i < 10; i++)
{
<span style="color: #2b91af;">String</span> temp = <span style="color: #a31515;">"/"</span>;
temp.concat(i);
<span style="color: blue;">char</span> filename[3];
temp.toCharArray(filename, <span style="color: blue;">sizeof</span>(filename));
numberOfFiles[i] = countFiles(SD.open(filename));
<span style="color: green;">//Serial.print(filename);</span>
<span style="color: green;">//Serial.print(": ");</span>
<span style="color: green;">//Serial.println(numberOfFiles[i]);</span>
}
<span style="color: green;">// read remembered track</span>
<span style="color: blue;">if</span> (SD.exists(currentTrackFileName))
{
<span style="color: #2b91af;">File</span> file = SD.open(currentTrackFileName, <span style="color: #6f008a;">FILE_READ</span>);
<span style="color: blue;">if</span> (file)
{
currentFolder = file.readStringUntil(<span style="color: #a31515;">'\n'</span>).toInt();
currentFile = file.readStringUntil(<span style="color: #a31515;">'\n'</span>).toInt() - 1;
}
file.close();
}
delay(100); <span style="color: green;">// init delay</span>
}
<span style="color: green;">// counts the number of files in directory</span>
<span style="color: blue;">unsigned</span> <span style="color: blue;">int</span> countFiles(<span style="color: #2b91af;">File</span> <span style="color: grey;">dir</span>)
{
<span style="color: blue;">unsigned</span> <span style="color: blue;">int</span> counter = 0;
<span style="color: blue;">while</span> (<span style="color: #6f008a;">true</span>)
{
<span style="color: #2b91af;">File</span> entry = <span style="color: grey;">dir</span>.openNextFile();
<span style="color: blue;">if</span> (!entry)
{
<span style="color: green;">// no more files</span>
<span style="color: blue;">break</span>;
}
counter++;
entry.close();
}
<span style="color: grey;">dir</span>.close();
<span style="color: blue;">return</span> counter;
}
<span style="color: green;">// the loop routine runs over and over again forever</span>
<span style="color: blue;">void</span> loop()
{
<span style="color: green;">// play next song if player stopped</span>
<span style="color: blue;">if</span> (musicPlayer.stopped())
{
playNext();
}
<span style="color: green;">// check the volume and set it</span>
checkVolume();
<span style="color: green;">// check if a button is pressed and perform some action</span>
checkButtons();
delay(1); <span style="color: green;">// delay in between reads for stability</span>
}
<span style="color: green;">// checks the value of the potentiometer</span>
<span style="color: green;">// if it has changed by 2 then set the new volume</span>
<span style="color: blue;">void</span> checkVolume()
{
<span style="color: green;">// read the state of the volume potentiometer</span>
<span style="color: blue;">int</span> read = analogRead(volumePin);
<span style="color: green;">// set the range of the volume from max=0 to min=254</span>
<span style="color: green;">// (limit max volume to 20 and min to 60) </span>
<span style="color: #2b91af;">byte</span> state = map(read, 0, 1023, 20, 60);
<span style="color: green;">// recognize state (volume) changes in steps of two</span>
<span style="color: blue;">if</span> (state < volumeState - 1 || state > volumeState + 1)
{
<span style="color: green;">// remember the new volume state</span>
volumeState = state;
<span style="color: green;">// set volume max=0, min=254</span>
musicPlayer.setVolume(volumeState, 254);
<span style="color: green;">// print out the state of the volume</span>
<span style="color: green;">//Serial.print(volumePin);</span>
<span style="color: green;">//Serial.print(" volume ");</span>
<span style="color: green;">//Serial.println(volumeState);</span>
}
}
<span style="color: green;">// check if some button is pressed</span>
<span style="color: green;">// play first track, if button is not pressed last time</span>
<span style="color: green;">// play next track, if a button is pressed again</span>
<span style="color: blue;">void</span> checkButtons()
{
<span style="color: green;">// get the pressed button</span>
<span style="color: #2b91af;">byte</span> pressedButton = getPressedButton();
<span style="color: green;">// if a button is pressed</span>
<span style="color: blue;">if</span> (pressedButton != 0)
{
<span style="color: green;">//Serial.print("Taste: ");</span>
<span style="color: green;">//Serial.println(pressedButton);</span>
<span style="color: green;">// if a track/play list button is pressed</span>
<span style="color: blue;">if</span> (pressedButton < 10 && released)
{
musicPlayer.stopPlaying();
<span style="color: blue;">if</span> (currentFolder == pressedButton)
{
playNext();
}
<span style="color: blue;">else</span>
{
currentFolder = pressedButton;
currentFile = 1;
playCurrent();
}
}
<span style="color: green;">// if a function button is pressed</span>
<span style="color: blue;">else</span>
{
<span style="color: blue;">if</span> (pressedButton == 10 && released)
{
musicPlayer.stopPlaying();
<span style="color: blue;">long</span> time = millis();
<span style="color: green;">// this is the second press within 1 sec., so we </span>
<span style="color: green;">// got to the previous track</span>
<span style="color: blue;">if</span> (lastReleasedButton == 10 &&
((time - lastBackButtonTime) < buttonPressedDelay))
{
playPrevious();
}
<span style="color: blue;">else</span>
{
playCurrent();
}
lastBackButtonTime = time;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (pressedButton == 11 && released)
{
<span style="color: green;">// increase play speed</span>
musicPlayer.sciWrite(<span style="color: #6f008a;">VS1053_REG_WRAMADDR</span>, <span style="color: #6f008a;">para_playSpeed</span>);
musicPlayer.sciWrite(<span style="color: #6f008a;">VS1053_REG_WRAM</span>, 3);
<span style="color: green;">//Serial.println("increase speed");</span>
}
}
released = <span style="color: #6f008a;">false</span>;
lastReleasedButton = pressedButton;
}
<span style="color: blue;">else</span>
{
released = <span style="color: #6f008a;">true</span>;
<span style="color: green;">// reset play speed</span>
<span style="color: blue;">if</span> (lastPressedButton == 11)
{
musicPlayer.sciWrite(<span style="color: #6f008a;">VS1053_REG_WRAMADDR</span>, <span style="color: #6f008a;">para_playSpeed</span>);
musicPlayer.sciWrite(<span style="color: #6f008a;">VS1053_REG_WRAM</span>, 1);
}
}
<span style="color: green;">// remember pressed button</span>
lastPressedButton = pressedButton;
}
<span style="color: blue;">void</span> playPrevious()
{
currentFile--;
<span style="color: blue;">if</span> (currentFile < 1)
{
currentFile = numberOfFiles[currentFolder];
}
playCurrent();
}
<span style="color: blue;">void</span> playNext()
{
currentFile++;
<span style="color: blue;">if</span> (currentFile > numberOfFiles[currentFolder])
{
currentFile = 1;
}
playCurrent();
}
<span style="color: blue;">void</span> playCurrent()
{
<span style="color: blue;">if</span> (numberOfFiles[currentFolder] > 0)
{
rememberCurrentTrack();
<span style="color: #2b91af;">String</span> temp = <span style="color: #a31515;">"/"</span>;
temp.concat(currentFolder);
temp.concat(<span style="color: #a31515;">"/"</span>);
temp.concat(currentFile);
temp.concat(<span style="color: #a31515;">".mp3"</span>);
<span style="color: blue;">char</span> filename[temp.length() + 1];
temp.toCharArray(filename, <span style="color: blue;">sizeof</span>(filename));
musicPlayer.startPlayingFile(filename);
<span style="color: green;">//Serial.print("Play ");</span>
<span style="color: green;">//Serial.println(filename);</span>
}
}
<span style="color: blue;">void</span> rememberCurrentTrack()
{
<span style="color: blue;">if</span> (SD.exists(currentTrackFileName))
{
SD.remove(currentTrackFileName);
}
<span style="color: #2b91af;">File</span> file = SD.open(currentTrackFileName, <span style="color: #6f008a;">FILE_WRITE</span>);
<span style="color: blue;">if</span> (file)
{
file.println(currentFolder);
file.println(currentFile);
}
file.close();
}
<span style="color: green;">// returns 0 if no button is pressed,</span>
<span style="color: green;">// else the number of the pressed button is returned (1 - 11)</span>
<span style="color: #2b91af;">byte</span> getPressedButton()
{
<span style="color: blue;">int</span> buttonsPinValue = analogRead(buttonsPin);
<span style="color: #2b91af;">byte</span> pressedButton = 0;
<span style="color: blue;">if</span> (buttonsPinValue > 823)
{
<span style="color: green;">// button 6 has a value of about 878</span>
pressedButton = 6;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 725)
{
<span style="color: green;">// button 5 has a value of about 768</span>
pressedButton = 5;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 649)
{
<span style="color: green;">// button 4 has a value of about 683</span>
pressedButton = 4;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 586)
{
<span style="color: green;">// button 3 has a value of about 614</span>
pressedButton = 3;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 535)
{
<span style="color: green;">// button 2 has a value of about 559</span>
pressedButton = 2;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 492)
{
<span style="color: green;">// button 1 has a value of about 512</span>
pressedButton = 1;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 450)
{
<span style="color: green;">// if no button is pressed the value is of about 473</span>
pressedButton = 0;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 400)
{
<span style="color: green;">// button 8 has a value of about 427</span>
pressedButton = 11;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 340)
{
<span style="color: green;">// button 10 has a value of about 372</span>
pressedButton = 10;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 267)
{
<span style="color: green;">// button 9 has a value of about 307</span>
pressedButton = 9;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 178)
{
<span style="color: green;">// button 8 has a value of about 228</span>
pressedButton = 8;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 0)
{
<span style="color: green;">// button 7 has a value of about 128</span>
pressedButton = 7;
}
<span style="color: blue;">return</span> pressedButton;
}
</pre>
<br />
<br />
Damit wäre das Projekt "Arduino MP3-Player" abgeschlossen. Die SD-Karte
kann mit Tracks entsprechend der vorgesehenen Struktur befüllt werden,
die dann über den Arduino abgespielt werden können. Allerdings kann das
Befüllen und das Verwalten der Tracks noch über eine PC-Software
vereinfacht werden. Näheres dazu aber das nächste Mal.<br />
<br />
<br />
<br />
<h4>
Weitere Blogeinträge</h4>
<ol>
<li><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-1-auswahl-der.html"><b>Auswahl der Komponenten</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-2-das.html" target="_blank">Das Entwicklungsbrett</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-3-das-erste.html" target="_blank">Das erste Einschalten</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-4-die.html" target="_blank">Die Entwicklungsumgebung</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-5-knopfe.html" target="_blank">Knöpfe (digital)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-6-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (digital)</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-7-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (analog)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-8-potentiometer.html">Potentiometer</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-9-mp3-shield.html">Das MP3 Shield</a></b></li>
<li><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-10-auswahl-der.html"><b>Auswahl der Komponenten 2</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-11-auswahl-der.html">Auswahl der Komponenten (Zusammenfassung)</a> </b></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-12-punkt.html"><b>Punkt-Streifenrasterplatine und Knöpfe</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-13-punkt.html"><b>Punkt-Streifenrasterplatine und weitere Komponenten</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-14-das-gehause.html"><b>Das Gehäuse</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-15-sketch-1-setup.html"><b>Sketch 1 (setup-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/03/arduino-mp3-player-16-sketch-2-loop.html"><b>Sketch 2 (loop-Methode)</b></a></li>
<li><b>Sketch 3 (Der komplette Code)</b></li>
<li><a href="http://chrigas.blogspot.com/2015/05/audino-arduino-mp3-player-18-pc-software.html"><b>PC-Software</b></a></li>
</ol>
<br />
<br />
Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-2359578464804578723.post-52252249374795984822015-03-31T23:57:00.000+02:002015-05-13T00:43:10.373+02:00Audino - Arduino MP3-Player (16) - Sketch 2 (loop-Methode)Nachdem wir uns das letzte Mal die setup() Methode angeschaut haben, schauen wir uns jetzt die loop() Methode an.<br />
<br />
In der loop() Methode wird zuerst überprüft, ob gerade ein Track abgespielt wird. Ist das nicht der Fall, wird der nächste Track abgespielt.<br />
<br />
Beim Einschalten des Geräts wird auch kein Track abgespielt. Da der zuletzt abgespielte Track wiedergegeben werden soll (und nicht der Nächste), wurde in der setup() Methode der Index auf den Vorgänger gesetzt.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: green;">// play next song if player stopped</span>
<span style="color: blue;">if</span> (musicPlayer.stopped())
{
playNext();
}</pre>
<br />
In der playNext() Methode wird der Index für den aktuellen Track um eins hochgezählt. Ist der Index größer als die Anzahl der Tracks im aktuellen Ordner, wird der Index auf den ersten Track gesetzt. Anschließend wird die playCurrent() Methode aufgerufen.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: blue;">void</span> playNext()
{
currentFile++;
<span style="color: blue;">if</span> (currentFile > numberOfFiles[currentFolder])
{
currentFile = 1;
}
playCurrent();
}</pre>
<br />
In der playCurrent() Methode wird überprüft, ob der aktuell ausgewählte Ordner überhaupt Tracks beinhaltet - nur dann wird fortgefahren. Anschließend wird abgespeichert welcher nun der aktuelle Track ist (rememberCurrentTrack() Methode), ehe der aktuelle Track-Name aus currentFolder und currentFile zusammengesetzt und abgespielt wird.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: blue;">void</span> playCurrent()
{
<span style="color: blue;">if</span> (numberOfFiles[currentFolder] > 0)
{
rememberCurrentTrack();
<span style="color: #2b91af;">String</span> temp = <span style="color: #a31515;">"/"</span>;
temp.concat(currentFolder);
temp.concat(<span style="color: #a31515;">"/"</span>);
temp.concat(currentFile);
temp.concat(<span style="color: #a31515;">".mp3"</span>);
<span style="color: blue;">char</span> filename[temp.length() + 1];
temp.toCharArray(filename, <span style="color: blue;">sizeof</span>(filename));
musicPlayer.startPlayingFile(filename);
Serial.print(<span style="color: #a31515;">"Play "</span>);
Serial.println(filename);
}
}</pre>
<br />
In der rememberCurrentTrack() Methode wird in einer Datei auf der SD-Karte currentFolder und currentFile abgespeichert. Dabei wird die Datei zuvor gelöscht, falls die Datei bereits existiert.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: blue;">void</span> rememberCurrentTrack()
{
<span style="color: blue;">if</span> (SD.exists(currentTrackFileName))
{
SD.remove(currentTrackFileName);
}
<span style="color: #2b91af;">File</span> file = SD.open(currentTrackFileName, <span style="color: #6f008a;">FILE_WRITE</span>);
<span style="color: blue;">if</span> (file)
{
file.println(currentFolder);
file.println(currentFile);
}
file.close();
}</pre>
<br />
Als nächstes wird in der loop() Methode überprüft, ob die Lautstärke geändert werden soll. Dazu wird die checkVolume() Methode aufgerufen, in der als erstes der aktuelle Wert des Potentiometers abgerufen wird. Der ausgelesene Wert wird auf den Lautstärkebereich übertragen. Falls eine Änderung um 2 stattgefunden hat, wird der neue Wert gesetzt.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: green;">// the pin of the potentiometer that is used to control the volume</span>
<span style="color: blue;">const</span> <span style="color: blue;">int</span> volumePin = A1;</pre>
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"></pre>
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: green;">// the current volume level, set to min at start</span>
<span style="color: #2b91af;">byte</span> volumeState = 254;
</pre>
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: green;">// checks the value of the potentiometer</span>
<span style="color: green;">// if it has changed by 2 then set the new volume</span>
<span style="color: blue;">void</span> checkVolume()
{
<span style="color: green;">// read the state of the volume potentiometer</span>
<span style="color: blue;">int</span> read = analogRead(volumePin);
<span style="color: green;">// set the range of the volume from max=0 (limit max volume to 20) to min=254 </span>
<span style="color: #2b91af;">byte</span> state = map(read, 0, 1023, 20, 60);
<span style="color: green;">// recognize state (volume) changes in steps of two</span>
<span style="color: blue;">if</span> (state < volumeState - 1 || state > volumeState + 1)
{
<span style="color: green;">// remember the new volume state</span>
volumeState = state;
<span style="color: green;">// set volume max=0, min=254</span>
musicPlayer.setVolume(volumeState, 254);
<span style="color: green;">// print out the state of the volume</span>
Serial.print(volumePin);
Serial.print(<span style="color: #a31515;">" volume "</span>);
Serial.println(volumeState);
}
}</pre>
<br />
Schließlich wird in der loop() Methode überprüft, ob ein Knopf gedrückt worden ist und gegebenenfalls eine entsprechende Aktion ausgeführt. Dazu wird die checkButtons() Methode aufgerufen. In dieser wird als erstes über getPressedButton() ermittelt, ob ein Knopf gedrückt worden ist und wenn ja welcher.<br />
<br />
Ist ein Knopf gedrückt worden, wird überprüft ob der Knopf einem Track / einer Play List entspricht oder einem Funktionsknopf. Dabei wird nur eine Aktion ausgeführt, wenn zuvor kein Knopf (released=true) gedrückt worden war. Anschließend wird released=false gesetzt.<br />
<br />
Handelt es sich um einen Track/Play List Knopf, wird der aktuelle Track angehalten. War der zuvor abgespielte Track schon in dem Ordner, dem der gedrückte Knopf entspricht, wird der nächste Track abgespielt. War der zuvor abgespielte Track nicht in dem Ordner, dem der gedrückte Knopf entspricht, wird der aktuelle Ordner gesetzt und der erste Track abgespielt.<br />
<br />
Handelt es sich um einen Funktions-Knopf, wird überprüft um welchen es sich handelt. Beim Zurück-Knopf wird der aktuelle Track angehalten. Schließlich wird überprüft, ob der Zurück-Knopf wiederholt innerhalb einer Sekunde gedrückt worden ist oder ob der Zurück-Knopf das erste Mal gedrückt worden ist. Ist der Zurück-Knopf das erste Mal gedrückt worden, wird der zuletzt gespielte Track von Vorne abgespielt. Ist der Zurück-Knopf wiederholt innerhalb einer Sekunde gedrückt worden, wird die Methode playPrevious() aufgerufen. Beim Suchvorlauf-Knopf wird die Geschwindigkeit mit der der Track abgespielt wird erhöht.<br />
<br />
Ist kein Knopf gedrückt worden, wird released=true gesetzt.Wurde zuletzt der Suchvorlauf-Knopf verwendet, wird die Abspielgewchwindigkeit wieder zurückgesetzt.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: green;">// wait before next click is recognized</span>
<span style="color: blue;">const</span> <span style="color: blue;">int</span> buttonPressedDelay = 3000;</pre>
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: green;">// last button that was pressed</span>
<span style="color: #2b91af;">byte</span> lastPressedButton = 0;
<span style="color: green;">// is the last pressed button released</span>
<span style="color: #2b91af;">boolean</span> released = <span style="color: #6f008a;">true</span>;
<span style="color: green;">// remember if the back button was pressed last time</span>
<span style="color: #2b91af;">byte</span> lastReleasedButton = 0;
<span style="color: green;">// the time at the back button was pressed last time</span>
<span style="color: blue;">long</span> lastBackButtonTime = 0;
</pre>
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"></pre>
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: green;">// VS1053 play speed parameter</span>
<span style="color: blue;">#define</span> <span style="color: #6f008a;">para_playSpeed</span> 0x1E04</pre>
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"> </pre>
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"></pre>
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: green;">/</span><span style="color: green;">// check if some button is pressed</span>
<span style="color: green;">// play first track, if button is not pressed last time</span>
<span style="color: green;">// play next track, if a button is pressed again</span>
<span style="color: blue;">void</span> checkButtons()
{
<span style="color: green;">// get the pressed button</span>
<span style="color: #2b91af;">byte</span> pressedButton = getPressedButton();
<span style="color: green;">// if a button is pressed</span>
<span style="color: blue;">if</span> (pressedButton != 0)
{
<span style="color: green;">//Serial.print("Taste: ");</span>
<span style="color: green;">//Serial.println(pressedButton);</span>
<span style="color: green;">// if a track/play list button is pressed</span>
<span style="color: blue;">if</span> (pressedButton < 10 && released)
{
musicPlayer.stopPlaying();
<span style="color: blue;">if</span> (currentFolder == pressedButton)
{
playNext();
}
<span style="color: blue;">else</span>
{
currentFolder = pressedButton;
currentFile = 1;
playCurrent();
}
}
<span style="color: green;">// if a function button is pressed</span>
<span style="color: blue;">else</span>
{
<span style="color: blue;">if</span> (pressedButton == 10 && released)
{
musicPlayer.stopPlaying();
<span style="color: blue;">long</span> time = millis();
<span style="color: green;">// this is the second press within 1 sec., so we </span>
<span style="color: green;">// got to the previous track</span>
<span style="color: blue;">if</span> (lastReleasedButton == 10 &&
((time - lastBackButtonTime) < buttonPressedDelay))
{
playPrevious();
}
<span style="color: blue;">else</span>
{
playCurrent();
}
lastBackButtonTime = time;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (pressedButton == 11 && released)
{
<span style="color: green;">// increase play speed</span>
musicPlayer.sciWrite(<span style="color: #6f008a;">VS1053_REG_WRAMADDR</span>, <span style="color: #6f008a;">para_playSpeed</span>);
musicPlayer.sciWrite(<span style="color: #6f008a;">VS1053_REG_WRAM</span>, 3);
<span style="color: green;">//Serial.println("increase speed");</span>
}
}
released = <span style="color: #6f008a;">false</span>;
lastReleasedButton = pressedButton;
}
<span style="color: blue;">else</span>
{
released = <span style="color: #6f008a;">true</span>;
<span style="color: green;">// reset play speed</span>
<span style="color: blue;">if</span> (lastPressedButton == 11)
{
musicPlayer.sciWrite(<span style="color: #6f008a;">VS1053_REG_WRAMADDR</span>, <span style="color: #6f008a;">para_playSpeed</span>);
musicPlayer.sciWrite(<span style="color: #6f008a;">VS1053_REG_WRAM</span>, 1);
}
}
<span style="color: green;">// remember pressed button</span>
lastPressedButton = pressedButton;
}</pre>
<br />
Der gedrückte Knopf wird über den Code aus <a href="http://chrigas.blogspot.de/2014/12/arduino-mp3-player-7-mehrere-knopfe.html">Mehrere Knöpfe (analog)</a> ermittelt.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: green;">// the number of the pin that is used for the pushbuttons</span>
<span style="color: blue;">const</span> <span style="color: blue;">int</span> buttonsPin = A0;</pre>
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: green;">// returns 0 if no button is pressed,</span>
<span style="color: green;">// else the number of the pressed button is returned (1 - 11)</span>
byte getPressedButton()
{
<span style="color: blue;">int</span> buttonsPinValue = analogRead(buttonsPin);
byte pressedButton = 0;
<span style="color: blue;">if</span> (buttonsPinValue > 823)
{
<span style="color: green;">// button 6 has a value of about 878</span>
pressedButton = 6;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 725)
{
<span style="color: green;">// button 5 has a value of about 768</span>
pressedButton = 5;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 649)
{
<span style="color: green;">// button 4 has a value of about 683</span>
pressedButton = 4;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 586)
{
<span style="color: green;">// button 3 has a value of about 614</span>
pressedButton = 3;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 535)
{
<span style="color: green;">// button 2 has a value of about 559</span>
pressedButton = 2;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 492)
{
<span style="color: green;">// button 1 has a value of about 512</span>
pressedButton = 1;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 450)
{
<span style="color: green;">// if no button is pressed the value is of about 473</span>
pressedButton = 0;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 400)
{
<span style="color: green;">// button 8 has a value of about 427</span>
pressedButton = 11;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 340)
{
<span style="color: green;">// button 10 has a value of about 372</span>
pressedButton = 10;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 267)
{
<span style="color: green;">// button 9 has a value of about 307</span>
pressedButton = 9;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 178)
{
<span style="color: green;">// button 8 has a value of about 228</span>
pressedButton = 8;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 0)
{
<span style="color: green;">// button 7 has a value of about 128</span>
pressedButton = 7;
}
<span style="color: blue;">return</span> pressedButton;
}</pre>
<br />
In der playPrevious() Methode wird der Index für den aktuellen Track um eins runtergezählt. Ist der Index kleiner als 1, wird der Index auf den letzten Track gesetzt.
Anschließend wird die playCurrent() Methode aufgerufen.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: blue;">void</span> playPrevious()
{
currentFile--;
<span style="color: blue;">if</span> (currentFile < 1)
{
currentFile = numberOfFiles[currentFolder];
}
playCurrent();
}</pre>
<br />
<br />
<h4>
Weitere Blogeinträge</h4>
<ol>
<li><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-1-auswahl-der.html"><b>Auswahl der Komponenten</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-2-das.html" target="_blank">Das Entwicklungsbrett</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-3-das-erste.html" target="_blank">Das erste Einschalten</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-4-die.html" target="_blank">Die Entwicklungsumgebung</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-5-knopfe.html" target="_blank">Knöpfe (digital)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-6-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (digital)</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-7-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (analog)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-8-potentiometer.html">Potentiometer</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-9-mp3-shield.html">Das MP3 Shield</a></b></li>
<li><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-10-auswahl-der.html"><b>Auswahl der Komponenten 2</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-11-auswahl-der.html">Auswahl der Komponenten (Zusammenfassung)</a> </b></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-12-punkt.html"><b>Punkt-Streifenrasterplatine und Knöpfe</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-13-punkt.html"><b>Punkt-Streifenrasterplatine und weitere Komponenten</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-14-das-gehause.html"><b>Das Gehäuse</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-15-sketch-1-setup.html"><b>Sketch 1 (setup-Methode)</b></a></li>
<li><b>Sketch 2 (loop-Methode)</b></li>
<li><a href="http://chrigas.blogspot.com/2015/04/arduino-mp3-player-17-sketch-3-der.html"><b>Sketch 3 (Der komplette Code)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/05/audino-arduino-mp3-player-18-pc-software.html"><b>PC-Software</b></a></li>
</ol>
<br />
<br />Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-2359578464804578723.post-21505763441412044812015-02-25T20:20:00.000+01:002015-05-13T00:44:08.239+02:00Audino - Arduino MP3-Player (15) - Sketch 1 (setup-Methode)Um das MP3 Shield ansteuern zu können wird die zur Verfügung gestellte Bibliothek verwendet. Der Beispielcode, der hier (<a href="http://chrigas.blogspot.de/2014/12/arduino-mp3-player-9-mp3-shield.html">Das MP3 Shield</a>) zum Laufen gebracht worden ist, ist ein erster Startpunkt. Die benötigten Bibliotheken werden hinzugefügt und ein Adafruit_VS1053_FilePlayer-Objekt angelegt.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: blue;">#include</span> <span style="color: #a31515;"><SPI.h></span>
<span style="color: blue;">#include</span> <span style="color: #a31515;"><Adafruit_VS1053.h></span>
<span style="color: blue;">#include</span> <span style="color: #a31515;"><SD.h></span>
<span style="color: blue;">#define</span> <span style="color: #6f008a;">SHIELD_CS</span> 7 <span style="color: green;">// VS1053 chip select pin (output)</span>
<span style="color: blue;">#define</span> <span style="color: #6f008a;">SHIELD_DCS</span> 6 <span style="color: green;">// VS1053 Data/command select pin (output)</span>
<span style="color: blue;">#define</span> <span style="color: #6f008a;">DREQ</span> 3 <span style="color: green;">// VS1053 Data request, ideally an Interrupt pin</span>
<span style="color: blue;">#define</span> <span style="color: #6f008a;">CARDCS</span> 4 <span style="color: green;">// Card chip select pin</span>
<span style="color: #2b91af;">Adafruit_VS1053_FilePlayer</span> musicPlayer =
<span style="color: #2b91af;">Adafruit_VS1053_FilePlayer</span>(<span style="color: #6f008a;">SHIELD_CS</span>, <span style="color: #6f008a;">SHIELD_DCS</span>, <span style="color: #6f008a;">DREQ</span>, <span style="color: #6f008a;">CARDCS</span>);</pre>
<br />
In der setup() Methode werden musicPlayer und SD-Karte initialisiert.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: green;">// initialise the music player</span>
<span style="color: blue;">if</span> (!musicPlayer.begin())
{
Serial.println(<span style="color: #a31515;">"VS1053 not found"</span>);
<span style="color: blue;">while</span> (1); <span style="color: green;">// don't do anything more</span>
}
<span style="color: green;">// initialise the SD card</span>
SD.begin(<span style="color: #6f008a;">CARDCS</span>);</pre>
<br />
Damit das Abspielen der MP3-Dateien im Hintergrund ablaufen kann, wird Interrupt verwendet.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: green;">// If DREQ is on an interrupt pin (on uno, #2 or #3) we can do background</span>
<span style="color: green;">// audio playing</span>
musicPlayer.useInterrupt(<span style="color: #6f008a;">VS1053_FILEPLAYER_PIN_INT</span>); <span style="color: green;">// DREQ int</span></pre>
<br />
Um zu überprüfen, dass das MP3 Shield erfolgreich initialisiert worden ist, wird ein Ton ausgegeben.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;">musicPlayer.sineTest(0x44, 100); <span style="color: green;">// Make a tone to indicate VS1053 is working </span>
</pre>
<br />
Als nächstes wird analysiert wie viele MP3s in welchen Ordnern abgelegt sind. Die Anzahl der Dateien wird in einem Array abgelegt. Jeder Eintrag im Array entspricht einem Ordner auf der SD-Karte.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: blue;">unsigned</span> <span style="color: blue;">int</span> numberOfFiles[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
</pre>
<br />
Es wird davon ausgegangen, dass auf der SD-Karte 10 Ordner angelegt sind, die von 0 bis 9 durchnummeriert sind. In den Ordnern 1 bis 9 liegen jeweils beliebig viele MP3-Dateien. Diese
sind ebenfalls durchnummeriert (1.mp3, 2.mp3, 3.mp3, ...). Im Ordner 0
sind Konfigurationsdateien abgelegt. Es wird durch alle Ordner durchiteriert<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: green;">// read the number of tracks in each folder</span>
<span style="color: blue;">for</span> (<span style="color: #2b91af;">byte</span> i = 0; i < 10; i++)
{
<span style="color: #2b91af;">String</span> temp = <span style="color: #a31515;">"/"</span>;
temp.concat(i);
<span style="color: blue;">char</span> filename[3];
temp.toCharArray(filename, <span style="color: blue;">sizeof</span>(filename));
numberOfFiles[i] = countFiles(SD.open(filename));
Serial.print(filename);
Serial.print(<span style="color: #a31515;">": "</span>);
Serial.println(numberOfFiles[i]);
}</pre>
<br />
und die Anzahl der Dateien im Ordner bestimmt.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: green;">// counts the number of files in directory</span>
<span style="color: blue;">unsigned</span> <span style="color: blue;">int</span> countFiles(<span style="color: #2b91af;">File</span> <span style="color: grey;">dir</span>)
{
<span style="color: blue;">unsigned</span> <span style="color: blue;">int</span> counter = 0;
<span style="color: blue;">while</span> (<span style="color: #6f008a;">true</span>)
{
<span style="color: #2b91af;">File</span> entry = <span style="color: grey;">dir</span>.openNextFile();
<span style="color: blue;">if</span> (!entry)
{
<span style="color: green;">// no more files</span>
<span style="color: blue;">break</span>;
}
counter++;
entry.close();
}
<span style="color: grey;">dir</span>.close();
<span style="color: blue;">return</span> counter;
}</pre>
<br />
Damit nach einem erneuten Einschalten der zuletzt gespielte Titel gespielt wird, wird dieser aus einer Datei ausgelesen. Aktueller Ordner und aktuelle Datei werden abgespeichert. Als aktuelle Datei wird der Vorgänger abgespeichert, da beim Start der nächste Track abgespielt wird.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: blue;">char</span> currentTrackFileName[] = <span style="color: #a31515;">"/0/current.txt"</span>;</pre>
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: #2b91af;">byte</span> currentFolder = 1;
<span style="color: blue;">unsigned</span> <span style="color: blue;">int</span> currentFile = 0;</pre>
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: green;">// read remembered track</span>
<span style="color: blue;">if</span> (SD.exists(currentTrackFileName))
{
<span style="color: #2b91af;">File</span> file = SD.open(currentTrackFileName, <span style="color: #6f008a;">FILE_READ</span>);
<span style="color: blue;">if</span> (file)
{
currentFolder = file.readStringUntil(<span style="color: #a31515;">'\n'</span>).toInt();
currentFile = file.readStringUntil(<span style="color: #a31515;">'\n'</span>).toInt() - 1;
}
file.close();
}</pre>
<br />
Nachdem jetzt die setup() Methode abgehandelt worden ist, schauen wir uns als nächstes die loop() Methode an.<br />
<br />
<br />
<h4>
Weitere Blogeinträge</h4>
<ol>
<li><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-1-auswahl-der.html"><b>Auswahl der Komponenten</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-2-das.html" target="_blank">Das Entwicklungsbrett</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-3-das-erste.html" target="_blank">Das erste Einschalten</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-4-die.html" target="_blank">Die Entwicklungsumgebung</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-5-knopfe.html" target="_blank">Knöpfe (digital)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-6-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (digital)</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-7-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (analog)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-8-potentiometer.html">Potentiometer</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-9-mp3-shield.html">Das MP3 Shield</a></b></li>
<li><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-10-auswahl-der.html"><b>Auswahl der Komponenten 2</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-11-auswahl-der.html">Auswahl der Komponenten (Zusammenfassung)</a> </b></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-12-punkt.html"><b>Punkt-Streifenrasterplatine und Knöpfe</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-13-punkt.html"><b>Punkt-Streifenrasterplatine und weitere Komponenten</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-14-das-gehause.html"><b>Das Gehäuse</b></a></li>
<li><b>Sketch 1 (setup-Methode)</b></li>
<li><a href="http://chrigas.blogspot.com/2015/03/arduino-mp3-player-16-sketch-2-loop.html"><b>Sketch 2 (loop-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/04/arduino-mp3-player-17-sketch-3-der.html"><b>Sketch 3 (Der komplette Code)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/05/audino-arduino-mp3-player-18-pc-software.html"><b>PC-Software</b></a></li>
</ol>
<br />Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-2359578464804578723.post-9707331376457113252015-02-17T18:36:00.001+01:002015-05-13T00:44:44.290+02:00Audino - Arduino MP3-Player (14) - Das GehäuseNachdem jetzt die Elektronik fertig ist, an dieser Stelle vielen Dank an Florian, der hier fachkundig zur Hilfe war und auch das Löten übernommen hat, kann die Elektronik in ein Gehäuse eingebaut werden. Auch bei der Erstellung des Gehäuses hatte ich Hilfe, großen Dank an Klaus, der in kürzester Zeit das Gehäuse erstellt hat.<br />
<br />
Und so sieht das Gehäuse aus. Front und Rückseite können geöffnet werden.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnpCQnY-TW1Xgr_8-ECo1bhcHG_VuDMOXVBF7d5sVTQkOKaaIjDents854TPjDSSHqcwEsXWwV7SUhnfag1ZcWHTFv71gW0u3ftstS7w2zo4MEF2nUsYltkqGaP8B6-cvxUMwJJnyECTM/s1600/DSC_0415.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnpCQnY-TW1Xgr_8-ECo1bhcHG_VuDMOXVBF7d5sVTQkOKaaIjDents854TPjDSSHqcwEsXWwV7SUhnfag1ZcWHTFv71gW0u3ftstS7w2zo4MEF2nUsYltkqGaP8B6-cvxUMwJJnyECTM/s1600/DSC_0415.JPG" width="212" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFeouM9SlS4e0cPGMN6ziYUwgrm0TTBT6e31ckSURYG9bk-rehrhKizajGZIiomldaSb_7AOMZKJZEVJkwrYGzBP7awXH6Kfyy04FLRz0psntudaItK7ECDbZaTiN7NC3D8HsFr5-Cq74/s1600/DSC_0416.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFeouM9SlS4e0cPGMN6ziYUwgrm0TTBT6e31ckSURYG9bk-rehrhKizajGZIiomldaSb_7AOMZKJZEVJkwrYGzBP7awXH6Kfyy04FLRz0psntudaItK7ECDbZaTiN7NC3D8HsFr5-Cq74/s1600/DSC_0416.JPG" width="212" /> </a></div>
<br />
Der Potentiometer und der Kippschalter können am Gehäuse befestigt werden.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUJb52UVpxw48Iqm53LkrC_xegVOPgGCxekIut1c8e6wMstWuiBBPCwUiJz3KqH4rAoyOMLrPSsFI0JlvZsB79-P8vOCOE8higt0UO89LfA0mk2VLxoA0deUZ04obYGCd6nK2pjn_ajak/s1600/DSC_0417.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUJb52UVpxw48Iqm53LkrC_xegVOPgGCxekIut1c8e6wMstWuiBBPCwUiJz3KqH4rAoyOMLrPSsFI0JlvZsB79-P8vOCOE8higt0UO89LfA0mk2VLxoA0deUZ04obYGCd6nK2pjn_ajak/s1600/DSC_0417.JPG" width="400" /> </a></div>
<br />
Die Punkt-Streifenrasterplatine und der Lautsprecher mit dem Schutzgitter sind an der Front befestigt worden.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghomst5G0DUvQYOb9XhYg1zU7smCL17zkBbFeC3Q5iVeJPfqjtNT_-k3lTjCoUV3KWFW1FzcrCZtpjPrRcgZZa9cuBMBt2zaZHv_hBJo2eb1hJPul0WiqjKCfLiuCabbF3DSHmufNrnvg/s1600/DSC_0418.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghomst5G0DUvQYOb9XhYg1zU7smCL17zkBbFeC3Q5iVeJPfqjtNT_-k3lTjCoUV3KWFW1FzcrCZtpjPrRcgZZa9cuBMBt2zaZHv_hBJo2eb1hJPul0WiqjKCfLiuCabbF3DSHmufNrnvg/s1600/DSC_0418.JPG" width="400" /></a></div>
<br />
Über die Rückseite kann auf die verschraubten Komponenten zugegriffen werden.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLJBEqPjiNkqTLc3sCMwMul8TZ4RWXXEFzFQp8BI2qQIQEP4Woa6UPBI8gTH-aoU-hKQHQrkrOyLuh5x6itw59m9KvbTZoDeojhceUZmOBjORZ3EmpNDD6SrObJVQoKZ4GDmWsH8-EvhQ/s1600/DSC_0422.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLJBEqPjiNkqTLc3sCMwMul8TZ4RWXXEFzFQp8BI2qQIQEP4Woa6UPBI8gTH-aoU-hKQHQrkrOyLuh5x6itw59m9KvbTZoDeojhceUZmOBjORZ3EmpNDD6SrObJVQoKZ4GDmWsH8-EvhQ/s1600/DSC_0422.JPG" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
Und so sieht der fertiggestellte MP3-Player aus.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7mkkvv1kyLR-vsmI3Zr0LiL_RUikkZpK4NQpA___KfxOaEFwdg6YLqKigzRAjnxeFJLuS9vilm0fqtb578cv_QGpzG6a1zlzfsbwdpeTJb9YWxvCfJOEifWeSfBJMeUHKWWp-fWnAps4/s1600/DSC_0421.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="380" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7mkkvv1kyLR-vsmI3Zr0LiL_RUikkZpK4NQpA___KfxOaEFwdg6YLqKigzRAjnxeFJLuS9vilm0fqtb578cv_QGpzG6a1zlzfsbwdpeTJb9YWxvCfJOEifWeSfBJMeUHKWWp-fWnAps4/s1600/DSC_0421.JPG" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
Als nächstes ist die Software (Sketch) dran, die auf das Arduino-Board drauf gespielt wird.<br />
<br />
<br />
<br />
<h4>
Weitere Blogeinträge</h4>
<ol>
<li><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-1-auswahl-der.html"><b>Auswahl der Komponenten</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-2-das.html" target="_blank">Das Entwicklungsbrett</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-3-das-erste.html" target="_blank">Das erste Einschalten</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-4-die.html" target="_blank">Die Entwicklungsumgebung</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-5-knopfe.html" target="_blank">Knöpfe (digital)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-6-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (digital)</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-7-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (analog)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-8-potentiometer.html">Potentiometer</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-9-mp3-shield.html">Das MP3 Shield</a></b></li>
<li><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-10-auswahl-der.html"><b>Auswahl der Komponenten 2</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-11-auswahl-der.html">Auswahl der Komponenten (Zusammenfassung)</a> </b></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-12-punkt.html"><b>Punkt-Streifenrasterplatine und Knöpfe</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-13-punkt.html"><b>Punkt-Streifenrasterplatine und weitere Komponenten</b></a></li>
<li><b>Das Gehäuse</b></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-15-sketch-1-setup.html"><b>Sketch 1 (setup-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/03/arduino-mp3-player-16-sketch-2-loop.html"><b>Sketch 2 (loop-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/04/arduino-mp3-player-17-sketch-3-der.html"><b>Sketch 3 (Der komplette Code)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/05/audino-arduino-mp3-player-18-pc-software.html"><b>PC-Software</b></a></li>
</ol>
<br />
<br />Unknownnoreply@blogger.com8tag:blogger.com,1999:blog-2359578464804578723.post-79514648695197125162015-01-24T01:02:00.000+01:002015-05-13T00:46:02.772+02:00Audino - Arduino MP3-Player (13) - Punkt-Streifenrasterplatine und weitere KomponentenNachdem die Knöpfe auf der Punkt-Streifenrasterplatine angebracht worden sind und das Arduino-Board auf der Rückseite mit vier Distanzbolzen, Schrauben und Muttern aus dem Prototyping and Development Board befestigt worden sind, können die weiteren Komponenten auf die Punkt-Streifenrasterplatine angebracht beziehungsweise mit der Punkt-Streifenrasterplatine verbunden werden.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg07Hq4_2LKnStJSdaJbKbq6Aubb9iDTaOdjPNOpZ58i2hyphenhyphenWD2oIHBkbPxZx8mDW4Ztj0uZd-dqJyr40lW5E5wZCuG6U0voGV-bMBtasj57tt0m9UOBNat1-f6Gii5eCRnu5cqFu_mc6nk/s1600/DSC_0268.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg07Hq4_2LKnStJSdaJbKbq6Aubb9iDTaOdjPNOpZ58i2hyphenhyphenWD2oIHBkbPxZx8mDW4Ztj0uZd-dqJyr40lW5E5wZCuG6U0voGV-bMBtasj57tt0m9UOBNat1-f6Gii5eCRnu5cqFu_mc6nk/s1600/DSC_0268.JPG" width="400" /></a></div>
<br />
Neben das Arduino-Board kann der Batteriehalter platziert werden. Hierfür werden weitere zwei Löcher (3mm) in die Punkt-Streifenrasterplatine gebohrt. Mit zwei Schrauben M3/10 und zwei M3 Muttern kann der Batteriehalter befestigt werden.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWdAjFb96__X0OA9Izx7DGGZB1XZKd3YhVBdNYBbNPH5oHw3bTie8xmJ6oGGmK01G9l_L4KFJ_9hI-QTuWTCDsqqG-1tc9OwZzYOkBni5P4PKXspu6o_A494lLUZ9D4FFU5UweTWXusuM/s1600/DSC_0275.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWdAjFb96__X0OA9Izx7DGGZB1XZKd3YhVBdNYBbNPH5oHw3bTie8xmJ6oGGmK01G9l_L4KFJ_9hI-QTuWTCDsqqG-1tc9OwZzYOkBni5P4PKXspu6o_A494lLUZ9D4FFU5UweTWXusuM/s1600/DSC_0275.JPG" width="400" /></a></div>
<br />
Der Anschluss des Batteriehalters wird in die entsprechende Buchse des Arduino-Boards gesteckt.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_vCLfZKm5WUdKD_JmV6Gun-McQGpwn_fkGRAQHn5yqUTRjSod3UQWNcK94Y3FtQoFaJGGsx97ZeIVHKfvV2hlPgB7DbAIL-TeyhLXVif5jvH-d-3oIwCNJDcMraw2ROsep-_ubMx1Kx0/s1600/DSC_0265.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_vCLfZKm5WUdKD_JmV6Gun-McQGpwn_fkGRAQHn5yqUTRjSod3UQWNcK94Y3FtQoFaJGGsx97ZeIVHKfvV2hlPgB7DbAIL-TeyhLXVif5jvH-d-3oIwCNJDcMraw2ROsep-_ubMx1Kx0/s1600/DSC_0265.JPG" width="400" /></a></div>
<br />
Die Stromleitung des Batteriehalters wird durchtrennt damit der Kippschalter dazwischengeschaltet werden kann. Zwei Drahtbrücken mit Buchsen sind dazu an den Enden der durchtrennten Stromleitung und zwei Drahtbrücken mit Steckern an den Kippschalter angelötet und mit Schrumpfschlauch fixiert worden. Dadurch kann der Kippschalter an den Batteriehalter gesteckt werden.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib56qHh6fP8YzTsyv36c50RNjrElbemi9HtTBD2QENG7XRGUBp9BmSY_ojfjBQ1wWlmmvJy43cnnjhiTwflWjvwMG7GqseKIC11cbzhYW7dnaIMqqSXRCiRyIX4uljvZXkmNHv6CW2Yjs/s1600/DSC_0279.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib56qHh6fP8YzTsyv36c50RNjrElbemi9HtTBD2QENG7XRGUBp9BmSY_ojfjBQ1wWlmmvJy43cnnjhiTwflWjvwMG7GqseKIC11cbzhYW7dnaIMqqSXRCiRyIX4uljvZXkmNHv6CW2Yjs/s1600/DSC_0279.JPG" width="400" /></a></div>
<br />
An dem Lautsprecher werden zwei Drähte gelötet.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4kHRBeeHHaeR7AfqXFAdxs4XZX8pVzK7z3KHQsLO6NnyB8puL1UB0DBZmo4KgS2_FJhkwpaAsOtXwX6AD7zZFKR67mvINXOhpeFqmng5sp4JKuNpbX3doew1To_HR817iyj0fUhr31wY/s1600/DSC_0272.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4kHRBeeHHaeR7AfqXFAdxs4XZX8pVzK7z3KHQsLO6NnyB8puL1UB0DBZmo4KgS2_FJhkwpaAsOtXwX6AD7zZFKR67mvINXOhpeFqmng5sp4JKuNpbX3doew1To_HR817iyj0fUhr31wY/s1600/DSC_0272.JPG" width="265" /></a></div>
<br />
Die Drähte können mit dem MP3 Shield an einem der beiden Endstücke verbunden werden.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg21e3NE6Pdw_n9JeqC9ENkwHrmV6BQvFOp1mACbbmmI47m0LvF9sPtgRQ7I1PnLuWyciKjgvHAirebcwHCh7KWZkNYS5Pm0Hjo4bv5cnS_ltbXZ1-81D34wpXhnyX8hPfbq1d36sUK7GE/s1600/DSC_0278.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg21e3NE6Pdw_n9JeqC9ENkwHrmV6BQvFOp1mACbbmmI47m0LvF9sPtgRQ7I1PnLuWyciKjgvHAirebcwHCh7KWZkNYS5Pm0Hjo4bv5cnS_ltbXZ1-81D34wpXhnyX8hPfbq1d36sUK7GE/s1600/DSC_0278.JPG" width="400" /></a></div>
<br />
Das analoge Inputsignal der Knöpfe wird über die weiße Drahtbrücke gemessen. Das eine Ende ist an entsprechender Stelle an der Punkt-Streifenrasterplatine angelötet, das andere Ende wird in eines der analogen Pins des Arduino-Boards beziehungsweise des MP3 Shields gesteckt.<br />
<br />
Die 5V-Stromversorgung der Knöpfe erfolgt über eine rote Drahtbrücke, die ebenfalls mit dem einen Ende an der Punkt entsprechenden Stelle an der Punkt-Streifenrasterplatine angelötet ist. Das andere Ende wird in die 5V-Buchse des Arduino-Boards/MP3 Shields gesteckt.<br />
<br />
Auch für Gnd der Knöpfe wird eine schwarze Drahtbrücke an entsprechender Stelle an der Punkt-Streifenrasterplatine angelötet und das andere Ende in eines der Gnd-Pins gesteckt.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijgDJnxDmZTsXg0i6AjZXMZD_tqcGaORLUzELTkL5-rtgNM0zDH5utN_ZZYIwGTJY7lkjoPXdcsR8jZUYJi-TAvLXZiezxAptt8ukgClDS4LeDre_qeIPxKSsg8uuk14VB4t-I2b0hM_A/s1600/DSC_0273.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijgDJnxDmZTsXg0i6AjZXMZD_tqcGaORLUzELTkL5-rtgNM0zDH5utN_ZZYIwGTJY7lkjoPXdcsR8jZUYJi-TAvLXZiezxAptt8ukgClDS4LeDre_qeIPxKSsg8uuk14VB4t-I2b0hM_A/s1600/DSC_0273.JPG" width="400" /></a></div>
<br />
An dem Potentiometer sind drei Drahtbrücken mit Steckern gelötet und mit Schrumpfschläuchen fixiert. Die drei Drahtbrücken werden mit anderen drei Drahtbrücken mit Buchsen verbunden.<br />
<br />
Die linke Drahtbrücke (rot) wird mit der 5V-Stromversorgung verbunden. Da das Arduino-Board nur eine 5V-Buchse hat, wird eine Drahtbrücke an der Stelle auf der Punkt-Streifenrasterplatine gelötet an der die 5V-Versorgung für die Knöpfe liegt und somit von dieser Stelle die 5V abgegriffen und mit dem Potentiometer verbunden.<br />
<br />
Die mittlere Drahtbrücke (gelb) wird mit einem analogen Pin des Arduino-Boards/MP3 Shields verbunden.<br />
<br />
Die rechte Drahtbrücke (schwarz) wird mit einem Gnd-Pin des Arduino-Boards/MP3 Shields verbunden.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCB9kFfBLYSRQdLeJwoOZCt0CTztGWLqvH1B7k4NV3sEnASIeiMHK8QKo1WmNwndxlVkJADZOhnU4t8DJ6lhs0Lxl7WFFosCAT3T8a-vrlenpjh-s0KK9LNzaAfQzsmv7Q4gBLiAz2ys0/s1600/DSC_0280.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCB9kFfBLYSRQdLeJwoOZCt0CTztGWLqvH1B7k4NV3sEnASIeiMHK8QKo1WmNwndxlVkJADZOhnU4t8DJ6lhs0Lxl7WFFosCAT3T8a-vrlenpjh-s0KK9LNzaAfQzsmv7Q4gBLiAz2ys0/s1600/DSC_0280.JPG" width="400" /></a></div>
<br />
Für die Befestigung der Punkt-Streifenrasterplatine ans Gehäuse werden in den Ecken vier Löcher in die Punkt-Streifenrasterplatine gebohrt (M3). Vorher kann die Punkt-Streifenrasterplatine noch zurecht geschnitten werden, sodass der Platzbedarf im Gehäuse reduziert wird. Durch die gebohrten Löcher können Kunststoff-Distanzbolzen gesteckt und mit Muttern befestigt werden. Die passenden Schrauben können verwendet werden, um die Punkt-Streifenrasterplatine ans Gehäuse zu befestigen. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdN3rXshwFaGOQFRxUTPHHh6EmcQtAGYfnzqLb5OQylC9ULO-3eru1ysb-r7M2xCS7yskJp2IcFaF4Tnkqj1OjKYoDXx7DnqHHhllNnuqd-cc64vNFPgFJK6h9kgP3b3loS76fANhsao8/s1600/DSC_0274.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdN3rXshwFaGOQFRxUTPHHh6EmcQtAGYfnzqLb5OQylC9ULO-3eru1ysb-r7M2xCS7yskJp2IcFaF4Tnkqj1OjKYoDXx7DnqHHhllNnuqd-cc64vNFPgFJK6h9kgP3b3loS76fANhsao8/s1600/DSC_0274.JPG" width="400" /></a></div>
<br />
Nachfolgend ist die Punkt-Streifenrasterplatine mit allen Komponenten dargestellt. Von vorne..<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHxuU9d3anOjOKVGYbQYjBtwOXfedv6scT2GyM7HQC1AU78lTGNq28zzZcYYTY1LMziWNVLeb0QO7EWzzMRst9c-L30sTYjVarVgPqEWc2tpCY3LMQaramZ7adgW7UykxdLHCA5uYiPqM/s1600/DSC_0276.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHxuU9d3anOjOKVGYbQYjBtwOXfedv6scT2GyM7HQC1AU78lTGNq28zzZcYYTY1LMziWNVLeb0QO7EWzzMRst9c-L30sTYjVarVgPqEWc2tpCY3LMQaramZ7adgW7UykxdLHCA5uYiPqM/s1600/DSC_0276.JPG" width="400" /></a></div>
<br />
..und von hinten.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK9YvUxP4X9yYLglLNK4OlHWbDQENUpmJhuDx7VAZs0YDNvLfHJVg_ga-RS3XjYTGAm1eQLqVvYeRGEK7xLRvpz4vc7Vm-M68dKLPUSOW6WQAf8ICTz9Rk0JqOt2EQTrGbpXX4CkagJDc/s1600/DSC_0281.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK9YvUxP4X9yYLglLNK4OlHWbDQENUpmJhuDx7VAZs0YDNvLfHJVg_ga-RS3XjYTGAm1eQLqVvYeRGEK7xLRvpz4vc7Vm-M68dKLPUSOW6WQAf8ICTz9Rk0JqOt2EQTrGbpXX4CkagJDc/s1600/DSC_0281.JPG" width="400" /></a></div>
<br />
Das nächste Mal wird es um das Gehäuse gehen.<br />
<br />
<br />
<br />
<br />
<h4>
Weitere Blogeinträge</h4>
<ol>
<li><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-1-auswahl-der.html"><b>Auswahl der Komponenten</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-2-das.html" target="_blank">Das Entwicklungsbrett</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-3-das-erste.html" target="_blank">Das erste Einschalten</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-4-die.html" target="_blank">Die Entwicklungsumgebung</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-5-knopfe.html" target="_blank">Knöpfe (digital)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-6-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (digital)</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-7-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (analog)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-8-potentiometer.html">Potentiometer</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-9-mp3-shield.html">Das MP3 Shield</a></b></li>
<li><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-10-auswahl-der.html"><b>Auswahl der Komponenten 2</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-11-auswahl-der.html">Auswahl der Komponenten (Zusammenfassung)</a> </b></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-12-punkt.html"><b>Punkt-Streifenrasterplatine und Knöpfe</b></a></li>
<li><b>Punkt-Streifenrasterplatine und weitere Komponenten</b></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-14-das-gehause.html"><b>Das Gehäuse</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-15-sketch-1-setup.html"><b>Sketch 1 (setup-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/03/arduino-mp3-player-16-sketch-2-loop.html"><b>Sketch 2 (loop-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/04/arduino-mp3-player-17-sketch-3-der.html"><b>Sketch 3 (Der komplette Code)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/05/audino-arduino-mp3-player-18-pc-software.html"><b>PC-Software</b></a></li>
</ol>
<br />Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-2359578464804578723.post-54354265557424063892015-01-11T23:08:00.000+01:002015-05-13T00:46:42.791+02:00Audino - Arduino MP3-Player (12) - Punkt-Streifenrasterplatine und KnöpfeDie Knöpfe werden auf der Punkt-Streifenrasterplatine platziert. Hierbei kann mit den
Abständen etwas variiert werden. Am Rand habe ich etwas Platz gelassen, da hier
noch Leitungen kommen und auch die Befestigung der Punkt-Streifenrasterplatine
ans Gehäuse benötigt etwas Platz.
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5ywm9DG148NXK9oPqikRO-UChh4E3G4OlEiKdxQWWzBEF3Bh88EF3W1vhDaDG7HJuCDhCeet9KFO7fDKtsY96lb_-OlT7irG9MS0MMGcue0i0kMZw3HmxAHBJAP3PuRP0eLZ04AWlEGA/s1600/DSC_0119.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5ywm9DG148NXK9oPqikRO-UChh4E3G4OlEiKdxQWWzBEF3Bh88EF3W1vhDaDG7HJuCDhCeet9KFO7fDKtsY96lb_-OlT7irG9MS0MMGcue0i0kMZw3HmxAHBJAP3PuRP0eLZ04AWlEGA/s1600/DSC_0119.JPG" width="400" /></a></div>
<br />
Auf der Rückseite gegenüber den Knöpfen kann das Arduino-Board mit dem MP3 Shield
platziert werden. Entsprechend werden Borlöcher (3mm) gebohrt, sodass das
Leitungslayout nicht beeinträchtigt wird.
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7j6eHrHI2cdBLwFA_qzc289hgLqwvm3O3IXeCfrmdF2J1vmGKf1IcGPz2tBOsAlUWaYvTNe5ViRi7WLl7TDFWTbIdIK-f19rwicYKSzv9e9I3RlWmHH7vsWYtPlYV2Y7Nk2-QO5wZs4A/s1600/DSC_0126.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7j6eHrHI2cdBLwFA_qzc289hgLqwvm3O3IXeCfrmdF2J1vmGKf1IcGPz2tBOsAlUWaYvTNe5ViRi7WLl7TDFWTbIdIK-f19rwicYKSzv9e9I3RlWmHH7vsWYtPlYV2Y7Nk2-QO5wZs4A/s1600/DSC_0126.JPG" width="400" /></a></div>
<br />
Die Knöpfe werden von der einen Seite durchgesteckt und auf der anderen Seite
gelötet. Das gleiche gilt für die Widerstände und einige Draht-Leitungen.
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-jQ8quCMvIXEDgJpegRS98qIq2Mu_sJmHVtcECmhOB7Qy1SZpNaOhV_bnyj7KVeaLKIQf5Jo6aT_KCu1y3u8tdCLZpXS6Ki4amK1jCDnO0FBkLCmpw1RucAlJnqgX9h2Zbqwy-BUmjdo/s1600/DSC_0264.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-jQ8quCMvIXEDgJpegRS98qIq2Mu_sJmHVtcECmhOB7Qy1SZpNaOhV_bnyj7KVeaLKIQf5Jo6aT_KCu1y3u8tdCLZpXS6Ki4amK1jCDnO0FBkLCmpw1RucAlJnqgX9h2Zbqwy-BUmjdo/s1600/DSC_0264.JPG" width="400" /></a></div>
<br />
Auf der gelöteten Seite werden benötigte Verbindungen gelötet.
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIOSwk4cy2m34Q-6oxNHyBZgeZOeksrfz3Akk-8YP01haL14mgR9UyOO_bPlE9Gp21XWCKMW_RKjiW_ky5pZlTIOX7AgzfgW6MW7uVWTrUDC0BLshQen-oe8_Ahh_JZyMxs6zHVFfRmrI/s1600/DSC_0261.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIOSwk4cy2m34Q-6oxNHyBZgeZOeksrfz3Akk-8YP01haL14mgR9UyOO_bPlE9Gp21XWCKMW_RKjiW_ky5pZlTIOX7AgzfgW6MW7uVWTrUDC0BLshQen-oe8_Ahh_JZyMxs6zHVFfRmrI/s1600/DSC_0261.JPG" width="400" /></a></div>
<br />
Das Leitungslayout sollte, entsprechend zu <a href="http://chrigas.blogspot.de/2014/12/arduino-mp3-player-7-mehrere-knopfe.html"><span style="color: blue;">Arduino MP3-Player (7) - Mehrere Knöpfe (analog)</span></a>,
den nachfolgenden Abbildungen entsprechen. Diese weichen von den oberen Fotos
ab. Im ursprünglichen Layout hatte sich ein Fehler eingeschlichen, der durch
verschieben eines Widerstands behoben worden ist. Dieser Fehler ist nun
hoffentlich behoben.
<br />
<br />
Die Leitungen, die mit dem Arduino-Board bzw. MP3 Shield verbunden werden sind hier
die 5V Stromversorgung (rot), die Masse (schwarz) und das analoge Inputsignal
(weiß). Da neben den Knöpfen noch der Potentiometer mit Strom versorgt werden
muss, wird über eine weitere Leitung auf der Punkt-Streifenrasterplatine die 5V
Stromversorgung abgegriffen.
<br />
<br />
Im nachfolgenden Bild sind die Frontansicht und die Rückansicht zusammen
dargestellt.
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHAPy3Hp6F7RDGHqtwMCtW4oICgpvUagEghhGq4hfsbaxWHcnKN0Hw93dayrQ21NCnqgX3LnJYS7CXDK4WUOeFtbiug_rLcIcs1OxVHsweaqvxSoQo1nuniPJxifmoZBzen91_Q8LhWao/s1600/rasterplatine_Steckplatine.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="385" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHAPy3Hp6F7RDGHqtwMCtW4oICgpvUagEghhGq4hfsbaxWHcnKN0Hw93dayrQ21NCnqgX3LnJYS7CXDK4WUOeFtbiug_rLcIcs1OxVHsweaqvxSoQo1nuniPJxifmoZBzen91_Q8LhWao/s1600/rasterplatine_Steckplatine.png" width="400" /></a></div>
<br />
In der Frontansicht sind die Knöpfe und Widerstände zu sehen. Ebenso wie einige
Draht-Leitungen.
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDKMgDrVjDIWr0u81yA1eAQQVfJE9a6okKqkjCawOqe972F_Xk_AquExx-2-vakEDknf-0ERbAkzbRti4dNyjaWA5PimLi6DmtGo3f6dgYblSkCrjQGEl0sXBjzq7_Q99vWxcPLN1k8OA/s1600/rasterplatine_front_Steckplatine.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDKMgDrVjDIWr0u81yA1eAQQVfJE9a6okKqkjCawOqe972F_Xk_AquExx-2-vakEDknf-0ERbAkzbRti4dNyjaWA5PimLi6DmtGo3f6dgYblSkCrjQGEl0sXBjzq7_Q99vWxcPLN1k8OA/s1600/rasterplatine_front_Steckplatine.png" width="368" /></a></div>
<br />
In der Rückansicht werden die Knöpfe, Widerstände und Draht-Leitungen angelötet. Zudem
werden noch weitere Abschnitte der Rasterplatine miteinander verbunden.
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyyw9En63mfxe1U8cdlAHmfz2UawRy5ufdeO79NyHjVX2lOdSAX45fdipilHl2QLkHlNCCVZWH_bJfaGM0Q3hyphenhyphenixrCmP80DqI8Xr55QwganaYNF7X5Bd9UZbof3tAJCsHXIzeHI8q5KiI/s1600/rasterplatine_back_Steckplatine.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="385" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyyw9En63mfxe1U8cdlAHmfz2UawRy5ufdeO79NyHjVX2lOdSAX45fdipilHl2QLkHlNCCVZWH_bJfaGM0Q3hyphenhyphenixrCmP80DqI8Xr55QwganaYNF7X5Bd9UZbof3tAJCsHXIzeHI8q5KiI/s1600/rasterplatine_back_Steckplatine.png" width="400" /></a></div>
<br />
Als nächstes werden die weiteren Komponenten, die noch auf die Punkt-Streifenrasterplatine platziert oder mit dieser verbunden werden sollen, betrachtet.
<br />
<br />
<br />
<br />
<h4>
Weitere Blogeinträge</h4>
<ol>
<li><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-1-auswahl-der.html"><b>Auswahl der Komponenten</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-2-das.html" target="_blank">Das Entwicklungsbrett</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-3-das-erste.html" target="_blank">Das erste Einschalten</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-4-die.html" target="_blank">Die Entwicklungsumgebung</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-5-knopfe.html" target="_blank">Knöpfe (digital)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-6-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (digital)</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-7-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (analog)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-8-potentiometer.html">Potentiometer</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-9-mp3-shield.html">Das MP3 Shield</a></b></li>
<li><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-10-auswahl-der.html"><b>Auswahl der Komponenten 2</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-11-auswahl-der.html">Auswahl der Komponenten (Zusammenfassung)</a> </b></li>
<li><b>Punkt-Streifenrasterplatine und Knöpfe</b></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-13-punkt.html"><b>Punkt-Streifenrasterplatine und weitere Komponenten</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-14-das-gehause.html"><b>Das Gehäuse</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-15-sketch-1-setup.html"><b>Sketch 1 (setup-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/03/arduino-mp3-player-16-sketch-2-loop.html"><b>Sketch 2 (loop-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/04/arduino-mp3-player-17-sketch-3-der.html"><b>Sketch 3 (Der komplette Code)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/05/audino-arduino-mp3-player-18-pc-software.html"><b>PC-Software</b></a></li>
</ol>
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2359578464804578723.post-1118586274569275722015-01-10T22:24:00.000+01:002015-05-13T00:47:35.109+02:00Audino - Arduino MP3-Player (11) - Auswahl der Komponenten (Zusammenfassung)Hier möchte ich nochmal zusammenfassen welche Komponenten aus den vorherigen Beiträgen <a href="http://chrigas.blogspot.de/2014/10/arduino-mp3-player-1-auswahl-der.html">Arduino MP3-Player (1) - Auswahl der Komponenten</a> und <a href="http://chrigas.blogspot.de/2014/12/arduino-mp3-player-10-auswahl-der.html">Arduino MP3-Player (10) - Auswahl der Komponenten 2</a> zum Einsatz kommen. <br />
<br />
Zudem gibt es noch eine weitere Ergänzung: Anstelle des Widerstand-Kits reichen 13 <a href="https://www.reichelt.de/1-4W-5-1-0-k-Ohm-9-1-k-Ohm/1-4W-3-3K/3/index.html?&ACTION=3&LA=5000&GROUP=B1114&GROUPID=3065&ARTICLE=1397&START=0&SORT=artnr&OFFSET=16" target="_blank">3,3K-Ohm Widerstände</a>.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjVN0qzUPFTPKTYggldZ9VIQkWAIUXjtpYkH0ltMQqdzEoy_RzB9VSc7Xa3GNliEnIzUQmS-lnp71c2ER83fuU2NVeIU5KrXJdSKX4dVDZwh-EU4TtFdUaVhLb4Xn6bnOllbVO-hGj2UE/s1600/DSC_0122.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjVN0qzUPFTPKTYggldZ9VIQkWAIUXjtpYkH0ltMQqdzEoy_RzB9VSc7Xa3GNliEnIzUQmS-lnp71c2ER83fuU2NVeIU5KrXJdSKX4dVDZwh-EU4TtFdUaVhLb4Xn6bnOllbVO-hGj2UE/s1600/DSC_0122.JPG" width="400" /></a></div>
<br />
Somit kommen nun folgenden Komponenten nach derzeitiger Plannung zum Einsatz:<br />
<br />
<table border="1"><tbody>
<tr style="background: lightgray;"><th style="padding: 4;">Komponente</th><th style="padding: 4;">Preis</th></tr>
<tr><td style="padding: 4;">Arduino UNO R3</td><td style="padding: 4; text-align: right;">23,80€</td></tr>
<tr><td style="padding: 4;">4 x Kunststoff-Distanzbolzen M3x10 + Schrauben M3/8 + Muttern M3<br />
(anstelle Prototyping and Development Board)</td><td style="padding: 4; text-align: right;">1,84€</td></tr>
<tr><td style="padding: 4;">Jumper Wires Premium 150mm M/F Pack of 10</td><td style="padding: 4; text-align: right;">1,79€</td></tr>
<tr><td style="padding: 4;">Jumper Wires Premium 150mm M/M Pack of 10 </td><td style="padding: 4; text-align: right;">1,79€</td></tr>
<tr><td style="padding: 4;">13 3,3K-Ohm Widerstände</td><td style="padding: 4; text-align: right;">0,43€</td></tr>
<tr><td style="padding: 4;">11 Knöpfe Taster 3FTL6</td><td style="padding: 4; text-align: right;">10,56€</td></tr>
<tr><td style="padding: 4;">11 Kappen</td><td style="padding: 4; text-align: right;">2,75€</td></tr>
<tr><td style="padding: 4;">6xAA Battery Holder with DC2.1 Power Jack</td><td style="padding: 4; text-align: right;">2,80€</td></tr>
<tr><td style="padding: 4;">Kippschalter</td><td style="padding: 4; text-align: right;">2,50€</td></tr>
<tr><td style="padding: 4;">Potentiometer 10k</td><td style="padding: 4; text-align: right;">1,99€</td></tr>
<tr><td style="padding: 4;">Drehknopf</td><td style="padding: 4; text-align: right;">1,89€</td></tr>
<tr><td style="padding: 4;">Lautsprecher - 7,8cm (3") Durchmesser - 8Ohm 1Watt</td><td style="padding: 4; text-align: right;">1,95€</td></tr>
<tr><td style="padding: 4;">Schutzgitter VIS SG 1138</td><td style="padding: 4; text-align: right;">3,95€</td></tr>
<tr><td style="padding: 4;">Adafruit "Music Maker" MP3 Shield for Arduino w/3W Stereo Amp</td><td style="padding: 4; text-align: right;">33,27€</td></tr>
<tr><td style="padding: 4;">Punkt-Streifenrasterplatine, Hartpapier, 160x100mm</td><td style="padding: 4; text-align: right;">1,95€</td></tr>
<tr><td style="padding: 4;">Kupferlitze isoliert, 10M, 1x0,14mm</td><td style="padding: 4; text-align: right;">0,74€</td></tr>
<tr><td style="padding: 4;">10er Pack 2:1 Schrumpfschlauch, 1,6mm schwarz</td><td style="padding: 4; text-align: right;">0,25€</td></tr>
<tr><td style="padding: 4;">2 x Schrauben M3/10 und Muttern M3</td><td style="padding: 4; text-align: right;">0,16€</td></tr>
<tr><td style="padding: 4;">4 x Kunststoff-Distanzbolzen M3x10 + Schrauben M3/8 + Muttern M3</td><td style="padding: 4; text-align: right;">1,84€</td></tr>
<tr><td style="padding: 4;">4 x Schrauben M4/20 + Muttern M4</td><td style="padding: 4; text-align: right;">0,36€</td></tr>
<tr><td style="border: 2px solid black; font-weight: bold; padding: 4;">Summe</td><td style="border: 2px solid black; font-weight: bold; padding: 4; text-align: right;">96,61€</td></tr>
</tbody></table>
<br />
Als nächstes schaue ich mir die Punkt-Streifenrasterplatine an und die Knöpfe, die darauf gelötet werden sollen.<br />
<br />
<br />
<h4>
Weitere Blogeinträge</h4>
<ol>
<li><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-1-auswahl-der.html"><b>Auswahl der Komponenten</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-2-das.html" target="_blank">Das Entwicklungsbrett</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-3-das-erste.html" target="_blank">Das erste Einschalten</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-4-die.html" target="_blank">Die Entwicklungsumgebung</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-5-knopfe.html" target="_blank">Knöpfe (digital)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-6-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (digital)</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-7-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (analog)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-8-potentiometer.html">Potentiometer</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-9-mp3-shield.html">Das MP3 Shield</a></b></li>
<li><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-10-auswahl-der.html"><b>Auswahl der Komponenten 2</b></a></li>
<li><b>Auswahl der Komponenten (Zusammenfassung) </b></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-12-punkt.html"><b>Punkt-Streifenrasterplatine und Knöpfe</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-13-punkt.html"><b>Punkt-Streifenrasterplatine und weitere Komponenten</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-14-das-gehause.html"><b>Das Gehäuse</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-15-sketch-1-setup.html"><b>Sketch 1 (setup-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/03/arduino-mp3-player-16-sketch-2-loop.html"><b>Sketch 2 (loop-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/04/arduino-mp3-player-17-sketch-3-der.html"><b>Sketch 3 (Der komplette Code)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/05/audino-arduino-mp3-player-18-pc-software.html"><b>PC-Software</b></a></li>
</ol>
<br />
<br />Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-2359578464804578723.post-54766756639774334742014-12-23T02:01:00.002+01:002015-05-13T00:48:18.341+02:00Audino - Arduino MP3-Player (10) - Auswahl der Komponenten 2Nun haben wir alles zusammen - die Knöpfe, der Lautstärkeregler, das MP3 Shield - um die komplette Anwendung fertigzustellen. Mit den definierten Schaltungen und den Beispiel-Codes kann das Programm soweit ergänzt werden, dass es voll funktionsfähig ist.<br />
<br />
Da die Schaltung allerdings nicht auf dem Entwicklungsbrett enden soll, ist es nun Zeit sich über die noch fehlenden Komponenten Gedanken zu machen.<br />
<br />
Als erstes brauche ich größere Knöpfe, wie beispielsweise diese hier <a href="http://www.mec.dk/12-26847-Series-details.php?id=279" target="_blank">3FTL6</a>.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTiRrcdoX8CIBGqd3OBmoBacbGjxSNF2Ogoz8JrySRWYo7D5hGL6GqF7ksvw0SPamfIDVRGXIp-_kZXPaTQIKnXYakC0jfrP5sOCs2rS6Wv4CLtUv1F7c_VTfoHfxn6V5BAymYBfOBdrc/s1600/DSC_0127.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTiRrcdoX8CIBGqd3OBmoBacbGjxSNF2Ogoz8JrySRWYo7D5hGL6GqF7ksvw0SPamfIDVRGXIp-_kZXPaTQIKnXYakC0jfrP5sOCs2rS6Wv4CLtUv1F7c_VTfoHfxn6V5BAymYBfOBdrc/s1600/DSC_0127.JPG" width="400" /></a></div>
Und die passenden Kappen werden natürlich auch benötigt (<a href="http://www.reichelt.de/Kurzhubtaster/KAPPE-1D09/3/index.html?&ACTION=3&LA=3&ARTICLE=79711&GROUPID=3278" target="_blank">1D09</a>, <a href="http://www.reichelt.de/Kurzhubtaster/KAPPE-1D06/3/index.html?&ACTION=3&LA=3&ARTICLE=79709&GROUPID=3278" target="_blank">1D06</a>, <a href="http://www.reichelt.de/Kurzhubtaster/KAPPE-1D03/3/index.html?&ACTION=3&LA=3&ARTICLE=79707&GROUPID=3278" target="_blank">1D03</a>, <a href="http://www.reichelt.de/Kurzhubtaster/KAPPE-1D08/3/index.html?&ACTION=3&LA=3&ARTICLE=79710&GROUPID=3278" target="_blank">1D08</a>, <a href="http://www.reichelt.de/Kurzhubtaster/KAPPE-1D00/3/index.html?&ACTION=3&LA=3&ARTICLE=79705&GROUPID=3278" target="_blank">1D00</a>, <a href="http://www.reichelt.de/Kurzhubtaster/KAPPE-1D02/3/index.html?&ACTION=3&LA=3&ARTICLE=79706&GROUPID=3278" target="_blank">1D02</a>, <a href="http://www.reichelt.de/Kurzhubtaster/KAPPE-1D04/3/index.html?&ACTION=3&LA=3&ARTICLE=79708&GROUPID=3278" target="_blank">1D04</a>).<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRV1gjtTnnA22Dato4x6eENt4iTrGgnSWB4LjSvQ5QUhsrofR7huprvaznrXgsq2VDw4mnm3JjEIGB3IyyS6JJiSsHX1rEJO8vG1URG3fKfLMFlhgdDc0JOxJ-oS92EuK-BqGxr0v0f2A/s1600/DSC_0128.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRV1gjtTnnA22Dato4x6eENt4iTrGgnSWB4LjSvQ5QUhsrofR7huprvaznrXgsq2VDw4mnm3JjEIGB3IyyS6JJiSsHX1rEJO8vG1URG3fKfLMFlhgdDc0JOxJ-oS92EuK-BqGxr0v0f2A/s1600/DSC_0128.JPG" width="400" /></a></div>
Die Kappen können dann einfach auf die Knöpfe gesteckt werden.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBP2GuHSo-LyFJNOm2t3ZT8r3m08kC-KHYPIfQDdaIifWZNe74MD4GjwHZaf8k6qLbdm4GQDM-y9KvsJAFjnyTIvihgea2au2O_m7ePAgkrYEYXgzuOuqwSsGO_7u_8geMaQy2bojNnK0/s1600/DSC_0129.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBP2GuHSo-LyFJNOm2t3ZT8r3m08kC-KHYPIfQDdaIifWZNe74MD4GjwHZaf8k6qLbdm4GQDM-y9KvsJAFjnyTIvihgea2au2O_m7ePAgkrYEYXgzuOuqwSsGO_7u_8geMaQy2bojNnK0/s1600/DSC_0129.JPG" width="400" /></a></div>
Die ganze Elektronik soll dann auf eine <a href="https://www.reichelt.de/Streifenraster/H25PS160/3/index.html?&ACTION=3&LA=2&ARTICLE=23953&GROUPID=3373&artnr=H25PS160" target="_blank">Punkt-Streifenrasterplatine</a> kommen. 160x100mm sollte ausreichend sein.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgmDLTuWThS1O36b2Sfp5LOVq67zS2Z7_7UYrEiGqUc3BR1WwI-2nrYMf6MrxNsyuIknZitaIA9IpvIb1W5rOOkuOJXVHRN0sd-2F7y5WXuO4uY2vmtnZ8-B3HW3L3XKtwI44ov_Kg8e0/s1600/DSC_0215.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgmDLTuWThS1O36b2Sfp5LOVq67zS2Z7_7UYrEiGqUc3BR1WwI-2nrYMf6MrxNsyuIknZitaIA9IpvIb1W5rOOkuOJXVHRN0sd-2F7y5WXuO4uY2vmtnZ8-B3HW3L3XKtwI44ov_Kg8e0/s1600/DSC_0215.JPG" width="400" /></a></div>
Für einzelne Verbindungen kommt isolierte Kupferlitze (<a href="https://www.reichelt.de/Kupferlitze-isoliert/LITZE-BL/3/index.html?&ACTION=3&LA=2&ARTICLE=10292&GROUPID=4487&artnr=LITZE+BL" target="_blank">blau</a>, <a href="https://www.reichelt.de/Kupferlitze-isoliert/LITZE-SW/3/index.html?&ACTION=3&LA=2&ARTICLE=10298&GROUPID=4487&artnr=LITZE+SW" target="_blank">schwarz</a>, <a href="https://www.reichelt.de/Kupferlitze-isoliert/LITZE-RT/3/index.html?&ACTION=3&LA=2&ARTICLE=10297&GROUPID=4487&artnr=LITZE+RT" target="_blank">rot</a>) zum Einsatz.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbIKFv6WBNEAOuRCQIOkInGiZHC9YtdjyXY6aFf1jJZlkZm71IsDvDb8lzTXOVSY2pOaCa4WU96do49tmrH1jJjVSGit8P_lZRjZsdHdz6gMFlDm9xdF8oAFYrhoH_CJGR3Tir6UaKkU8/s1600/DSC_0216.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="377" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbIKFv6WBNEAOuRCQIOkInGiZHC9YtdjyXY6aFf1jJZlkZm71IsDvDb8lzTXOVSY2pOaCa4WU96do49tmrH1jJjVSGit8P_lZRjZsdHdz6gMFlDm9xdF8oAFYrhoH_CJGR3Tir6UaKkU8/s1600/DSC_0216.JPG" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
Für einzelne elektrische Isolierungen und zum Schutz können <a href="https://www.reichelt.de/Schrumpfschlauch-Abschnitte/SDH-1-6-SW/3/index.html?&ACTION=3&LA=2&ARTICLE=17394&GROUPID=5722&artnr=SDH+1%2C6+SW" target="_blank">Schrumpfschläuche</a> verwendet werden.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhR2at6LTkwXWoAfbXFAar0-sFI_d2We_11hWINhWV1otxXCbWtyHctR2s505o6ywAOSLOFemLSFDyjtc1HzGiYeVoROhCQrgxGermJWV9Ns3unGVQwOWj9eli3160MDCmTjWrTT9rebG8/s1600/DSC_0217.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhR2at6LTkwXWoAfbXFAar0-sFI_d2We_11hWINhWV1otxXCbWtyHctR2s505o6ywAOSLOFemLSFDyjtc1HzGiYeVoROhCQrgxGermJWV9Ns3unGVQwOWj9eli3160MDCmTjWrTT9rebG8/s1600/DSC_0217.JPG" width="400" /></a></div>
Auch das <a href="https://www.reichelt.de/Isoband/ISOBAND-SW/3/index.html?&ACTION=3&LA=5000&GROUP=CC&GROUPID=5746&ARTICLE=8975&START=0&SORT=artnr&OFFSET=16" target="_blank">Isolierband</a> kann für Isolierungen eingesetzt werden.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5DfI8_GsPf0u5sWrsCXNMd0OwH80OwEKMMEddJ7wa5JouFUsY-mTTS_FCASR752u5nIcZf3rsKdOtsiT4WUk5QmL4PPR1444LCeTmyCQOeFT7Lw8JapFWnH7oIDw8zmC9hZciphwb02k/s1600/DSC_0218.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="312" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5DfI8_GsPf0u5sWrsCXNMd0OwH80OwEKMMEddJ7wa5JouFUsY-mTTS_FCASR752u5nIcZf3rsKdOtsiT4WUk5QmL4PPR1444LCeTmyCQOeFT7Lw8JapFWnH7oIDw8zmC9hZciphwb02k/s1600/DSC_0218.JPG" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
Damit der Lautsprecher geschützt ist, wird noch ein passendes <a href="http://www.visaton.de/de/chassis_zubehoer/zubehoer/gitter_frs8.html" target="_blank">Schutzgitter</a> benötigt.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiff5repS318O999kEdDkUMmSpQ-D5XC-p551nIXgrO7z6vOb12jJt0LSB8HZ0PU8rMZD07VstYvQAfEmkMkkWbB0Q0tmPaT7c1wxVGaXqkKzh-HnMrvmzfSOAuc2pRWXJZKpnLnQI2TR0/s1600/DSC_0120.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiff5repS318O999kEdDkUMmSpQ-D5XC-p551nIXgrO7z6vOb12jJt0LSB8HZ0PU8rMZD07VstYvQAfEmkMkkWbB0Q0tmPaT7c1wxVGaXqkKzh-HnMrvmzfSOAuc2pRWXJZKpnLnQI2TR0/s1600/DSC_0120.JPG" width="400" /></a></div>
Das bisherige Potentiometer habe ich durch einen neuen <a href="http://www.conrad.de/ce/de/product/445536/Piher-Potentiometer-PC-16-PC16SH-10IP06103A2020MTA-M10-x-9-mm-Lin-10-k-02-W-20-" target="_blank">Potentiometer</a> ersetzt, der eine längere Achslänge und Gewinde hat.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKYMLsrwaKRnH-pzCOCFV5DY_WOLr3p1JcIu0TSaroa6cZB50_7yrElmhzSC4-n_zh2Oi1jISwpo_8O-dt2vf_YvRrZEbm2lHYxQZcTgzrSBmjdxRZxVCM9awZ94l2fyitaZ0DdkMN0X4/s1600/DSC_1266.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="166" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKYMLsrwaKRnH-pzCOCFV5DY_WOLr3p1JcIu0TSaroa6cZB50_7yrElmhzSC4-n_zh2Oi1jISwpo_8O-dt2vf_YvRrZEbm2lHYxQZcTgzrSBmjdxRZxVCM9awZ94l2fyitaZ0DdkMN0X4/s1600/DSC_1266.JPG" width="400" /></a></div>
Auch den bisherigen Kippschalter habe ich durch einen längeren <a href="http://www.sci.com.tw/PRODUCTS/switch/%28R13%29%20TOGGLE%20SWITCH/R13-25.htm" target="_blank">Kippschalter</a> ersetzt.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCtSUWkOBcq145pX55lOrAlajhRnbWZe46sr2QBTex3tSpB9ezxkQWBkiPO5V7RdgzM0mWN_Krx43caI8u9Gtmtcj8xdUBkEXPdj_qcTz36ktXTEOrv4sYpuk7kZrHu43bLRLM-Ox6Q-o/s1600/DSC_1265.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="214" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCtSUWkOBcq145pX55lOrAlajhRnbWZe46sr2QBTex3tSpB9ezxkQWBkiPO5V7RdgzM0mWN_Krx43caI8u9Gtmtcj8xdUBkEXPdj_qcTz36ktXTEOrv4sYpuk7kZrHu43bLRLM-Ox6Q-o/s1600/DSC_1265.JPG" width="320" /></a></div>
Auf dem Potentiometer kommt noch ein passender <a href="http://www.conrad.de/ce/de/product/183847/Mentor-Messgeraeteknopf-5216191-Glatt-Aluminium-Achs-Durchmesser-6-mm" target="_blank">Drehknopf</a>.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnPX__0421muHm7V_qvOxb99gXByYb06fvScKlSF-N0Wskx7_AC_Bh-KQfHRTC8M8_ml7DZ-B6qq76X_qDpsQIHJdepzPIijFLSL-v4ts3PyNi6cal2uq_0Dtylsa5Y-ZHyvrIxcu2RSc/s1600/DSC_0124.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnPX__0421muHm7V_qvOxb99gXByYb06fvScKlSF-N0Wskx7_AC_Bh-KQfHRTC8M8_ml7DZ-B6qq76X_qDpsQIHJdepzPIijFLSL-v4ts3PyNi6cal2uq_0Dtylsa5Y-ZHyvrIxcu2RSc/s1600/DSC_0124.JPG" width="312" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
Für die Befestigung der Platine werde ich 4 <a href="http://www.conrad.de/ce/de/product/534749/Kunststoff-Distanzbolzen-Fuer-isolierte-Befestigung-Polyamid-Schluesselweite-6-mm" target="_blank">Kunststoff-Distanzbolzen</a> (M3x10mm) mit einem Innen- (7mm) und einem Außengewinde (8mm) verwenden. Dazu kommen passende Senkschrauben M3/8 und passende Muttern M3.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiX8ji4Vc6I8O0DHzCqBDJhNIn0oUxjt9RCJCaOd7KE6wvfsSUVHcfd7i9YNOngZURhw4bHTOTpm9g18fvDUCCHEI3x-iTHC0wX-KjLLA9g0d-mrcrlaUc8eEUfjDxqVfm2kZuVs8MgBbA/s1600/DSC_1268.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="247" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiX8ji4Vc6I8O0DHzCqBDJhNIn0oUxjt9RCJCaOd7KE6wvfsSUVHcfd7i9YNOngZURhw4bHTOTpm9g18fvDUCCHEI3x-iTHC0wX-KjLLA9g0d-mrcrlaUc8eEUfjDxqVfm2kZuVs8MgBbA/s1600/DSC_1268.JPG" width="400" /></a></div>
Für die Befestigung des Lautsprechers kommen 4 Senkschrauben M4/20 und passende Muttern M4 zum Einsatz.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnFC95Y3p5bDWJ8HX0dug-iMwTG49rS6mTfc0PECWAZKxKoyV2HmV9itYUzvKlYvLbPOElDdscsc7eNMGquDBsq7BAdChe4vCXbkv0CTPCMpTcFj16VGRahaHLOoOziohvEvycHB4QOJE/s1600/DSC_0271.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnFC95Y3p5bDWJ8HX0dug-iMwTG49rS6mTfc0PECWAZKxKoyV2HmV9itYUzvKlYvLbPOElDdscsc7eNMGquDBsq7BAdChe4vCXbkv0CTPCMpTcFj16VGRahaHLOoOziohvEvycHB4QOJE/s1600/DSC_0271.JPG" width="390" /></a></div>
Der Batteriehalter wird durch 2 Senkschrauben M3/10 und passenden Muttern M3 an der Platine befestigt.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQehger3QwLhtMc7t6wWqJ1GXWwgv9peogx_OAZipJI2XUDBeVsaS09BUs3jZJ16qbBe4raHxaWylY9iOHuamBnd7s8Iv4JhnYpdHfBP10q0ep2SgCq0eWvouXeje37DfbTPkR5MpErAM/s1600/DSC_1274.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQehger3QwLhtMc7t6wWqJ1GXWwgv9peogx_OAZipJI2XUDBeVsaS09BUs3jZJ16qbBe4raHxaWylY9iOHuamBnd7s8Iv4JhnYpdHfBP10q0ep2SgCq0eWvouXeje37DfbTPkR5MpErAM/s1600/DSC_1274.JPG" width="400" /></a></div>
<br />
<br />
<span style="font-weight: normal;">Die elektronischen Teile habe ich diesmal bei <a href="http://www.reichelt.de/" target="_blank">Reichelt</a> oder <a href="http://www.conrad.de/" target="_blank">Conrad</a> gekauft. Schrauben und Muttern bekommt man gut bei <a href="http://www1.zweygart.de/" target="_blank">Zweygart</a>.</span><br />
<br />
Als nächstes werde ich mir einen Überblick über alle Komponenten verschaffen, die nun zum Einsatz kommen sollen.<br />
<br />
<br />
<h4>
Weitere Blogeinträge</h4>
<ol>
<li><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-1-auswahl-der.html"><b>Auswahl der Komponenten</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-2-das.html" target="_blank">Das Entwicklungsbrett</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-3-das-erste.html" target="_blank">Das erste Einschalten</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-4-die.html" target="_blank">Die Entwicklungsumgebung</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-5-knopfe.html" target="_blank">Knöpfe (digital)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-6-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (digital)</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-7-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (analog)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-8-potentiometer.html">Potentiometer</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-9-mp3-shield.html">Das MP3 Shield</a></b></li>
<li><b>Auswahl der Komponenten 2</b></li>
<li><b><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-11-auswahl-der.html">Auswahl der Komponenten (Zusammenfassung)</a> </b></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-12-punkt.html"><b>Punkt-Streifenrasterplatine und Knöpfe</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-13-punkt.html"><b>Punkt-Streifenrasterplatine und weitere Komponenten</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-14-das-gehause.html"><b>Das Gehäuse</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-15-sketch-1-setup.html"><b>Sketch 1 (setup-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/03/arduino-mp3-player-16-sketch-2-loop.html"><b>Sketch 2 (loop-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/04/arduino-mp3-player-17-sketch-3-der.html"><b>Sketch 3 (Der komplette Code)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/05/audino-arduino-mp3-player-18-pc-software.html"><b>PC-Software</b></a></li>
</ol>
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2359578464804578723.post-25962438990812339912014-12-22T00:13:00.000+01:002015-05-13T00:49:14.537+02:00Audino - Arduino MP3-Player (9) - Das MP3 ShieldDamit das MP3 Shield auf das Arduino-Board gesteckt und verwendet werden kann, müssen entweder die mitgelieferten Steckleisten zurechtgeschnitten und dran gelötet werden (<a href="https://learn.adafruit.com/adafruit-music-maker-shield-vs1053-mp3-wav-wave-ogg-vorbis-player/assembly" target="_blank">https://learn.adafruit.com/adafruit-music-maker-shield-vs1053-mp3-wav-wave-ogg-vorbis-player/assembly</a>) oder man besorgt sich passende Buchsenleisten (Header), die dann dran gelötet werden (<a href="https://learn.sparkfun.com/tutorials/arduino-shields/installing-headers-assembly" target="_blank">https://learn.sparkfun.com/tutorials/arduino-shields/installing-headers-assembly</a>).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSrAA20AF7tLzVJdOUNoUuVlFMwVgXMiTty0rjld2jd5l-XR7DnAnLKhpfdc5J9bVwHjTwsO_tYAuH2q-gB35tYlZUvvbFZ041Ca_LvxJowOhAVJvgwdVpEmrk0Lb8lbUAZGyQBHOOmSY/s1600/DSC_0118.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSrAA20AF7tLzVJdOUNoUuVlFMwVgXMiTty0rjld2jd5l-XR7DnAnLKhpfdc5J9bVwHjTwsO_tYAuH2q-gB35tYlZUvvbFZ041Ca_LvxJowOhAVJvgwdVpEmrk0Lb8lbUAZGyQBHOOmSY/s1600/DSC_0118.JPG" width="400" /></a></div>
<br />
Tipps über das Löten gibt es auf vielen Seiten, wie beispielsweise unter <a href="https://learn.sparkfun.com/tutorials/how-to-solder---through-hole-soldering" target="_blank">https://learn.sparkfun.com/tutorials/how-to-solder---through-hole-soldering</a> oder unter <a href="https://learn.adafruit.com/adafruit-guide-excellent-soldering/tools" target="_blank">https://learn.adafruit.com/adafruit-guide-excellent-soldering/tools</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqeW1Liej0Khh5aQAZw_SFfO6O2qYL_zDu2SH3Fn0FgSt4axRcTDvlcCqxBjCTyn3XkpIps1GTlRKCKqOxlAc0P7yE4dxDG0HN4x_y_GVbMwiSWcAm3pjym23f4fVJNrke00XNVrTOAhw/s1600/DSC_0115.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqeW1Liej0Khh5aQAZw_SFfO6O2qYL_zDu2SH3Fn0FgSt4axRcTDvlcCqxBjCTyn3XkpIps1GTlRKCKqOxlAc0P7yE4dxDG0HN4x_y_GVbMwiSWcAm3pjym23f4fVJNrke00XNVrTOAhw/s1600/DSC_0115.JPG" width="400" /></a></div>
<br />
Auch der 6-Pin Socket und die Endstücke für die Lautsprecher müssen drangelötet werden.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-Apm_ZaXVP1LLX7SS33OATkuBZRPCRyFQn6p5abl8f5Ehlu9us1hE0XHE9Ykt_fHlvQKovNZ06TEUdFram30PLg50ods7UbZx7nq41w0ntinPGE6jOC32_SNP9OY-a5yD0o0DUAxasH8/s1600/DSC_0117.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-Apm_ZaXVP1LLX7SS33OATkuBZRPCRyFQn6p5abl8f5Ehlu9us1hE0XHE9Ykt_fHlvQKovNZ06TEUdFram30PLg50ods7UbZx7nq41w0ntinPGE6jOC32_SNP9OY-a5yD0o0DUAxasH8/s1600/DSC_0117.JPG" width="424" /></a></div>
<br />
Falls noch die GPIOs des MP3 Shields benötigt werden, muss hier noch die passende <a href="https://www.reichelt.de/Buchsenleisten/MPE-094-2-014/3/index.html?&ACTION=3&LA=5000&GROUP=C142&GROUPID=3221&ARTICLE=119931&START=0&SORT=artnr&OFFSET=16" target="_blank">Buchsenleiste</a> (2x7) drangelötet werden.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdbKezq269vUAWQ_4rae_blSh8DH6LV1_5RwAK6Xv_FzcFgl-CEnCy85LsmN-po4ZxLQFs67DwIW_MlENUxx-BI8_e5lK7X4lrAoLKkPXcY3EFjaaaAEko7Ydmm-wCKAobg35z7OWqfgM/s1600/DSC_0123.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="241" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdbKezq269vUAWQ_4rae_blSh8DH6LV1_5RwAK6Xv_FzcFgl-CEnCy85LsmN-po4ZxLQFs67DwIW_MlENUxx-BI8_e5lK7X4lrAoLKkPXcY3EFjaaaAEko7Ydmm-wCKAobg35z7OWqfgM/s1600/DSC_0123.JPG" width="320" /></a></div>
<br />
<br />
Nachdem alles gelötet ist, kann die VS1053-Bibliothek installiert werden, die hier runtergeladen werden kann: <a href="https://learn.adafruit.com/adafruit-music-maker-shield-vs1053-mp3-wav-wave-ogg-vorbis-player/installing-software" target="_blank">https://learn.adafruit.com/adafruit-music-maker-shield-vs1053-mp3-wav-wave-ogg-vorbis-player/installing-software</a>.<br />
<br />
Das Vorgehen für die Installation innerhalb der Arduino-Entwicklungsumgebung kann hier nachgelesen werden:<a href="http://arduino.cc/en/Guide/Libraries" target="_blank">http://arduino.cc/en/Guide/Libraries</a>. Für die Installation unter Visual Studio/Visual Micro muss als erstes der richtige Pfad unter "Tools-->Visual Micro-->Configure Ide location--> Sketchbook location" angegeben werden. Dann kann unter "Project-->Add/Import Sketch Library-->User" die Bibliothek "Adafruit_VS1053" geladen werden.<br />
<br />
Mit dem Beispiel-Sketch "player_simple" kann das MP3 Shield getestet werden. Dabei muss darauf geachtet werden, dass das "shield-example object" anstelle des "breakout-example object" erzeugt wird.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3Q5JP6Zbxp-TWBTJroLKqfnv8p8a0_puwZEZZ4Hhj0_q7L4E-9u7Rb6JhTi6G1QwBQ3SvhtUABUSYx-pX8h-hWX_jMrU3nRJfhGKN_b6Y1CfdPfUlgYGiq_lvl2M8t7_9mC0d-w3bSeg/s1600/Arduino_player_simple.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="127" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3Q5JP6Zbxp-TWBTJroLKqfnv8p8a0_puwZEZZ4Hhj0_q7L4E-9u7Rb6JhTi6G1QwBQ3SvhtUABUSYx-pX8h-hWX_jMrU3nRJfhGKN_b6Y1CfdPfUlgYGiq_lvl2M8t7_9mC0d-w3bSeg/s1600/Arduino_player_simple.png" width="400" /></a></div>
<br />
Die Ausgabe des Serial Monitor gibt den Erfolg zurück.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOVHyqR61DPEH3vSDdRNbzlIKqyEwCZW6seOMuIaNaw1MHacLzaoAMhhSfaSiCRsWqfCgor2TFCUMylLxVfC0L5JDaad-uFxzXrv-yaWgGUfXBTwdQeUKK9TJpWUdNZBf3OTZe97H1oAw/s1600/Arduino_player_simple_output.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOVHyqR61DPEH3vSDdRNbzlIKqyEwCZW6seOMuIaNaw1MHacLzaoAMhhSfaSiCRsWqfCgor2TFCUMylLxVfC0L5JDaad-uFxzXrv-yaWgGUfXBTwdQeUKK9TJpWUdNZBf3OTZe97H1oAw/s1600/Arduino_player_simple_output.png" width="400" /></a></div>
<br />
Im nächsten Beitrag geht es um die noch fehlenden Komponenten.<br />
<br />
<br />
<h4>
Weitere Blogeinträge</h4>
<ol>
<li><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-1-auswahl-der.html"><b>Auswahl der Komponenten</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-2-das.html" target="_blank">Das Entwicklungsbrett</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-3-das-erste.html" target="_blank">Das erste Einschalten</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-4-die.html" target="_blank">Die Entwicklungsumgebung</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-5-knopfe.html" target="_blank">Knöpfe (digital)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-6-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (digital)</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-7-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (analog)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-8-potentiometer.html">Potentiometer</a></b></li>
<li><b>Das MP3 Shield</b></li>
<li><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-10-auswahl-der.html"><b>Auswahl der Komponenten 2</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-11-auswahl-der.html">Auswahl der Komponenten (Zusammenfassung)</a> </b></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-12-punkt.html"><b>Punkt-Streifenrasterplatine und Knöpfe</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-13-punkt.html"><b>Punkt-Streifenrasterplatine und weitere Komponenten</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-14-das-gehause.html"><b>Das Gehäuse</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-15-sketch-1-setup.html"><b>Sketch 1 (setup-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/03/arduino-mp3-player-16-sketch-2-loop.html"><b>Sketch 2 (loop-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/04/arduino-mp3-player-17-sketch-3-der.html"><b>Sketch 3 (Der komplette Code)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/05/audino-arduino-mp3-player-18-pc-software.html"><b>PC-Software</b></a></li>
</ol>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2359578464804578723.post-62738476115967254122014-12-15T23:44:00.000+01:002015-05-13T00:49:53.716+02:00Audino - Arduino MP3-Player (8) - Potentiometer Um die Lautstärke zu regulieren ist ein 10k Ohm Potentiometer vorgeshen. Der mittlere Pin des Potentiometers habe ich mit dem A5-Pin des Arduinos verbunden. Die äußeren Pins des Potentiometers werden mit der 5V-Stromversorgung und der Masse verbunden.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8dgJZgNLpIWIjQ6Mu2-mA-iUEi4QuZuRXT9NXj3rkCxz1XivUJEcfbu9OTkNUV_S8hDZWTDcCBFnD4wApV9DTxCD57PqNobvv05ZS7OyJZ32_9iLlJgTfauBEDVr29H_JWQ70wqo0rYw/s1600/DSC_0109.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8dgJZgNLpIWIjQ6Mu2-mA-iUEi4QuZuRXT9NXj3rkCxz1XivUJEcfbu9OTkNUV_S8hDZWTDcCBFnD4wApV9DTxCD57PqNobvv05ZS7OyJZ32_9iLlJgTfauBEDVr29H_JWQ70wqo0rYw/s1600/DSC_0109.JPG" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidSe1k1Md6Vu4mAaOOsgrKbS7UIuvtr3hPEi3A-LUflFUXMC_Ikz2FR0CpP6ei5zK2QsUju_i7WU-uuzCPlKPd104aCnXn4783TfN5IcvSB9kTOq99oBiwCeKgpaE8axGzKu_NJL7A2lc/s1600/Potentiometer_Steckplatine.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="286" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidSe1k1Md6Vu4mAaOOsgrKbS7UIuvtr3hPEi3A-LUflFUXMC_Ikz2FR0CpP6ei5zK2QsUju_i7WU-uuzCPlKPd104aCnXn4783TfN5IcvSB9kTOq99oBiwCeKgpaE8axGzKu_NJL7A2lc/s1600/Potentiometer_Steckplatine.png" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
Im Programmcode sind der verwendete Pin als Konstante und der Lautstärkenpegel als Variable definiert.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: green;">// the pin of the potentiometer that is used to control the volume</span>
<span style="color: blue;">const</span> <span style="color: blue;">int</span> volumePin = A5;
</pre>
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: green;">// variable for reading the potentiometer status</span>
<span style="color: blue;">int</span> volumeState = 0;</pre>
<br />
In der loop() Methode wird der aktuelle Status des Potentiometers ausgelesen. Der ausgelesene Wert wird in den Bereich von 0 bis 100 transformiert, um eine prozentualle Lautstärke zu erhalten. Der ausgelesene Wert wird mit dem gespeicherten Wert verglichen, wenn es eine Änderung um 2% festgestellt wird, wird der gespeicherte Wert durch den neuen ersetzt.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: blue;">int</span> state;
<span style="color: green;">// read the state of the volume potentiometer</span>
state = analogRead(volumePin);
<span style="color: green;">// set the range of the volume from 0 to 100</span>
state = map(state, 0, 1023, 0, 100);
<span style="color: green;">// recognize state (volume) changes in steps of two</span>
<span style="color: blue;">if</span> (state < volumeState - 1 || state > volumeState + 1)
{
<span style="color: green;">// remember the new volume state</span>
volumeState = state;
<span style="color: green;">// print out the state of the volume</span>
Serial.print(volumePin);
Serial.print(<span style="color: #a31515;">" volume "</span>);
Serial.println(volumeState);
}</pre>
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;">delay(1); <span style="color: green;">// delay in between reads for stability</span></pre>
<br />
Hier noch mal der gesamte Programmcode.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: green;">// constants won't change</span>
<span style="color: green;">// the pin of the potentiometer that is used to control the volume</span>
<span style="color: blue;">const</span> <span style="color: blue;">int</span> volumePin = A5;
<span style="color: green;">// variables will change</span>
<span style="color: green;">// variable for reading the potentiometer status</span>
<span style="color: blue;">int</span> volumeState = 0;
<span style="color: green;">// the setup routine runs once when you turn the device on or you press reset</span>
<span style="color: blue;">void</span> setup()
{
<span style="color: green;">// disable LED L</span>
pinMode(13, <span style="color: #6f008a;">OUTPUT</span>);
digitalWrite(13, <span style="color: #6f008a;">LOW</span>);
<span style="color: green;">// initialize serial communication at 9600 bits per second</span>
Serial.begin(9600);
}
<span style="color: green;">// the loop routine runs over and over again forever</span>
<span style="color: blue;">void</span> loop()
{
<span style="color: blue;">int</span> state;
<span style="color: green;">// read the state of the volume potentiometer</span>
state = analogRead(volumePin);
<span style="color: green;">// set the range of the volume from 0 to 100</span>
state = map(state, 0, 1023, 0, 100);
<span style="color: green;">// recognize state (volume) changes in steps of two</span>
<span style="color: blue;">if</span> (state < volumeState - 1 || state > volumeState + 1)
{
<span style="color: green;">// remember the new volume state</span>
volumeState = state;
<span style="color: green;">// print out the state of the volume</span>
Serial.print(volumePin);
Serial.print(<span style="color: #a31515;">" volume "</span>);
Serial.println(volumeState);
}
delay(1); <span style="color: green;">// delay in between reads for stability</span>
}</pre>
<br />
Als nächstes nehme ich mir das MP3 Shield näher unter die Lupe.<br />
<br />
<br />
<h4>
Weitere Blogeinträge</h4>
<ol>
<li><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-1-auswahl-der.html"><b>Auswahl der Komponenten</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-2-das.html" target="_blank">Das Entwicklungsbrett</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-3-das-erste.html" target="_blank">Das erste Einschalten</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-4-die.html" target="_blank">Die Entwicklungsumgebung</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-5-knopfe.html" target="_blank">Knöpfe (digital)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-6-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (digital)</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-7-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (analog)</a> </b></li>
<li><b>Potentiometer</b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-9-mp3-shield.html">Das MP3 Shield</a></b></li>
<li><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-10-auswahl-der.html"><b>Auswahl der Komponenten 2</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-11-auswahl-der.html">Auswahl der Komponenten (Zusammenfassung)</a> </b></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-12-punkt.html"><b>Punkt-Streifenrasterplatine und Knöpfe</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-13-punkt.html"><b>Punkt-Streifenrasterplatine und weitere Komponenten</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-14-das-gehause.html"><b>Das Gehäuse</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-15-sketch-1-setup.html"><b>Sketch 1 (setup-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/03/arduino-mp3-player-16-sketch-2-loop.html"><b>Sketch 2 (loop-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/04/arduino-mp3-player-17-sketch-3-der.html"><b>Sketch 3 (Der komplette Code)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/05/audino-arduino-mp3-player-18-pc-software.html"><b>PC-Software</b></a></li>
</ol>
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2359578464804578723.post-72775207028145298072014-12-14T23:39:00.000+01:002015-05-13T00:50:35.729+02:00Audino - Arduino MP3-Player (7) - Mehrere Knöpfe (analog)<br />
Um Pins zu sparen (falls diese knapp sein sollten), können die Knopfdrücke mehrerer Knöpfe auch über einen analogen Pin registriert werden (<a href="http://txapuzas.blogspot.de/2010/07/papertecladoanalogico-varios-pulsadores.html#" target="_blank">spanischer Blogeintrag dazu</a>). Hier sind 11 Knöpfe verwendet worden. Über einen analogen Pin wird festgestellt welcher Knopf gedrückt worden ist.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6SpNG1wvDXB-pd0c12XnuuyGktbejRz_D0d5CYL_G0zXhz17995ECY_cZ9KJjroNeHdqVu48P8YvPSmkczavKGuZqlmmgi2-KRvMdwZ10B1iFNjsUahcch9POy5a9JLMglu9jasFIPg4/s1600/DSC_0262.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6SpNG1wvDXB-pd0c12XnuuyGktbejRz_D0d5CYL_G0zXhz17995ECY_cZ9KJjroNeHdqVu48P8YvPSmkczavKGuZqlmmgi2-KRvMdwZ10B1iFNjsUahcch9POy5a9JLMglu9jasFIPg4/s1600/DSC_0262.JPG" width="424" /></a></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpcdFhSkYLmCOKOLvVlX0UN3aJoSx_BmfmJZEtK7XDKHZdk9eRQu0kNXlwQCaaICD3MfFG1fZOwXnWpi4TIozxn3fKYBvrfsUDWakPUFP-MR6sw052B6rStRZcBUSM_ITYwR9Q216WZyQ/s1600/11Buttons_Analog_Steckplatine.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="351" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpcdFhSkYLmCOKOLvVlX0UN3aJoSx_BmfmJZEtK7XDKHZdk9eRQu0kNXlwQCaaICD3MfFG1fZOwXnWpi4TIozxn3fKYBvrfsUDWakPUFP-MR6sw052B6rStRZcBUSM_ITYwR9Q216WZyQ/s1600/11Buttons_Analog_Steckplatine.png" width="400" /></a></div>
<br />
Dabei werden mehrere Widerstände in Reihe geschaltet. Die Knöpfe werden so angebracht, dass bei einem Knopfdruck eine Parallelschaltung entsteht, durch die eine bestimmte Anzahl von Widerständen übersprungen wird. Der Messpunkt liegt hinter dem siebten Widerstand. Dadurch kann die Reihenschaltung auf zwei Elemente zusammengefasst werden. Das erste Element umfasst die ersten sieben Widerstände und das zweite Element umfasst die letzten sechs Widerstände. Durch einen Knopfdruck entsteht nun eine Spannungsänderung, die über den analogen Eingang ausgelesen werden kann. Über den gemessenen Spannungswert kann auf den gedrückten Knopf geschlossen werden.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjU5HjS2Swpe9j9akHmydVMTY6P3ycxj1ZOl12EBj6nL-xlItuXVYuBGjZNwc3zkHRxRgY1n1M_yQSMC0Gi1T_bBhebR8rCS64lz7FwFRlG-nrwOjB3QgD7w8N54G25KG7aoBy3ZjCO2NU/s1600/Analog_Spannungswerte.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="327" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjU5HjS2Swpe9j9akHmydVMTY6P3ycxj1ZOl12EBj6nL-xlItuXVYuBGjZNwc3zkHRxRgY1n1M_yQSMC0Gi1T_bBhebR8rCS64lz7FwFRlG-nrwOjB3QgD7w8N54G25KG7aoBy3ZjCO2NU/s1600/Analog_Spannungswerte.png" width="400" /></a></div>
<br />
Dazu der passende Programmcode, der den gelesen Wert am analogen Pin A5 ausgebiet. Zudem wird, falls eine Taste gedrückt worden ist, die Nummer dieser Taste ausgegeben.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: green;">// constants won't change</span>
<span style="color: green;">// the number of the pin that is used for the pushbuttons</span>
<span style="color: blue;">const</span> <span style="color: blue;">int</span> buttonsPin = A5;
<span style="color: green;">// variables will change</span>
<span style="color: green;">// variable for the pressed button</span>
<span style="color: blue;">int</span> pressedButton = 0;
<span style="color: green;">// the setup routine runs once when you turn the device on or you press reset</span>
<span style="color: blue;">void</span> setup()
{
<span style="color: green;">// initialize serial communication at 9600 bits per second</span>
Serial.begin(9600);
}
<span style="color: green;">// the loop routine runs over and over again forever</span>
<span style="color: blue;">void</span> loop()
{
<span style="color: green;">// check if a button is pressed</span>
pressedButton = CheckButtons();
<span style="color: blue;">if</span> (pressedButton != 0)
{
Serial.print(<span style="color: #a31515;">"Taste: "</span>);
Serial.println(pressedButton);
delay(100);
}
}
<span style="color: green;">// returns 0 if no button is pressed,</span>
<span style="color: green;">// else the number of the pressed button is returned (1 - 11)</span>
<span style="color: blue;">int</span> CheckButtons()
{
<span style="color: blue;">int</span> buttonsPinValue = analogRead(buttonsPin);
<span style="color: blue;">int</span> pressedButton = 0;
Serial.println(buttonsPinValue);
<span style="color: blue;">if</span> (buttonsPinValue > 823)
{
<span style="color: green;">// button 6 has a value of about 878</span>
pressedButton = 6;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 725)
{
<span style="color: green;">// button 5 has a value of about 768</span>
pressedButton = 5;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 649)
{
<span style="color: green;">// button 4 has a value of about 683</span>
pressedButton = 4;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 586)
{
<span style="color: green;">// button 3 has a value of about 614</span>
pressedButton = 3;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 535)
{
<span style="color: green;">// button 2 has a value of about 559</span>
pressedButton = 2;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 492)
{
<span style="color: green;">// button 1 has a value of about 512</span>
pressedButton = 1;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 450)
{
<span style="color: green;">// if no button is pressed the value is of about 473</span>
pressedButton = 0;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 400)
{
<span style="color: green;">// button 8 has a value of about 427</span>
pressedButton = 11;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 340)
{
<span style="color: green;">// button 10 has a value of about 372</span>
pressedButton = 10;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 267)
{
<span style="color: green;">// button 9 has a value of about 307</span>
pressedButton = 9;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 178)
{
<span style="color: green;">// button 8 has a value of about 228</span>
pressedButton = 8;
}
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonsPinValue > 0)
{
<span style="color: green;">// button 7 has a value of about 128</span>
pressedButton = 7;
}
<span style="color: blue;">return</span> pressedButton;
}</pre>
<br />
Nächstes Mal werde ich mir die Verwendung eines Potentiometers anschauen.<br />
<br />
<br />
<h4>
Weitere Blogeinträge</h4>
<ol>
<li><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-1-auswahl-der.html"><b>Auswahl der Komponenten</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-2-das.html" target="_blank">Das Entwicklungsbrett</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-3-das-erste.html" target="_blank">Das erste Einschalten</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-4-die.html" target="_blank">Die Entwicklungsumgebung</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-5-knopfe.html" target="_blank">Knöpfe (digital)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-6-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (digital)</a></b></li>
<li><b>Mehrere Knöpfe (analog) </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-8-potentiometer.html">Potentiometer</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-9-mp3-shield.html">Das MP3 Shield</a></b></li>
<li><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-10-auswahl-der.html"><b>Auswahl der Komponenten 2</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-11-auswahl-der.html">Auswahl der Komponenten (Zusammenfassung)</a> </b></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-12-punkt.html"><b>Punkt-Streifenrasterplatine und Knöpfe</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-13-punkt.html"><b>Punkt-Streifenrasterplatine und weitere Komponenten</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-14-das-gehause.html"><b>Das Gehäuse</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-15-sketch-1-setup.html"><b>Sketch 1 (setup-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/03/arduino-mp3-player-16-sketch-2-loop.html"><b>Sketch 2 (loop-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/04/arduino-mp3-player-17-sketch-3-der.html"><b>Sketch 3 (Der komplette Code)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/05/audino-arduino-mp3-player-18-pc-software.html"><b>PC-Software</b></a></li>
</ol>
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2359578464804578723.post-6608533310466149382014-11-16T23:27:00.000+01:002015-05-13T00:51:11.924+02:00Audino - Arduino MP3-Player (6) - Mehrere Knöpfe (digital)Der Aufbau der Schaltung für mehrere Knöpfe ist nicht sonderlich anders als für einen Knopf. Es können sowohl digitale als auch analoge Pins verwendet werden. Hier sind 5 digitale und 5 analoge Pins verwendet worden. Alle werden als digitale Eingänge verwendet. Bei der Wahl der Pins ist berücksichtigt, welche Pins das MP3 Shield verwendet und welche nicht (<a href="https://learn.adafruit.com/adafruit-music-maker-shield-vs1053-mp3-wav-wave-ogg-vorbis-player/pinouts" target="_blank">https://learn.adafruit.com/adafruit-music-maker-shield-vs1053-mp3-wav-wave-ogg-vorbis-player/pinouts</a>).<br />
<br />
<table border="1"><tbody>
<tr style="background: lightgray;"><th style="padding: 4;">Digital Pin</th><th style="padding: 4;">Verwendet</th></tr>
<tr><td style="padding: 4;">#0</td><td style="padding: 4; text-align: right;">TX</td></tr>
<tr><td style="padding: 4;">#1</td><td style="padding: 4; text-align: right;">RX</td></tr>
<tr><td style="padding: 4;">#2</td><td style="padding: 4; text-align: right;">frei</td></tr>
<tr><td style="padding: 4;">#3</td><td style="padding: 4; text-align: right;">MP3 Shield</td></tr>
<tr><td style="padding: 4;">#4</td><td style="padding: 4; text-align: right;">MP3 Shield</td></tr>
<tr><td style="padding: 4;">#5</td><td style="padding: 4; text-align: right;">frei</td></tr>
<tr><td style="padding: 4;">#6</td><td style="padding: 4; text-align: right;">MP3 Shield</td></tr>
<tr><td style="padding: 4;">#7</td><td style="padding: 4; text-align: right;">MP3 Shield</td></tr>
<tr><td style="padding: 4;">#8</td><td style="padding: 4; text-align: right;">frei</td></tr>
<tr><td style="padding: 4;">#9</td><td style="padding: 4; text-align: right;">frei</td></tr>
<tr><td style="padding: 4;">#10</td><td style="padding: 4; text-align: right;">frei</td></tr>
<tr><td style="padding: 4;">#11</td><td style="padding: 4; text-align: right;">MP3 Shield</td></tr>
<tr><td style="padding: 4;">#12</td><td style="padding: 4; text-align: right;">MP3 Shield</td></tr>
<tr><td style="padding: 4;">#13</td><td style="padding: 4; text-align: right;">MP3 Shield</td></tr>
</tbody></table>
<br />
Als analoge Pins stehen A0 bis A5 zur Verfügung, die auch als digitale Eingänge verwendet werden können. Ein analoger Pin wird für den Potentiometer (Lautstärkeregelung) benötigt. Somit stehen insgesamt 10 Pins als digitale Eingänge vom Arduino-Board zur Verfügung. Weitere 7 Pins werden, falls benötigt,vom MP3 Shield zur Verfügung gestellt (<a href="https://learn.adafruit.com/adafruit-music-maker-shield-vs1053-mp3-wav-wave-ogg-vorbis-player/gpio-pins" target="_blank">https://learn.adafruit.com/adafruit-music-maker-shield-vs1053-mp3-wav-wave-ogg-vorbis-player/gpio-pins</a>).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqZtE3zcbTzvqz_iEgkR84WPXXqCqfLHpOtx_YZbnKVPQxK4g0QWSJH8a0CDaLgIQ2Sew_CRwB_eOh62fT7U_4fTDHVS1GVWrgBMzweQAeEhRSkd6C08sJ0rLFPUKkRbRhJynJNshB3NQ/s1600/DSC_0082.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqZtE3zcbTzvqz_iEgkR84WPXXqCqfLHpOtx_YZbnKVPQxK4g0QWSJH8a0CDaLgIQ2Sew_CRwB_eOh62fT7U_4fTDHVS1GVWrgBMzweQAeEhRSkd6C08sJ0rLFPUKkRbRhJynJNshB3NQ/s1600/DSC_0082.JPG" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4q85LgCsY-ja9Ly8tH3bflVzNMKlJt5LB50iy6ag0vkchGbHl8ZMIpISkp3QhDVAN7GBosS36JlIUVcDtiB9MS0_XwYrmJy-hR8hKt8s6oBzNqMwmPt2-7Qmmje6OrunkHA0_344SjKs/s1600/10Buttons_Steckplatine.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4q85LgCsY-ja9Ly8tH3bflVzNMKlJt5LB50iy6ag0vkchGbHl8ZMIpISkp3QhDVAN7GBosS36JlIUVcDtiB9MS0_XwYrmJy-hR8hKt8s6oBzNqMwmPt2-7Qmmje6OrunkHA0_344SjKs/s1600/10Buttons_Steckplatine.png" width="400" /></a></div>
Der Programmcode ist leicht verändert worden. Zum einen wird die LED nicht mehr verwendet. Dadurch ist die Logik des Programmcodes vereinfacht worden. Zum anderen werden Arrays verwendet, deren Inhalt über eine Schleife abgearbeitet wird. Dadurch konnten Codezeilen gespart werden, im Vergleich zum Ausprogrammieren der Logik für jeden einzelnen Pin.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: green;">// constants won't change</span>
<span style="color: green;">// the number of the pushbutton pins</span>
<span style="color: blue;">const</span> <span style="color: blue;">int</span> buttonPins[] = { 2, 5, 8, 9, 10, A0, A1, A2, A3, A4 };
<span style="color: green;">// variables will change</span>
<span style="color: green;">// variable for reading the pushbutton status</span>
<span style="color: blue;">int</span> buttonStates[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
<span style="color: green;">// variable for remember the number of button pressed</span>
<span style="color: blue;">int</span> counters[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
<span style="color: green;">// the setup routine runs once when you turn the device on or you press reset</span>
<span style="color: blue;">void</span> setup()
{
<span style="color: green;">// initialize the pushbutton pins as input and enable internal pull-up resistor</span>
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 0; i < (<span style="color: blue;">sizeof</span>(buttonPins) / <span style="color: blue;">sizeof</span>(<span style="color: blue;">int</span>)); i++)
{
pinMode(buttonPins[i], <span style="color: #6f008a;">INPUT_PULLUP</span>);
}
<span style="color: green;">// disable LED L</span>
pinMode(13, <span style="color: #6f008a;">OUTPUT</span>);
digitalWrite(13, <span style="color: #6f008a;">LOW</span>);
<span style="color: green;">// initialize serial communication at 9600 bits per second</span>
Serial.begin(9600);
}
<span style="color: green;">// the loop routine runs over and over again forever</span>
<span style="color: blue;">void</span> loop()
{
<span style="color: blue;">int</span> state;
<span style="color: green;">// go through all button pins</span>
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 0; i < 10; i++)
{
<span style="color: green;">// read the state of the pushbutton value</span>
state = digitalRead(buttonPins[i]);
<span style="color: green;">// recognize state changes: button pressed and button released</span>
<span style="color: blue;">if</span> (state != buttonStates[i])
{
<span style="color: green;">// remember new button state</span>
buttonStates[i] = state;
<span style="color: green;">// print out the state of the button</span>
Serial.print(buttonPins[i]);
Serial.print(<span style="color: #a31515;">" State changed "</span>);
Serial.println(buttonStates[i]);
<span style="color: green;">// button is pressed</span>
<span style="color: blue;">if</span> (buttonStates[i] == <span style="color: #6f008a;">LOW</span>)
{
<span style="color: green;">// increment number of button pressed</span>
counters[i]++;
<span style="color: green;">// print out the number of button pressed</span>
Serial.print(buttonPins[i]);
Serial.print(<span style="color: #a31515;">" counter: "</span>);
Serial.println(counters[i]);
}
<span style="color: green;">// button is released</span>
<span style="color: blue;">else</span>
{
<span style="color: green;">// print out new line</span>
Serial.println();
<span style="color: green;">// wait before next click is recognized</span>
delay(100);
}
}
}
}</pre>
<br />
Nächstes Mal werde ich mir eine Alternative für "Mehrere Knöpfe" mit analogen Pins anschauen.<br />
<br />
<br />
<h4>
Weitere Blogeinträge</h4>
<ol>
<li><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-1-auswahl-der.html"><b>Auswahl der Komponenten</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-2-das.html" target="_blank">Das Entwicklungsbrett</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-3-das-erste.html" target="_blank">Das erste Einschalten</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-4-die.html" target="_blank">Die Entwicklungsumgebung</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-5-knopfe.html" target="_blank">Knöpfe (digital)</a> </b></li>
<li><b>Mehrere Knöpfe (digital)</b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-7-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (analog)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-8-potentiometer.html">Potentiometer</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-9-mp3-shield.html">Das MP3 Shield</a></b></li>
<li><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-10-auswahl-der.html"><b>Auswahl der Komponenten 2</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-11-auswahl-der.html">Auswahl der Komponenten (Zusammenfassung)</a> </b></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-12-punkt.html"><b>Punkt-Streifenrasterplatine und Knöpfe</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-13-punkt.html"><b>Punkt-Streifenrasterplatine und weitere Komponenten</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-14-das-gehause.html"><b>Das Gehäuse</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-15-sketch-1-setup.html"><b>Sketch 1 (setup-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/03/arduino-mp3-player-16-sketch-2-loop.html"><b>Sketch 2 (loop-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/04/arduino-mp3-player-17-sketch-3-der.html"><b>Sketch 3 (Der komplette Code)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/05/audino-arduino-mp3-player-18-pc-software.html"><b>PC-Software</b></a></li>
</ol>
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2359578464804578723.post-18228656854632616152014-11-15T22:53:00.001+01:002015-05-13T00:51:56.795+02:00Audino - Arduino MP3-Player (5) - Knöpfe (digital)Knopfdrücke können im Arduino registriert werden. Nach einem Knopfdruck können dann entsprechende Aktionen ausgeführt werden. Ein einfacher Schaltkreis kann realisiert werden indem der Knopf mit dem digitalen Port 2 und der Masse verbunden wird. Dabei wird der interne <b>Pull-up</b> Widerstand verwendet. Alternativ kann eine Schaltung mit einem externen <b>Pull-down</b> Widerstand verwendet werden. Ein Beispiel dafür ist hier zu sehen <a href="http://arduino.cc/en/Tutorial/Button" target="_blank">Arduino - Button</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNcF70bV61UWj5QvNNwGNVH-_6IGmppTl7ayn4EUmsK4iWmpsR4Ncqh09oaBCDVTxSnYrnS0JiG8cIR-DwwCRxaCzAMualvfTlxX5kIfkoxwAg370bM2o2TJOgExzN5fbK2rp1S_8YceE/s1600/DSC_0081.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNcF70bV61UWj5QvNNwGNVH-_6IGmppTl7ayn4EUmsK4iWmpsR4Ncqh09oaBCDVTxSnYrnS0JiG8cIR-DwwCRxaCzAMualvfTlxX5kIfkoxwAg370bM2o2TJOgExzN5fbK2rp1S_8YceE/s1600/DSC_0081.JPG" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLfefSx2s5k2rp3KKlo6HgzIMimGs9MhbLwtHSOXv4TJ5uXsYbJKOPB3WBGF84R4CbUwp4HMmazUWy09JTYI5kpDahGtS_tueZNxvbm_UF_0GbzAnFiW7PBUVKpFXq8tJIB6VswzZSIHY/s1600/OneButton_Steckplatine.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="340" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLfefSx2s5k2rp3KKlo6HgzIMimGs9MhbLwtHSOXv4TJ5uXsYbJKOPB3WBGF84R4CbUwp4HMmazUWy09JTYI5kpDahGtS_tueZNxvbm_UF_0GbzAnFiW7PBUVKpFXq8tJIB6VswzZSIHY/s1600/OneButton_Steckplatine.png" width="400" /></a></div>
<br />
Der Programmcode schaltet solange der Knopf gedrückt wird die LED an. Wird der Knopf wieder losgelassen, wird die LED wieder ausgeschaltet. Jeder Knopfdruck wird gezählt. Der
aktuelle Status des Knopfs und die Anzahl der Knopfdrücke wird
über eine serielle Kommunikation ausgegeben.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: green;">// constants won't change</span>
<span style="color: blue;">const</span> <span style="color: blue;">int</span> buttonPin = 2; <span style="color: green;">// the number of the pushbutton pin</span>
<span style="color: blue;">const</span> <span style="color: blue;">int</span> ledPin = 13; <span style="color: green;">// the number of the LED pin</span>
<span style="color: green;">// variables will change</span>
<span style="color: blue;">int</span> buttonState = 0; <span style="color: green;">// variable for reading the pushbutton status</span>
<span style="color: blue;">int</span> counter = 0; <span style="color: green;">// variable for remember the number of button pressed</span>
<span style="color: green;">// the setup routine runs once when you turn the device on or you press reset</span>
<span style="color: blue;">void</span> setup()
{
<span style="color: green;">// initialize the LED pin as an output</span>
pinMode(ledPin, <span style="color: #6f008a;">OUTPUT</span>);
<span style="color: green;">// initialize the pushbutton pins as input and enable internal pull-up resistor</span>
pinMode(buttonPin, <span style="color: #6f008a;">INPUT_PULLUP</span>);
<span style="color: green;">// initialize serial communication at 9600 bits per second</span>
Serial.begin(9600);
}
<span style="color: green;">// the loop routine runs over and over again forever</span>
<span style="color: blue;">void</span> loop()
{
<span style="color: green;">// read the state of the pushbutton value</span>
<span style="color: blue;">int</span> state = digitalRead(buttonPin);
<span style="color: green;">// recognize state changes: button pressed and button released</span>
<span style="color: blue;">if</span> (state != buttonState)
{
<span style="color: green;">// remember new button state</span>
buttonState = state;
<span style="color: green;">// print out the state of the button</span>
Serial.print(<span style="color: #a31515;">"2 State changed "</span>);
Serial.println(buttonState);
<span style="color: green;">// button is pressed</span>
<span style="color: blue;">if</span> (buttonState == <span style="color: #6f008a;">LOW</span>)
{
<span style="color: green;">// turn LED on</span>
digitalWrite(ledPin, <span style="color: #6f008a;">HIGH</span>);
<span style="color: green;">// increment number of button pressed</span>
counter++;
<span style="color: green;">// print out the number of button pressed</span>
Serial.print(<span style="color: #a31515;">"2 counter: "</span>);
Serial.println(counter);
}
<span style="color: green;">// button is released</span>
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonState == <span style="color: #6f008a;">HIGH</span>)
{
<span style="color: green;">// turn LED off</span>
digitalWrite(ledPin, <span style="color: #6f008a;">LOW</span>);
}
}
}</pre>
<br />
Dieser Programmcode kann für Aktionen verwendet werden, die ausgeführt werden sollen, solange ein Knopf gedrückt ist. Eine Alternative zu dieser Logik ist es, dass eine Aktion bei einem Knopfdruck nur einmal ausgeführt werden soll. Dazu das folgende Beispiel. Der Programmcode schaltet bei einem Knopfdruck die LED an, bei einem weiteren Knopfdruck wieder aus. Jeder Knopfdruck wird gezählt. Der aktuelle Status des Knopfs, der LED und die Anzahl der Knopfdrücke wird über eine serielle Kommunikation ausgegeben.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: green;"></span><span style="color: green;">// constants won't change</span>
<span style="color: blue;">const</span> <span style="color: blue;">int</span> buttonPin = 2; <span style="color: green;">// the number of the pushbutton pin</span>
<span style="color: blue;">const</span> <span style="color: blue;">int</span> ledPin = 13; <span style="color: green;">// the number of the LED pin</span>
<span style="color: green;">// variables will change</span>
<span style="color: blue;">int</span> buttonState = 0; <span style="color: green;">// variable for reading the pushbutton status</span>
<span style="color: blue;">int</span> ledState = 0; <span style="color: green;">// variable for reading the LED status</span>
<span style="color: blue;">int</span> counter = 0; <span style="color: green;">// variable for remember the number of button pressed</span>
<span style="color: green;">// the setup routine runs once when you turn the device on or you press reset</span>
<span style="color: blue;">void</span> setup()
{
<span style="color: green;">// initialize the LED pin as an output</span>
pinMode(ledPin, <span style="color: #6f008a;">OUTPUT</span>);
<span style="color: green;">// initialize the pushbutton pins as input and enable internal pull-up resistor</span>
pinMode(buttonPin, <span style="color: #6f008a;">INPUT_PULLUP</span>);
<span style="color: green;">// initialize serial communication at 9600 bits per second</span>
Serial.begin(9600);
}
<span style="color: green;">// the loop routine runs over and over again forever</span>
<span style="color: blue;">void</span> loop()
{
<span style="color: green;">// read the state of the pushbutton value</span>
<span style="color: blue;">int</span> state = digitalRead(buttonPin);
<span style="color: green;">// recognize state changes: button pressed and button released</span>
<span style="color: blue;">if</span> (state != buttonState)
{
<span style="color: green;">// remember new button state</span>
buttonState = state;
<span style="color: green;">// print out the state of the button</span>
Serial.print(<span style="color: #a31515;">"2 State changed "</span>);
Serial.println(buttonState);
<span style="color: green;">// button is pressed and LED is off</span>
<span style="color: blue;">if</span> (buttonState == <span style="color: #6f008a;">LOW</span> && ledState == <span style="color: #6f008a;">LOW</span>)
{
<span style="color: green;">// remember new LED state</span>
ledState = <span style="color: #6f008a;">HIGH</span>;
<span style="color: green;">// turn LED on</span>
digitalWrite(ledPin, <span style="color: #6f008a;">HIGH</span>);
<span style="color: green;">// print out the state of the LED</span>
Serial.print(<span style="color: #a31515;">"2 Set high "</span>);
Serial.println(ledState);
<span style="color: green;">// increment number of button pressed</span>
counter++;
<span style="color: green;">// print out the number of button pressed</span>
Serial.print(<span style="color: #a31515;">"2 counter: "</span>);
Serial.println(counter);
}
<span style="color: green;">// button is pressed and LED is on</span>
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonState == <span style="color: #6f008a;">LOW</span> && ledState == <span style="color: #6f008a;">HIGH</span>)
{
<span style="color: green;">// remember new LED state</span>
ledState = <span style="color: #6f008a;">LOW</span>;
<span style="color: green;">// turn LED off</span>
digitalWrite(ledPin, <span style="color: #6f008a;">LOW</span>);
<span style="color: green;">// print out the state of the LED</span>
Serial.print(<span style="color: #a31515;">"2 Set low "</span>);
Serial.println(ledState);
<span style="color: green;">// increment number of button pressed</span>
counter++;
<span style="color: green;">// print out the number of button pressed</span>
Serial.print(<span style="color: #a31515;">"2 counter: "</span>);
Serial.println(counter);
}
<span style="color: green;">// button is released</span>
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (buttonState == <span style="color: #6f008a;">HIGH</span>)
{
<span style="color: green;">// print out new line</span>
Serial.println();
<span style="color: green;">// wait before next click is recognized</span>
delay(100);
}
}
}</pre>
<br />
<br />
Als nächstes werde ich die Schaltung und den Programmcode um weitere Knöpfe erweitern.<br />
<br />
<br />
<h4>
Weitere Blogeinträge</h4>
<ol>
<li><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-1-auswahl-der.html"><b>Auswahl der Komponenten</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-2-das.html" target="_blank">Das Entwicklungsbrett</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-3-das-erste.html" target="_blank">Das erste Einschalten</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-4-die.html" target="_blank">Die Entwicklungsumgebung</a></b></li>
<li><b>Knöpfe (digital) </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-6-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (digital)</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-7-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (analog)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-8-potentiometer.html">Potentiometer</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-9-mp3-shield.html">Das MP3 Shield</a></b></li>
<li><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-10-auswahl-der.html"><b>Auswahl der Komponenten 2</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-11-auswahl-der.html">Auswahl der Komponenten (Zusammenfassung)</a> </b></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-12-punkt.html"><b>Punkt-Streifenrasterplatine und Knöpfe</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-13-punkt.html"><b>Punkt-Streifenrasterplatine und weitere Komponenten</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-14-das-gehause.html"><b>Das Gehäuse</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-15-sketch-1-setup.html"><b>Sketch 1 (setup-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/03/arduino-mp3-player-16-sketch-2-loop.html"><b>Sketch 2 (loop-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/04/arduino-mp3-player-17-sketch-3-der.html"><b>Sketch 3 (Der komplette Code)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/05/audino-arduino-mp3-player-18-pc-software.html"><b>PC-Software</b></a></li>
</ol>
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2359578464804578723.post-87947213923201586042014-11-13T06:29:00.001+01:002015-05-13T00:52:33.594+02:00Audino - Arduino MP3-Player (4) - Die EntwicklungsumgebungDie Arduino Entwicklungsumgebung (Version 1.0.6) ist für die ersten Schritte ausreichend. Vor allem die enthaltenen Beispiele erleichtern den Einstieg.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQmJw9pOypf_tIcKcqs_JjQbqFX1kWCZ9S5TrrqYo_Vy1hR6nVSUJpwQ5UK5OtFvB_U68sZPa-bpy0nn85muxr5ocugXXPmSPWY8AKTImbgwePJ0xh6IJhj7jjX4-aOHR2HnLpkPSL6yU/s1600/Arduino_Beispiele.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="201" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQmJw9pOypf_tIcKcqs_JjQbqFX1kWCZ9S5TrrqYo_Vy1hR6nVSUJpwQ5UK5OtFvB_U68sZPa-bpy0nn85muxr5ocugXXPmSPWY8AKTImbgwePJ0xh6IJhj7jjX4-aOHR2HnLpkPSL6yU/s400/Arduino_Beispiele.png" width="400" /></a></div>
Allerdings ist die Entwicklungsumgebung wenig komfortabel sobald man eigenen Code schreiben möchte. Daher habe ich mich nach Alternativen umgesehen, die das Entwickeln erleichtern, weil beispielsweise Codevervollständigung oder die Anzeige von Typen und Methodenparametern vorhanden ist.<br />
<br />
Durch das Setzen von definierten Eigenschaften, das Einbinden von gewissen Werkzeugen oder das Installieren von bestimmten Plugins können die weitverbreiteten Entwicklungsumgebungen Microsoft Visual Studio, Atmel Studio oder Eclipse zur Entwicklung von Arduino-Software verwendet werden. Weitere Informationen dazu können unter dem Link <a href="http://playground.arduino.cc/Main/DevelopmentTools" target="_blank">http://playground.arduino.cc/Main/DevelopmentTools</a> gefunden werden.<br />
<br />
Gerade im Zusammenhang mit Visual Studio oder Atmel Studio, welches auf Visual Studio basiert, ist <a href="http://www.visualmicro.com/" target="_blank">Arduino IDE für Visual Studio von Visual Micro</a> interessant.<br />
<br />
Die Arduino-Entwicklung integriert sich in Visual Studio. <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTGOyVul-lj3AblwfR9_RlR9d2vh3AU39SucYuazMWONthuyrx8kh5WdE9ni1jTpU7ZDw107nOM3cxcaaS0-x3nTlVO1o66aaukvVognuEBsjubMb4F_ly6FnDBr8xRUCC9ugZN-jGsy0/s1600/Arduino_VS.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="31" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTGOyVul-lj3AblwfR9_RlR9d2vh3AU39SucYuazMWONthuyrx8kh5WdE9ni1jTpU7ZDw107nOM3cxcaaS0-x3nTlVO1o66aaukvVognuEBsjubMb4F_ly6FnDBr8xRUCC9ugZN-jGsy0/s400/Arduino_VS.png" width="400" /></a></div>
Es können einige Optionen angepasst werden.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIAQdjqz9Sg4xus70M6zGLMTN3qyQ_Fc9XMXiqliQ8WhM6pSc3tlKXisPFKqPhr-fktcJ04rP2g-zNT1PGwBSEYxOBz9WaWB6tV90Cs-FZL13VHsB1ATNVdGHtWmLcnXMbrbXSRJz9BVc/s1600/Arduino_VS_Options.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="305" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIAQdjqz9Sg4xus70M6zGLMTN3qyQ_Fc9XMXiqliQ8WhM6pSc3tlKXisPFKqPhr-fktcJ04rP2g-zNT1PGwBSEYxOBz9WaWB6tV90Cs-FZL13VHsB1ATNVdGHtWmLcnXMbrbXSRJz9BVc/s400/Arduino_VS_Options.png" width="400" /></a></div>
Zudem kann über Tools auf einige Funktionen zugegriffen werden.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioajv4g1kFHOLdDdIWmdHkVsQkzG1zJY1QjtV0j4Djo7Gh785iWFFDaKNAwHLRD2igTWKcbW-Y1hxQLXsnFK6pPwPth9SWIL3JAh_4ajcXSbQe4B5NDZYUmN9lH5RagnNf8cRayrcVz54/s1600/Arduino_VS_Tools.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="253" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioajv4g1kFHOLdDdIWmdHkVsQkzG1zJY1QjtV0j4Djo7Gh785iWFFDaKNAwHLRD2igTWKcbW-Y1hxQLXsnFK6pPwPth9SWIL3JAh_4ajcXSbQe4B5NDZYUmN9lH5RagnNf8cRayrcVz54/s400/Arduino_VS_Tools.png" width="400" /></a></div>
Über "New" oder "Open" kann ein "Sketch Project" angelegt bzw. geöffnet werden.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhJcw71R8OzCHBg-JhIXWCjm4ijuebE3i2DFrffFhepgJVcWGGQ_rGp3XtePZjCKByQB8LGshVXHVvUAO6Xp5vWOouAX8JbU3LJjoDfS6UxZM6OcUDZATeWzZscoPps7qNIpHrfZQcsK8/s1600/Arduino_VS_Projekt.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="103" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhJcw71R8OzCHBg-JhIXWCjm4ijuebE3i2DFrffFhepgJVcWGGQ_rGp3XtePZjCKByQB8LGshVXHVvUAO6Xp5vWOouAX8JbU3LJjoDfS6UxZM6OcUDZATeWzZscoPps7qNIpHrfZQcsK8/s400/Arduino_VS_Projekt.png" width="400" /></a></div>
Anschließend kann das Projekt in der IDE bearbeitet, hochgeladen und überwacht werden.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdXVIk63CT1zajf6eX16jOvo2iqBFIJI7R4A146Bp0V2LRLbAzUTqVBTY90sSASPAXaeIhxlJuiyDF_MBDkptDrNmDzmP3hxflKWVimDp5tiqcm6B4PnIifuBAg_c38Xte5EAqkimRVpg/s1600/Arduino_VS_Loaded_Project.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="359" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdXVIk63CT1zajf6eX16jOvo2iqBFIJI7R4A146Bp0V2LRLbAzUTqVBTY90sSASPAXaeIhxlJuiyDF_MBDkptDrNmDzmP3hxflKWVimDp5tiqcm6B4PnIifuBAg_c38Xte5EAqkimRVpg/s400/Arduino_VS_Loaded_Project.png" width="400" /></a></div>
Mit F5 oder mit einem Klick auf "Local Windows Debugger" wird das Projekt kompiliert und auf das Arduino geladen.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtACpFoly_RAIW4AOIGp42k0SHa33cqXf1LFj2pVAinyE3EqXw8rpAR5JXe5iu_IO1YY4YZNMW982RGBKHlVpGlC-BPzwT2VA7kXg6ZX6OknGJbAjjzwLUpQK-ns1hIXZk0V8zvaColZg/s1600/Arduino_VS_Debug.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtACpFoly_RAIW4AOIGp42k0SHa33cqXf1LFj2pVAinyE3EqXw8rpAR5JXe5iu_IO1YY4YZNMW982RGBKHlVpGlC-BPzwT2VA7kXg6ZX6OknGJbAjjzwLUpQK-ns1hIXZk0V8zvaColZg/s1600/Arduino_VS_Debug.png" /></a></div>
Um den Serial Monitor zu nutzen, muss nach dem hochladen des Projekts immer auf "Show the serial monitor tool window" gedrückt werden.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEif9ZWKRk3-9giu2ZtW-IJeYby6ggVtilhOIXdWhXDDrhMzWgZweS-4MTM0j74rfqXduZLz8SV1A5IYdb-olrFae-Fjyle8qUuYAVQtJzrxXV6ssh_6J58epoALPDOHZLMBxfijv9_O6Ro/s1600/Arduino_VS_Serial_Monitor.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEif9ZWKRk3-9giu2ZtW-IJeYby6ggVtilhOIXdWhXDDrhMzWgZweS-4MTM0j74rfqXduZLz8SV1A5IYdb-olrFae-Fjyle8qUuYAVQtJzrxXV6ssh_6J58epoALPDOHZLMBxfijv9_O6Ro/s1600/Arduino_VS_Serial_Monitor.png" /></a></div>
Es öffnet sich das Fenster, in welchem die serielle Kommunikation angezeigt wird.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5H5fjlrw3IYf1KWw_DAOS0n6j0MugnWmAa08IcxlN7vwyioHwcIWkUP2tSdvWm_tNpCBnuIUgwKF4WgGCjm8NF6T-33zFPmGe5Tsly02l8jKf3BbR4Ya4llkBY-lzMzu3KrFsSd2gWu0/s1600/Arduino_VS_Serial_Monitor_Window.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="236" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5H5fjlrw3IYf1KWw_DAOS0n6j0MugnWmAa08IcxlN7vwyioHwcIWkUP2tSdvWm_tNpCBnuIUgwKF4WgGCjm8NF6T-33zFPmGe5Tsly02l8jKf3BbR4Ya4llkBY-lzMzu3KrFsSd2gWu0/s400/Arduino_VS_Serial_Monitor_Window.png" width="400" /></a></div>
Um eine serielle <span style="font-family: "Times New Roman",serif; font-size: 12.0pt; line-height: 107%; mso-ansi-language: DE; mso-bidi-language: AR-SA; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: DE;">Kommunikation
</span> in Arduino herzustellen wird in der setup() Methode diese initialisiert.<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;">Serial.begin(9600);
</pre>
In der loop() Methode kann dann die serielle Kommunikation verwendet werden. Beispielsweise können Nachrichten gesendet werden.<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;">Serial.print(<span style="color: #a31515;">"2 State changed "</span>);
Serial.println(buttonState1);</pre>
Dies kann genutzt werden, um Fehler zu finden, was gerade dann sinnvoll ist, wenn kein Debugger zur Verfügung steht.<br />
<br />
Eine weitere interessante Anwendung ist <a href="http://fritzing.org/download/" target="_blank">Fritzing</a>. Mit dieser Anwendung können Schaltpläne erstellt werden. Es können auch die Aufbauten, die mit einer Steckplatine realisiert worden sind, visuell dokumentiert werden. Seit neustem ist in dieser Anwendung auch ein Code-Editor integriert.<br />
<br />
Einen Schritt weiter geht es hier <a href="http://123d.circuits.io/">http://123d.circuits.io/</a>. Hier kann das Arduino-Board sogar simuliert werden. Ich habe das Online-Tool allerdings nicht ausprobiert.<br />
<br />
<br />
Als nächstes werde ich mich mit den Knöpfen beschäftigen und versuchen ein Knopfdruck in Arduino zu registrieren.<br />
<br />
<h4>
Weitere Blogeinträge</h4>
<ol>
<li><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-1-auswahl-der.html"><b>Auswahl der Komponenten</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2014/10/arduino-mp3-player-2-das.html" target="_blank">Das Entwicklungsbrett</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-3-das-erste.html" target="_blank">Das erste Einschalten</a></b></li>
<li><b>Die Entwicklungsumgebung</b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-5-knopfe.html" target="_blank">Knöpfe (digital)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/11/arduino-mp3-player-6-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (digital)</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-7-mehrere-knopfe.html" target="_blank">Mehrere Knöpfe (analog)</a> </b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-8-potentiometer.html">Potentiometer</a></b></li>
<li><b><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-9-mp3-shield.html">Das MP3 Shield</a></b></li>
<li><a href="http://chrigas.blogspot.com/2014/12/arduino-mp3-player-10-auswahl-der.html"><b>Auswahl der Komponenten 2</b></a></li>
<li><b><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-11-auswahl-der.html">Auswahl der Komponenten (Zusammenfassung)</a> </b></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-12-punkt.html"><b>Punkt-Streifenrasterplatine und Knöpfe</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/01/arduino-mp3-player-13-punkt.html"><b>Punkt-Streifenrasterplatine und weitere Komponenten</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-14-das-gehause.html"><b>Das Gehäuse</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/02/arduino-mp3-player-15-sketch-1-setup.html"><b>Sketch 1 (setup-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/03/arduino-mp3-player-16-sketch-2-loop.html"><b>Sketch 2 (loop-Methode)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/04/arduino-mp3-player-17-sketch-3-der.html"><b>Sketch 3 (Der komplette Code)</b></a></li>
<li><a href="http://chrigas.blogspot.com/2015/05/audino-arduino-mp3-player-18-pc-software.html"><b>PC-Software</b></a></li>
</ol>
<br />
<br />Unknownnoreply@blogger.com0