|
| 1 | +<!DOCTYPE html> |
| 2 | +<html lang="en-US"> |
| 3 | + <head> |
| 4 | + <meta charset="utf-8"> |
| 5 | + <meta name="viewport" content="width=device-width,initial-scale=1"> |
| 6 | + <title>InputStream . Part1 | EloquentArduino</title> |
| 7 | + <meta name="description" content="A collection of eloquent APIs for Arduino"> |
| 8 | + <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.11.1/dist/katex.min.css" integrity="sha384-zB1R0rpPzHqg7Kpt0Aljp8JPLqbXI3bhnPWROx27a9N0Ll6ZP/+DiW/UqRcLbRjq" crossorigin="anonymous"> |
| 9 | + <script defer="true" src="https://cdn.jsdelivr.net/npm/katex@0.11.1/dist/katex.min.js" integrity="sha384-y23I5Q6l+B6vatafAwxRu/0oK/79VlbSz7Q9aiSZUvyWYIYsd+qj+o24G5ZU2zJz" crossorigin="anonymous"></script> |
| 10 | + |
| 11 | + <link rel="preload" href="/EloquentArduino/assets/css/0.styles.a949dd8e.css" as="style"><link rel="preload" href="/EloquentArduino/assets/js/app.2d29deaa.js" as="script"><link rel="preload" href="/EloquentArduino/assets/js/6.20135cc5.js" as="script"><link rel="prefetch" href="/EloquentArduino/assets/js/10.d18d8445.js"><link rel="prefetch" href="/EloquentArduino/assets/js/11.1fcda93d.js"><link rel="prefetch" href="/EloquentArduino/assets/js/12.71c3100b.js"><link rel="prefetch" href="/EloquentArduino/assets/js/13.28c14d81.js"><link rel="prefetch" href="/EloquentArduino/assets/js/14.e2b02aab.js"><link rel="prefetch" href="/EloquentArduino/assets/js/15.b6727a3b.js"><link rel="prefetch" href="/EloquentArduino/assets/js/16.c22cc59a.js"><link rel="prefetch" href="/EloquentArduino/assets/js/17.301f8078.js"><link rel="prefetch" href="/EloquentArduino/assets/js/18.9bfef7ce.js"><link rel="prefetch" href="/EloquentArduino/assets/js/19.7e08e6a1.js"><link rel="prefetch" href="/EloquentArduino/assets/js/2.c3c2ef99.js"><link rel="prefetch" href="/EloquentArduino/assets/js/20.86b3dfc4.js"><link rel="prefetch" href="/EloquentArduino/assets/js/21.5d82e070.js"><link rel="prefetch" href="/EloquentArduino/assets/js/3.aef08e8b.js"><link rel="prefetch" href="/EloquentArduino/assets/js/4.682a9bca.js"><link rel="prefetch" href="/EloquentArduino/assets/js/5.0d52884a.js"><link rel="prefetch" href="/EloquentArduino/assets/js/7.71090359.js"><link rel="prefetch" href="/EloquentArduino/assets/js/8.89bf04f1.js"><link rel="prefetch" href="/EloquentArduino/assets/js/9.2147c3b5.js"> |
| 12 | + <link rel="stylesheet" href="/EloquentArduino/assets/css/0.styles.a949dd8e.css"> |
| 13 | + </head> |
| 14 | + <body> |
| 15 | + <div id="app" data-server-rendered="true"><div class="theme-container no-sidebar"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/EloquentArduino/" class="home-link router-link-active"><!----> <span class="site-name">EloquentArduino</span></a> <div class="links" style="max-width:nullpx;"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/EloquentArduino/Blog.html" class="nav-link">Blog</a></div><div class="nav-item"><a href="/EloquentArduino/docs.html" class="nav-link">Docs</a></div> <!----></nav></div></header> <div class="sidebar-mask"></div> <div class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/EloquentArduino/Blog.html" class="nav-link">Blog</a></div><div class="nav-item"><a href="/EloquentArduino/docs.html" class="nav-link">Docs</a></div> <!----></nav> <!----> </div> <div class="page"> <div class="content"><h1 id="io-inputstream-part1"><a href="#io-inputstream-part1" aria-hidden="true" class="header-anchor">#</a> IO::InputStream . Part1</h1> <p><code>InputStream</code> is an abstract class to interact with, well, input streams! |
| 16 | +What are input streams, by the way? Simply put, an input stream is any thing |
| 17 | +that generates values over time. Examples of input streams are an input pin |
| 18 | +(digital or analog) and any kind of sensor that returns a numeric value.</p> <p>Why do we need input streams? Because we can manipulate them using |
| 19 | +a uniform interface. We can carry all sort of operations on the values |
| 20 | +generated by the stream, careless of where those values come from. |
| 21 | +This means we can implement "abstract" algorithms that can be reused |
| 22 | +multiple times on different data.</p> <p>Want an example? Let's say you want to apply <a href="https://en.wikipedia.org/wiki/Exponential_smoothing" target="_blank" rel="noopener noreferrer">Exponential Smoothing<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a> |
| 23 | +to an analog potentiometer. To get this working you will need 3 variables: the current value, the past value |
| 24 | +and the smoothing factor (in the range ]0, 1]). <br> |
| 25 | +With the InputStream construct you may use a <code>Transformer</code> instead. |
| 26 | +A Transformer is a class that gets values from an input stream and transforms |
| 27 | +them in some way. So an exponential smoothing transformer in action over an |
| 28 | +analog input stream will look like the following:</p> <div class="language-c extra-class"><pre class="language-c"><code>AnalogInputStream <span class="token function">potentiometer</span><span class="token punctuation">(</span>A0<span class="token punctuation">)</span><span class="token punctuation">;</span> |
| 29 | + |
| 30 | +<span class="token keyword">void</span> <span class="token function">setup</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> |
| 31 | + potentiometer<span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span>new <span class="token function">ExponentialSmoothing</span><span class="token punctuation">(</span><span class="token number">0.5</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
| 32 | +<span class="token punctuation">}</span> |
| 33 | + |
| 34 | +<span class="token keyword">void</span> <span class="token function">loop</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> |
| 35 | + Serial<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>potentiomenter<span class="token punctuation">.</span><span class="token function">read</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
| 36 | +<span class="token punctuation">}</span> |
| 37 | +</code></pre></div><p>Now, the input stream transparently takes care of managing its transformer, |
| 38 | +so you can just get the processed value with the <code>read()</code> method. If you have |
| 39 | +set a transformer, it will transform your value, otherwise you'll get the raw |
| 40 | +value.</p> <p>Do you know what's the best part? Transformers are <strong>chainable</strong> 🔥🔥🔥<br> |
| 41 | +If you want to map your smoothed potentiometer from [0, 1024] to [0, 100], for example, |
| 42 | +you can chain a <code>Map</code> transformer:</p> <div class="language-c extra-class"><pre class="language-c"><code>AnalogPinInputStream <span class="token function">potentiometer</span><span class="token punctuation">(</span>A0<span class="token punctuation">)</span><span class="token punctuation">;</span> |
| 43 | + |
| 44 | +<span class="token keyword">void</span> <span class="token function">setup</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> |
| 45 | + potentiometer |
| 46 | + <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span>new <span class="token function">ExponentialSmoothing</span><span class="token punctuation">(</span><span class="token number">0.5</span><span class="token punctuation">)</span><span class="token punctuation">)</span> |
| 47 | + <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span>new <span class="token function">Map</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1024</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
| 48 | +<span class="token punctuation">}</span> |
| 49 | + |
| 50 | +<span class="token keyword">void</span> <span class="token function">loop</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> |
| 51 | + Serial<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>potentiomenter<span class="token punctuation">.</span><span class="token function">read</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
| 52 | +<span class="token punctuation">}</span> |
| 53 | +</code></pre></div><p>As you can see, the loop didn't changed at all: the transformers are totally |
| 54 | +transparent to you!</p> <p>In <a href="/EloquentArduino/Blog/series/Eloquent/IO/InputStream_2.html">Part 2</a> we'll dig deeper into the available input streams.</p></div> <div class="page-edit"><!----> <!----></div> <!----> </div> <!----></div></div> |
| 55 | + <script src="/EloquentArduino/assets/js/app.2d29deaa.js" defer></script><script src="/EloquentArduino/assets/js/6.20135cc5.js" defer></script> |
| 56 | + </body> |
| 57 | +</html> |
0 commit comments