<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://replica.wiki.extremist.software/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=ESP8266</id>
	<title>Noisebridge - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://replica.wiki.extremist.software/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=ESP8266"/>
	<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/wiki/Special:Contributions/ESP8266"/>
	<updated>2026-04-05T16:56:13Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.13</generator>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=ESP8266/Py&amp;diff=55624</id>
		<title>ESP8266/Py</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=ESP8266/Py&amp;diff=55624"/>
		<updated>2016-12-09T23:46:05Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: install #00A Ⅹ&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;microPython on ESP8266&lt;br /&gt;
&lt;br /&gt;
== update firmware ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
esptool --port /dev/ttyUSB0 erase_flash&lt;br /&gt;
esptool --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect 0 esp8266-20161110-v1.8.6.bin &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== blink/wink ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import machine&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; led = machine.Pin(2, machine.Pin.OUT)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; led.high()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; led.low()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; from time import sleep&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; def blink():&lt;br /&gt;
...     led.low()&lt;br /&gt;
...     sleep(0.5)&lt;br /&gt;
...     led.high()&lt;br /&gt;
... &lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; blink()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; def wink():&lt;br /&gt;
...     led.low()&lt;br /&gt;
...     sleep(0.1)&lt;br /&gt;
...     led.high()&lt;br /&gt;
...     sleep(0.2)&lt;br /&gt;
...     led.low()&lt;br /&gt;
...     sleep(0.1)&lt;br /&gt;
...     led.high()&lt;br /&gt;
... &lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; wink()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== in/out w/weather ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import dht&lt;br /&gt;
import machine&lt;br /&gt;
from machine import Pin&lt;br /&gt;
from time import sleep&lt;br /&gt;
&lt;br /&gt;
d3 = machine.Pin(3, machine.Pin.OUT)&lt;br /&gt;
d0 = machine.Pin(0, machine.Pin.IN)&lt;br /&gt;
d2 = machine.Pin(2, machine.Pin.IN)&lt;br /&gt;
d4 = machine.Pin(4, machine.Pin.OUT)&lt;br /&gt;
d5 = machine.Pin(5, machine.Pin.OUT)&lt;br /&gt;
&lt;br /&gt;
d = dht.DHT11(machine.Pin(1))&lt;br /&gt;
&lt;br /&gt;
def callback(p):&lt;br /&gt;
 if p == d2:&lt;br /&gt;
  if d4.value() == 0:&lt;br /&gt;
   d4.high()&lt;br /&gt;
  else:&lt;br /&gt;
   d4.low()&lt;br /&gt;
  sleep(1)&lt;br /&gt;
  beep()&lt;br /&gt;
 elif p == d0:&lt;br /&gt;
  if d5.value() == 0:&lt;br /&gt;
   d5.high()&lt;br /&gt;
  else:&lt;br /&gt;
   d5.low()&lt;br /&gt;
  sleep(1)&lt;br /&gt;
  beep()&lt;br /&gt;
  beep()&lt;br /&gt;
&lt;br /&gt;
d2.irq(trigger=Pin.IRQ_FALLING, handler=callback)&lt;br /&gt;
d0.irq(trigger=Pin.IRQ_FALLING, handler=callback)&lt;br /&gt;
&lt;br /&gt;
def weather():&lt;br /&gt;
 d.measure()&lt;br /&gt;
 t = d.temperature()&lt;br /&gt;
 h = d.humidity()&lt;br /&gt;
 print(t, h)&lt;br /&gt;
&lt;br /&gt;
def beep():&lt;br /&gt;
 d3.high()&lt;br /&gt;
 sleep(.1)&lt;br /&gt;
 d3.low()&lt;br /&gt;
 sleep(.2)&lt;br /&gt;
&lt;br /&gt;
beep()&lt;br /&gt;
beep()&lt;br /&gt;
beep()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PS2&#039;ish ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; d0 = machine.Pin(4, machine.Pin.IN, machine.Pin.PULL_UP)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; d1 = machine.Pin(5, machine.Pin.IN, machine.Pin.PULL_UP)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; d0.value()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; def callback(p):&lt;br /&gt;
...     print(p, p.value())&lt;br /&gt;
... &lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; from machine import Pin&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; d0.irq(trigger=Pin.IRQ_FALLING | Pin.IRQ_RISING, handler=callback)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; d1.irq(trigger=Pin.IRQ_FALLING | Pin.IRQ_RISING, handler=callback)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import machine&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; from machine import Pin&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import utime&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; def callback(p):&lt;br /&gt;
...     print(utime.ticks_us())&lt;br /&gt;
... &lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; d0 = machine.Pin(4, machine.Pin.IN)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; d0.irq(trigger=Pin.IRQ_FALLING, handler=callback)&lt;br /&gt;
&amp;lt;IRQ&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;SPACE&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; 161328207&lt;br /&gt;
161328513&lt;br /&gt;
161328708&lt;br /&gt;
161328900&lt;br /&gt;
161405882&lt;br /&gt;
161406119&lt;br /&gt;
161406266&lt;br /&gt;
161406458&lt;br /&gt;
161406648&lt;br /&gt;
161406845&lt;br /&gt;
161408507&lt;br /&gt;
161408654&lt;br /&gt;
161408849&lt;br /&gt;
161409041&lt;br /&gt;
161409239&lt;br /&gt;
161409433&lt;br /&gt;
&lt;br /&gt;
&#039;SPACE&#039;&lt;br /&gt;
165145125&lt;br /&gt;
165145405&lt;br /&gt;
165145596&lt;br /&gt;
165145797&lt;br /&gt;
165145992&lt;br /&gt;
165211956&lt;br /&gt;
165212194&lt;br /&gt;
165212385&lt;br /&gt;
165212586&lt;br /&gt;
165212782&lt;br /&gt;
165212928&lt;br /&gt;
165214540&lt;br /&gt;
165214737&lt;br /&gt;
165214934&lt;br /&gt;
165215129&lt;br /&gt;
165215276&lt;br /&gt;
165215469&lt;br /&gt;
&lt;br /&gt;
&#039;SPACE&#039;&lt;br /&gt;
167842588&lt;br /&gt;
167842838&lt;br /&gt;
167843033&lt;br /&gt;
167843180&lt;br /&gt;
167843373&lt;br /&gt;
167920437&lt;br /&gt;
167920681&lt;br /&gt;
167920877&lt;br /&gt;
167921023&lt;br /&gt;
167921216&lt;br /&gt;
167921407&lt;br /&gt;
167923024&lt;br /&gt;
167923219&lt;br /&gt;
167923370&lt;br /&gt;
167923581&lt;br /&gt;
167923772&lt;br /&gt;
167923969&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import machine&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; from machine import Pin&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import utime&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; def callback(p):&lt;br /&gt;
...     print(utime.ticks_us(), p.value(), p)&lt;br /&gt;
... &lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; d0 = machine.Pin(4, machine.Pin.IN)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; d1 = machine.Pin(5, machine.Pin.IN)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; d0.irq(trigger=Pin.IRQ_FALLING, handler=callback)&lt;br /&gt;
&amp;lt;IRQ&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; d1.irq(trigger=Pin.IRQ_FALLING | Pin.IRQ_RISING, handler=callback)&lt;br /&gt;
&amp;lt;IRQ&amp;gt;&lt;br /&gt;
[SPACE]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; 210770016 1 Pin(5)&lt;br /&gt;
210770569 0 Pin(4)&lt;br /&gt;
210770865 1 Pin(5)&lt;br /&gt;
210771213 1 Pin(4)&lt;br /&gt;
210771514 1 Pin(5)&lt;br /&gt;
210847670 0 Pin(5)&lt;br /&gt;
210848033 1 Pin(4)&lt;br /&gt;
210848336 1 Pin(4)&lt;br /&gt;
210848682 1 Pin(5)&lt;br /&gt;
210848986 1 Pin(4)&lt;br /&gt;
210850323 1 Pin(5)&lt;br /&gt;
210850627 1 Pin(4)&lt;br /&gt;
210850921 0 Pin(5)&lt;br /&gt;
210851268 0 Pin(4)&lt;br /&gt;
210852497 1 Pin(5)&lt;br /&gt;
&lt;br /&gt;
[SPACE]&lt;br /&gt;
214292169 0 Pin(5)&lt;br /&gt;
214292636 1 Pin(4)&lt;br /&gt;
214292932 1 Pin(5)&lt;br /&gt;
214293280 0 Pin(4)&lt;br /&gt;
214293580 1 Pin(5)&lt;br /&gt;
214402831 0 Pin(5)&lt;br /&gt;
214403247 0 Pin(4)&lt;br /&gt;
214403540 1 Pin(5)&lt;br /&gt;
214403890 0 Pin(4)&lt;br /&gt;
214405434 1 Pin(5)&lt;br /&gt;
214405740 0 Pin(4)&lt;br /&gt;
214406038 0 Pin(5)&lt;br /&gt;
214406336 0 Pin(4)&lt;br /&gt;
214406678 1 Pin(5)&lt;br /&gt;
&lt;br /&gt;
[Caps]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; 223902923 1 Pin(5)&lt;br /&gt;
223903519 0 Pin(4)`&lt;br /&gt;
223903810 1 Pin(5)&lt;br /&gt;
223904113 1 Pin(4)&lt;br /&gt;
223904456 1 Pin(5)&lt;br /&gt;
223964179 0 Pin(5)&lt;br /&gt;
223964508 0 Pin(4)&lt;br /&gt;
223964806 0 Pin(4)&lt;br /&gt;
223965101 1 Pin(5)&lt;br /&gt;
223965451 1 Pin(4)&lt;br /&gt;
223966912 0 Pin(5)&lt;br /&gt;
223967413 0 Pin(4)&lt;br /&gt;
223967746 1 Pin(5)&lt;br /&gt;
223968047 0 Pin(4)&lt;br /&gt;
223968997 1 Pin(5)&lt;br /&gt;
&lt;br /&gt;
[U]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; 231044948 1 Pin(5)&lt;br /&gt;
231045553 0 Pin(4)&lt;br /&gt;
231045848 1 Pin(5)&lt;br /&gt;
231046203 1 Pin(4)&lt;br /&gt;
231133566 0 Pin(5)&lt;br /&gt;
231133897 1 Pin(4)&lt;br /&gt;
231134194 0 Pin(4)&lt;br /&gt;
231134492 1 Pin(5)&lt;br /&gt;
231134842 1 Pin(4)&lt;br /&gt;
231136321 1 Pin(5)&lt;br /&gt;
231136711 0 Pin(4)&lt;br /&gt;
231137006 1 Pin(5)&lt;br /&gt;
231137305 0 Pin(4)&lt;br /&gt;
231138390 1 Pin(5)&lt;br /&gt;
&lt;br /&gt;
[U]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; 232928590 1 Pin(5)&lt;br /&gt;
232929128 1 Pin(4)&lt;br /&gt;
232929436 1 Pin(5)&lt;br /&gt;
232929735 1 Pin(4)&lt;br /&gt;
232930084 1 Pin(5)&lt;br /&gt;
233011829 0 Pin(5)&lt;br /&gt;
233012233 1 Pin(4)&lt;br /&gt;
233012527 1 Pin(5)&lt;br /&gt;
233012829 0 Pin(4)&lt;br /&gt;
233014394 0 Pin(5)&lt;br /&gt;
233014699 0 Pin(4)&lt;br /&gt;
233014994 0 Pin(5)&lt;br /&gt;
233015294 0 Pin(4)&lt;br /&gt;
233015587 1 Pin(5)&lt;br /&gt;
&lt;br /&gt;
[U]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; 234233385 1 Pin(5)&lt;br /&gt;
234233821 0 Pin(4)&lt;br /&gt;
234234119 1 Pin(5)&lt;br /&gt;
234234418 0 Pin(4)&lt;br /&gt;
234234713 1 Pin(5)&lt;br /&gt;
234311186 0 Pin(5)&lt;br /&gt;
234311583 0 Pin(4)&lt;br /&gt;
234311878 1 Pin(5)&lt;br /&gt;
234312179 0 Pin(4)&lt;br /&gt;
234313706 0 Pin(5)&lt;br /&gt;
234314064 0 Pin(4)&lt;br /&gt;
234314362 1 Pin(5)&lt;br /&gt;
234314665 0 Pin(4)&lt;br /&gt;
234314959 1 Pin(5)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=ESP8266/Py&amp;diff=55437</id>
		<title>ESP8266/Py</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=ESP8266/Py&amp;diff=55437"/>
		<updated>2016-12-04T07:04:32Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: #B0B 槿&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;microPython on ESP8266&lt;br /&gt;
&lt;br /&gt;
== blink/wink ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import machine&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; led = machine.Pin(2, machine.Pin.OUT)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; led.high()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; led.low()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; from time import sleep&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; def blink():&lt;br /&gt;
...     led.low()&lt;br /&gt;
...     sleep(0.5)&lt;br /&gt;
...     led.high()&lt;br /&gt;
... &lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; blink()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; def wink():&lt;br /&gt;
...     led.low()&lt;br /&gt;
...     sleep(0.1)&lt;br /&gt;
...     led.high()&lt;br /&gt;
...     sleep(0.2)&lt;br /&gt;
...     led.low()&lt;br /&gt;
...     sleep(0.1)&lt;br /&gt;
...     led.high()&lt;br /&gt;
... &lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; wink()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== in/out w/weather ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import dht&lt;br /&gt;
import machine&lt;br /&gt;
from machine import Pin&lt;br /&gt;
from time import sleep&lt;br /&gt;
&lt;br /&gt;
d3 = machine.Pin(3, machine.Pin.OUT)&lt;br /&gt;
d0 = machine.Pin(0, machine.Pin.IN)&lt;br /&gt;
d2 = machine.Pin(2, machine.Pin.IN)&lt;br /&gt;
d4 = machine.Pin(4, machine.Pin.OUT)&lt;br /&gt;
d5 = machine.Pin(5, machine.Pin.OUT)&lt;br /&gt;
&lt;br /&gt;
d = dht.DHT11(machine.Pin(1))&lt;br /&gt;
&lt;br /&gt;
def callback(p):&lt;br /&gt;
 if p == d2:&lt;br /&gt;
  if d4.value() == 0:&lt;br /&gt;
   d4.high()&lt;br /&gt;
  else:&lt;br /&gt;
   d4.low()&lt;br /&gt;
  sleep(1)&lt;br /&gt;
  beep()&lt;br /&gt;
 elif p == d0:&lt;br /&gt;
  if d5.value() == 0:&lt;br /&gt;
   d5.high()&lt;br /&gt;
  else:&lt;br /&gt;
   d5.low()&lt;br /&gt;
  sleep(1)&lt;br /&gt;
  beep()&lt;br /&gt;
  beep()&lt;br /&gt;
&lt;br /&gt;
d2.irq(trigger=Pin.IRQ_FALLING, handler=callback)&lt;br /&gt;
d0.irq(trigger=Pin.IRQ_FALLING, handler=callback)&lt;br /&gt;
&lt;br /&gt;
def weather():&lt;br /&gt;
 d.measure()&lt;br /&gt;
 t = d.temperature()&lt;br /&gt;
 h = d.humidity()&lt;br /&gt;
 print(t, h)&lt;br /&gt;
&lt;br /&gt;
def beep():&lt;br /&gt;
 d3.high()&lt;br /&gt;
 sleep(.1)&lt;br /&gt;
 d3.low()&lt;br /&gt;
 sleep(.2)&lt;br /&gt;
&lt;br /&gt;
beep()&lt;br /&gt;
beep()&lt;br /&gt;
beep()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PS2&#039;ish ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; d0 = machine.Pin(4, machine.Pin.IN, machine.Pin.PULL_UP)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; d1 = machine.Pin(5, machine.Pin.IN, machine.Pin.PULL_UP)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; d0.value()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; def callback(p):&lt;br /&gt;
...     print(p, p.value())&lt;br /&gt;
... &lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; from machine import Pin&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; d0.irq(trigger=Pin.IRQ_FALLING | Pin.IRQ_RISING, handler=callback)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; d1.irq(trigger=Pin.IRQ_FALLING | Pin.IRQ_RISING, handler=callback)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import machine&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; from machine import Pin&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import utime&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; def callback(p):&lt;br /&gt;
...     print(utime.ticks_us())&lt;br /&gt;
... &lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; d0 = machine.Pin(4, machine.Pin.IN)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; d0.irq(trigger=Pin.IRQ_FALLING, handler=callback)&lt;br /&gt;
&amp;lt;IRQ&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;SPACE&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; 161328207&lt;br /&gt;
161328513&lt;br /&gt;
161328708&lt;br /&gt;
161328900&lt;br /&gt;
161405882&lt;br /&gt;
161406119&lt;br /&gt;
161406266&lt;br /&gt;
161406458&lt;br /&gt;
161406648&lt;br /&gt;
161406845&lt;br /&gt;
161408507&lt;br /&gt;
161408654&lt;br /&gt;
161408849&lt;br /&gt;
161409041&lt;br /&gt;
161409239&lt;br /&gt;
161409433&lt;br /&gt;
&lt;br /&gt;
&#039;SPACE&#039;&lt;br /&gt;
165145125&lt;br /&gt;
165145405&lt;br /&gt;
165145596&lt;br /&gt;
165145797&lt;br /&gt;
165145992&lt;br /&gt;
165211956&lt;br /&gt;
165212194&lt;br /&gt;
165212385&lt;br /&gt;
165212586&lt;br /&gt;
165212782&lt;br /&gt;
165212928&lt;br /&gt;
165214540&lt;br /&gt;
165214737&lt;br /&gt;
165214934&lt;br /&gt;
165215129&lt;br /&gt;
165215276&lt;br /&gt;
165215469&lt;br /&gt;
&lt;br /&gt;
&#039;SPACE&#039;&lt;br /&gt;
167842588&lt;br /&gt;
167842838&lt;br /&gt;
167843033&lt;br /&gt;
167843180&lt;br /&gt;
167843373&lt;br /&gt;
167920437&lt;br /&gt;
167920681&lt;br /&gt;
167920877&lt;br /&gt;
167921023&lt;br /&gt;
167921216&lt;br /&gt;
167921407&lt;br /&gt;
167923024&lt;br /&gt;
167923219&lt;br /&gt;
167923370&lt;br /&gt;
167923581&lt;br /&gt;
167923772&lt;br /&gt;
167923969&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import machine&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; from machine import Pin&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import utime&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; def callback(p):&lt;br /&gt;
...     print(utime.ticks_us(), p.value(), p)&lt;br /&gt;
... &lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; d0 = machine.Pin(4, machine.Pin.IN)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; d1 = machine.Pin(5, machine.Pin.IN)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; d0.irq(trigger=Pin.IRQ_FALLING, handler=callback)&lt;br /&gt;
&amp;lt;IRQ&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; d1.irq(trigger=Pin.IRQ_FALLING | Pin.IRQ_RISING, handler=callback)&lt;br /&gt;
&amp;lt;IRQ&amp;gt;&lt;br /&gt;
[SPACE]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; 210770016 1 Pin(5)&lt;br /&gt;
210770569 0 Pin(4)&lt;br /&gt;
210770865 1 Pin(5)&lt;br /&gt;
210771213 1 Pin(4)&lt;br /&gt;
210771514 1 Pin(5)&lt;br /&gt;
210847670 0 Pin(5)&lt;br /&gt;
210848033 1 Pin(4)&lt;br /&gt;
210848336 1 Pin(4)&lt;br /&gt;
210848682 1 Pin(5)&lt;br /&gt;
210848986 1 Pin(4)&lt;br /&gt;
210850323 1 Pin(5)&lt;br /&gt;
210850627 1 Pin(4)&lt;br /&gt;
210850921 0 Pin(5)&lt;br /&gt;
210851268 0 Pin(4)&lt;br /&gt;
210852497 1 Pin(5)&lt;br /&gt;
&lt;br /&gt;
[SPACE]&lt;br /&gt;
214292169 0 Pin(5)&lt;br /&gt;
214292636 1 Pin(4)&lt;br /&gt;
214292932 1 Pin(5)&lt;br /&gt;
214293280 0 Pin(4)&lt;br /&gt;
214293580 1 Pin(5)&lt;br /&gt;
214402831 0 Pin(5)&lt;br /&gt;
214403247 0 Pin(4)&lt;br /&gt;
214403540 1 Pin(5)&lt;br /&gt;
214403890 0 Pin(4)&lt;br /&gt;
214405434 1 Pin(5)&lt;br /&gt;
214405740 0 Pin(4)&lt;br /&gt;
214406038 0 Pin(5)&lt;br /&gt;
214406336 0 Pin(4)&lt;br /&gt;
214406678 1 Pin(5)&lt;br /&gt;
&lt;br /&gt;
[Caps]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; 223902923 1 Pin(5)&lt;br /&gt;
223903519 0 Pin(4)`&lt;br /&gt;
223903810 1 Pin(5)&lt;br /&gt;
223904113 1 Pin(4)&lt;br /&gt;
223904456 1 Pin(5)&lt;br /&gt;
223964179 0 Pin(5)&lt;br /&gt;
223964508 0 Pin(4)&lt;br /&gt;
223964806 0 Pin(4)&lt;br /&gt;
223965101 1 Pin(5)&lt;br /&gt;
223965451 1 Pin(4)&lt;br /&gt;
223966912 0 Pin(5)&lt;br /&gt;
223967413 0 Pin(4)&lt;br /&gt;
223967746 1 Pin(5)&lt;br /&gt;
223968047 0 Pin(4)&lt;br /&gt;
223968997 1 Pin(5)&lt;br /&gt;
&lt;br /&gt;
[U]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; 231044948 1 Pin(5)&lt;br /&gt;
231045553 0 Pin(4)&lt;br /&gt;
231045848 1 Pin(5)&lt;br /&gt;
231046203 1 Pin(4)&lt;br /&gt;
231133566 0 Pin(5)&lt;br /&gt;
231133897 1 Pin(4)&lt;br /&gt;
231134194 0 Pin(4)&lt;br /&gt;
231134492 1 Pin(5)&lt;br /&gt;
231134842 1 Pin(4)&lt;br /&gt;
231136321 1 Pin(5)&lt;br /&gt;
231136711 0 Pin(4)&lt;br /&gt;
231137006 1 Pin(5)&lt;br /&gt;
231137305 0 Pin(4)&lt;br /&gt;
231138390 1 Pin(5)&lt;br /&gt;
&lt;br /&gt;
[U]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; 232928590 1 Pin(5)&lt;br /&gt;
232929128 1 Pin(4)&lt;br /&gt;
232929436 1 Pin(5)&lt;br /&gt;
232929735 1 Pin(4)&lt;br /&gt;
232930084 1 Pin(5)&lt;br /&gt;
233011829 0 Pin(5)&lt;br /&gt;
233012233 1 Pin(4)&lt;br /&gt;
233012527 1 Pin(5)&lt;br /&gt;
233012829 0 Pin(4)&lt;br /&gt;
233014394 0 Pin(5)&lt;br /&gt;
233014699 0 Pin(4)&lt;br /&gt;
233014994 0 Pin(5)&lt;br /&gt;
233015294 0 Pin(4)&lt;br /&gt;
233015587 1 Pin(5)&lt;br /&gt;
&lt;br /&gt;
[U]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; 234233385 1 Pin(5)&lt;br /&gt;
234233821 0 Pin(4)&lt;br /&gt;
234234119 1 Pin(5)&lt;br /&gt;
234234418 0 Pin(4)&lt;br /&gt;
234234713 1 Pin(5)&lt;br /&gt;
234311186 0 Pin(5)&lt;br /&gt;
234311583 0 Pin(4)&lt;br /&gt;
234311878 1 Pin(5)&lt;br /&gt;
234312179 0 Pin(4)&lt;br /&gt;
234313706 0 Pin(5)&lt;br /&gt;
234314064 0 Pin(4)&lt;br /&gt;
234314362 1 Pin(5)&lt;br /&gt;
234314665 0 Pin(4)&lt;br /&gt;
234314959 1 Pin(5)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=Kali&amp;diff=54062</id>
		<title>Kali</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=Kali&amp;diff=54062"/>
		<updated>2016-09-16T01:47:30Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: #077&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*Kali linux (live usb)&lt;br /&gt;
**http://docs.kali.org/downloading/kali-linux-live-usb-install&lt;br /&gt;
**http://docs.kali.org/downloading/kali-linux-live-usb-persistence&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
No sound fix....&lt;br /&gt;
&lt;br /&gt;
#Turn on Kali Linux, open terminal and type in sudo killall pulseaudio and hit enter. Now type next. &amp;lt;code&amp;gt;sudo apt-get purge pulseaudio pulseaudio-utils gstreamer0.10-pulseaudio paman pavumeter pavucontrol&amp;lt;/code&amp;gt; and again hit enter.&lt;br /&gt;
#Continue typing and now type &amp;lt;code&amp;gt;rm ~/ .pulse-cookie&amp;lt;/code&amp;gt;, after that type &amp;lt;code&amp;gt;rm -r ~/ .pulse&amp;lt;/code&amp;gt; and after this type next. &amp;lt;code&amp;gt;sudo apt-get install alsa-base alsa-tools alsa-tools-gui alsa-utils alsa-oss alsamixergui libalsaplayer0&amp;lt;/code&amp;gt; and at last type &amp;lt;code&amp;gt;apt-get install kmix&amp;lt;/code&amp;gt; and hit enter.&lt;br /&gt;
#And now restart machine.&lt;br /&gt;
#OK now again open terminal and start typing on terminal and type next &amp;lt;code&amp;gt;apt-get install pulseaudio&amp;lt;/code&amp;gt; and hit enter and and last type &amp;lt;code&amp;gt;apt-get install gnome-core&amp;lt;/code&amp;gt; and again hit enter.&lt;br /&gt;
#Restart machine.&lt;br /&gt;
&lt;br /&gt;
Now you can see the result, all works great, problem solved&lt;br /&gt;
&lt;br /&gt;
...gleaned from https://forums.kali.org/showthread.php?30815-No-sound-how-to-start-pulseaudio-on-startup&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=Mushroom_cultivation&amp;diff=52678</id>
		<title>Mushroom cultivation</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=Mushroom_cultivation&amp;diff=52678"/>
		<updated>2016-07-08T05:39:53Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: /* Monitoring */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Mushroom cultivation=&lt;br /&gt;
&lt;br /&gt;
Welcome to the Tastebridge mushroom cultivation wiki. This page is meant as a combined documentation of the Noisebridge mushroom project, and a simple beginner&#039;s guide to doing the same at home. The page is sorted by species (so far only one) and sub-divided by substrate for those species that have been / are growing on more than one different substrate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Oyster mushrooms==&lt;br /&gt;
&lt;br /&gt;
TODO: A little information about these muchrooms...&lt;br /&gt;
&lt;br /&gt;
===Sawdust substrate===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ingredients&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* sawdust, 50/50 oak/alder&lt;br /&gt;
* gypsum&lt;br /&gt;
* water added to 65% wet weight&lt;br /&gt;
* hydrogen peroxide 3%&lt;br /&gt;
* Spawn Mate SEII&lt;br /&gt;
* mushroom spawn&lt;br /&gt;
* spawn bags&lt;br /&gt;
&lt;br /&gt;
The initial moisture content of the substrate should be measured before start; this can be done by weighing out a small sample of sawdust, drying it in a microwave oven, weighing it again and calculating % moisture like so:&lt;br /&gt;
&lt;br /&gt;
  Wtotal - Wdry = Wwater&lt;br /&gt;
  (100 / Wtotal) * Wwater = % moisture&lt;br /&gt;
&lt;br /&gt;
The final moisture content should be around 60% of the total weight, so adding about 65% water will result in appropriate levels after evaporation and addition of gypsum and Spawn Mate. The water should be boiling when it is poured on the sawdust, mixed in as quickly and thoroughly as possible, and the mix then left to cool.&lt;br /&gt;
&lt;br /&gt;
Once the wet sawdust has cooled to &amp;lt;50°C / 120°F, add 3 % by wet weight of a 3% hydrogen peroxide solution, after first, making sure that the hydrogen peroxide does not react with enzymes (peroxisomes) in the saw dust, as this will spoil the disinfective properties. This can be done by mixing a bit of the sawdust with hydrogen peroxide. If there is no fizzing, simply add gypsum and boiling water. If it fizzes, the sawdust will need to be boiled for about 30 minutes to cease enzymatic activity before the peroxide can be added. Also, do not be tempted to add the peroxide to the water before boiling, as the decomposition rate of H2O2 increases massively with temperature.&lt;br /&gt;
&lt;br /&gt;
Once peroxide has been mixed well into the sawdust/gypsum, the substrate needs to be further cooled to room temperature, then supplemented with 7-32% per dry weight Spawn Mate SEII:&lt;br /&gt;
&lt;br /&gt;
 (Wdry / 100) * target% = Wsmii&lt;br /&gt;
&lt;br /&gt;
The last step is the inoculation; a relatively high spawning rate is recommended with the peroxide treatment, as mycelial growth will be slowed down somewhat by the peroxide, and by the microbial competition that  the substrate has not been sterilized of commercial spawn grown on millet (from Amycel, Inc.), then transferred in 12-13 lbs. portions to XL spawn bags. The mixing can be done in the spawn bags or in a large plastic tote, and the final mix is then put in the spawn bags, which are sealed, preferably with an impact sealer.&lt;br /&gt;
&lt;br /&gt;
Original estimates of colonization rates were about 4 weeks, but these turned out to be overly pessimistic. Our blocks were inoculated on two separate occasions, 21 and 27 July 2011, and the first blocks were fully colonized by July 29th and fruiting heavily by 8 Aug (see photo). Once the blocks are completely colonized (see picture), the fruiting can be initiated either by taking them out of the bags, or by making a bunch of X-slits in the bags spaced about 2&amp;quot; / 10 cm apart and placed in a climate-controlled fruiting chamber. The chamber can be constructed by covering a wire shelf rack with thick plastic, adding a small fan and a humidifier (preferably on a timer so it only runs during day time) - temperatures should be within 15-25°C / 60-75°F, and relative air humidity optimally between 90% and 93%.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Coffee ground substrate===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ingredients&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* coffee grounds from a coffee shop&lt;br /&gt;
* coarse vermiculite (optional)&lt;br /&gt;
* Spawn Mate SEII (optional)&lt;br /&gt;
* mushroom spawn&lt;br /&gt;
* spawn bags&lt;br /&gt;
&lt;br /&gt;
In an attempt to bring mushroom cultivation costs down as low as possible, we wanted to try out coffee grounds as a fruiting substrate for oyster mushrooms, as grounds are (generally) free and plentiful, and easy to come by in urban areas with lots of coffee shops. The initial plan was to use the peroxide technique again, but the peroxide reacted fairly strongly with the coffee, so instead, we tried three different options: 1) pressure cooking + Spawn Mate supplementation, 2) no cooking + Spawn Mate supplementation, and 3) no cooking + no supplementation.&lt;br /&gt;
&lt;br /&gt;
Start out by measuring the moisture content of the coffee grounds as described for the sawdust above. Then add water, and optionally vermiculite for a looser texture.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;background:green&amp;quot;&amp;gt;Container&amp;lt;/span&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
[[File:IMG521.jpg|500px|right]]&lt;br /&gt;
&lt;br /&gt;
TODO: Specs&lt;br /&gt;
&lt;br /&gt;
This works with a box about yay big, so high, made of stuff, and filled with things...&lt;br /&gt;
&lt;br /&gt;
== Process ==&lt;br /&gt;
&lt;br /&gt;
# this step&lt;br /&gt;
# that step&lt;br /&gt;
# and then&lt;br /&gt;
# and so on...&lt;br /&gt;
&lt;br /&gt;
First we need to see if the sawdust peroxide-decomposing enzymes are active or were destroyed.  This can be done by mixing a bit of the sawdust with hydrogen peroxide.  If the enzymes are sufficiently denatured that there is no fizzing, we simply add the proper amount of boiling water (as determined by achieving a 60% moisture content) and gypsum.&lt;br /&gt;
&lt;br /&gt;
If there still are enzymes present in the sawdust--and this is the more likely scenario I think given they chip fresh trees at Lazarri--then we must add the water and let the sawdust cook for about 30 minutes or so.  It needs to get a core temperature hot enough to denature the enzymes (close to boiling for about 15 minutes would do it I figure).  A pressure cooker would be ideal for this so we can mix the proper water content without it lowering through the cook and get the stuff hotter faster, so I will bring two of them in case.&lt;br /&gt;
&lt;br /&gt;
After the cool and once the mix is cool enough to handle in some fashion without the water vapor burning us--we might want to spread it out somehow for the cool down so I&#039;ll bring a solution for that too--then the peroxide can be added.  Once peroxide has been mixed well into the sawdust/gypsum and provided there are little to no decomposing enzymes still functional, the substrate will be safe to bag up in spawn bags where it can further cool to room temperature (no sealing is necessary since the hydrogen peroxide will protect it).  I would like to make about 10 8-pound spawn bags worth (80 pounds).&lt;br /&gt;
&lt;br /&gt;
The next session and phase will be to inoculation the fully-cooled spawn bags.  This is done by adding a measured amount of well-broken-up spawn (have to look this one up) and about 4% per dry weight Spawn Mate SEII.   The mixing can be done in the spawn bags or in a large plastic tote but the final mix is put in the spawn bags, which are further sealed (I might be able to get some much cheaper spawn bags without filter patches for this work on Ebay before next week).  Colonization of oyster bags takes about 4 weeks, so that will be all there is to do to the bags for awhile after the bags are loaded.&lt;br /&gt;
&lt;br /&gt;
At some point during this colonization time, the fruiting shelving must be constructed (they cost about $30 at Costco for a unit I think large enough), and they must be covered with plastic furniture covering, which is very inexpensive at Wal-mart.  We&#039;ll need to hook up an ultrasonic humidifier with timer and a PC fan for internal circulation as well.  Oysters aren&#039;t too picky about anything, but they do need ambient relative humidity above 85% or so and some circulation of the air.&lt;br /&gt;
&lt;br /&gt;
== Automation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Let teh robots do it!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;background:#0ff&amp;quot;&amp;gt;Monitoring&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
The two critical factors for monitoring are temperature and humidity. There is a readily available combined sensor for this, in the form of a DHT11 for less than a few dollars. However, the near 100% humidity environment is outside the operational range of this sensor. This sensor would be suitable for monitoring of the ambient surrounding indoor environment. There is a newer version of the sensor, a DHT12, this is smaller and the same price, with a functional range of 95% humidity. Alternatively a DHT22 has a full range of up to 100%, and better overall accuracy and sensitivity. These sensors are a little more than a few dollars and are also available as AM2302 which has short wire lead extensions. All of these sensors are 3-5 volt compatible and use a pair or wires for power, and a single data pin for I2C communication. A pull-up resistor of &amp;gt;5K Ohm may be needed, not that an internal pullup on a micro-controller is generally sufficient.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For sample code see: [[ESP8266/DHT]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Temperature Control ===&lt;br /&gt;
&lt;br /&gt;
Simply locating within a home that maintains a generally consistent room temperature can be sufficient. In other cases a heating and/or cooling element may be needed. A simple solution could be the use of a heating pad.&lt;br /&gt;
&lt;br /&gt;
In this particular case the use of a peltier device will be considered. These devices have the ability to &amp;quot;pump&amp;quot; heat into or out of a relatively small contained area and are often used in portable temperature controlled coolers. They are available in a range of sizes for a reasonable price and are also fairly energy efficient. They are available at different voltages, often around 12 volts, and can range from a few 100mA to several amps.&lt;br /&gt;
&lt;br /&gt;
For controlling the temperature a pair of relays can be used, switching on a current flow to either increase or decrease the temperature. A cooling fan and large heat sink should also be implemented to increase efficiency and  thus turned on with a relay when the system is running. A thermister should additionally be attached in contact with the peltier to monitor/limit maximum operating temperatures.&lt;br /&gt;
&lt;br /&gt;
=== Humidity Control ===&lt;br /&gt;
&lt;br /&gt;
The humidity can be increased as needed with a &amp;quot;cool mist&amp;quot; or ultrasonic style humidifier. These humidifiers are readily available for $10-30. They can be controlled with a relay and run for many hours with a built in reservoir. An additional sensor could be considered to monitor the water level, however in practice this wouldn&#039;t be necessary to check other than every few days.&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=ESP8266/DHT&amp;diff=52677</id>
		<title>ESP8266/DHT</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=ESP8266/DHT&amp;diff=52677"/>
		<updated>2016-07-08T05:37:56Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: #0ff&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Humidity/Temperature sensor with SD Card data logger.&lt;br /&gt;
&lt;br /&gt;
This code is for use with NUBCore #060 hardware and a DHT11 sensor.&lt;br /&gt;
&lt;br /&gt;
The DHT11 sensor seems to return eroneous data when sampled quickly, here it seems to be stable at once a minute.&lt;br /&gt;
&lt;br /&gt;
Note: Requires modified Nokia library (see below).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266mDNS.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiUdp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ArduinoOTA.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SD.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_PCD8544.h&amp;gt;&lt;br /&gt;
#include &amp;lt;DHT.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define DHTTYPE DHT11&lt;br /&gt;
&lt;br /&gt;
#define PIN_DHT   1&lt;br /&gt;
&lt;br /&gt;
#define PIN_CE    16  //Pin 2 on LCD&lt;br /&gt;
#define PIN_DC    15  //Pin 3 on LCD&lt;br /&gt;
&lt;br /&gt;
#define PIN_SD_CS 10 // Make sure &amp;quot;DIO&amp;quot; is selected&lt;br /&gt;
&lt;br /&gt;
#define DISPLAY_ENABLED true&lt;br /&gt;
&lt;br /&gt;
bool sdEnabled = false;&lt;br /&gt;
&lt;br /&gt;
WiFiClient client;&lt;br /&gt;
&lt;br /&gt;
#if defined(DISPLAY_ENABLED)&lt;br /&gt;
Adafruit_PCD8544 display = Adafruit_PCD8544(PIN_DC, PIN_CE, -1);&lt;br /&gt;
#else&lt;br /&gt;
Adafruit_PCD8544 display = Adafruit_PCD8544(4, 5, 2, -1);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
bool wifiEnabled = false;&lt;br /&gt;
&lt;br /&gt;
DHT dht(PIN_DHT, DHTTYPE);&lt;br /&gt;
&lt;br /&gt;
void handleHumidity(void);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  pinMode(5, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  if (DISPLAY_ENABLED) {&lt;br /&gt;
    display.begin();&lt;br /&gt;
    display.setContrast(55);&lt;br /&gt;
&lt;br /&gt;
    display.clearDisplay();&lt;br /&gt;
&lt;br /&gt;
    display.setTextSize(1);&lt;br /&gt;
    display.setTextColor(BLACK);&lt;br /&gt;
    display.setCursor(0, 0);&lt;br /&gt;
    display.println(&amp;quot;#0FF DHT&amp;quot;);&lt;br /&gt;
    display.setTextColor(WHITE, BLACK); // &#039;inverted&#039; text&lt;br /&gt;
    display.setTextSize(2);&lt;br /&gt;
    display.println(&amp;quot; void &amp;quot;);&lt;br /&gt;
    display.setTextSize(1);&lt;br /&gt;
    display.setTextColor(BLACK);&lt;br /&gt;
    display.display();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WiFi.begin(); // Usese last configured settings&lt;br /&gt;
  // WiFi.begin(&amp;quot;ssid&amp;quot;, &amp;quot;password&amp;quot;);&lt;br /&gt;
  unsigned long timeout = millis() + 10000;&lt;br /&gt;
  while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
    digitalWrite(5, HIGH);&lt;br /&gt;
    delay(50);&lt;br /&gt;
    digitalWrite(5, LOW);&lt;br /&gt;
    delay(450);&lt;br /&gt;
    yield();&lt;br /&gt;
    if (millis() &amp;gt; timeout)&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  wifiEnabled = WiFi.status() == WL_CONNECTED;&lt;br /&gt;
&lt;br /&gt;
  if (wifiEnabled) {&lt;br /&gt;
    ArduinoOTA.onStart([]() {&lt;br /&gt;
      if (DISPLAY_ENABLED) {&lt;br /&gt;
        display.clearDisplay();&lt;br /&gt;
        display.setTextSize(1);&lt;br /&gt;
        display.setTextColor(BLACK);&lt;br /&gt;
        display.setCursor(0, 0);&lt;br /&gt;
        display.println(&amp;quot;*OTA Update*&amp;quot;);&lt;br /&gt;
        display.println(&amp;quot;&amp;quot;);&lt;br /&gt;
        display.setTextSize(2);&lt;br /&gt;
        display.display();&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {&lt;br /&gt;
      static uint8_t lastProgress = 0;&lt;br /&gt;
      static unsigned long nextTime = 0;&lt;br /&gt;
      uint8_t p = (progress / (total / 100));&lt;br /&gt;
&lt;br /&gt;
      if (p == 100 || (p != lastProgress &amp;amp;&amp;amp; millis() &amp;gt; nextTime)) {&lt;br /&gt;
        nextTime = millis() + 100;&lt;br /&gt;
        if (p &amp;lt; 100) {&lt;br /&gt;
          if (DISPLAY_ENABLED) {&lt;br /&gt;
            display.clearDisplay();&lt;br /&gt;
            display.setTextSize(1);&lt;br /&gt;
            display.setCursor(0, 0);&lt;br /&gt;
            display.println(&amp;quot;*OTA Update*&amp;quot;);&lt;br /&gt;
            display.println(&amp;quot;&amp;quot;);&lt;br /&gt;
            display.setTextSize(2);&lt;br /&gt;
            display.setCursor(24, 24);&lt;br /&gt;
            display.println(String(p) + &amp;quot;%&amp;quot;);&lt;br /&gt;
            display.display();&lt;br /&gt;
          }&lt;br /&gt;
          lastProgress = p;&lt;br /&gt;
        } else {&lt;br /&gt;
          if (DISPLAY_ENABLED) {&lt;br /&gt;
            display.clearDisplay();&lt;br /&gt;
            display.setTextSize(1);&lt;br /&gt;
            display.setTextColor(BLACK);&lt;br /&gt;
            display.setCursor(0, 0);&lt;br /&gt;
            display.println(&amp;quot;*OTA Success*&amp;quot;);&lt;br /&gt;
            display.println(&amp;quot;&amp;quot;);&lt;br /&gt;
            display.println(&amp;quot;rebooting...&amp;quot;);&lt;br /&gt;
            display.display();&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    ArduinoOTA.onError([](ota_error_t error) {&lt;br /&gt;
      if (DISPLAY_ENABLED) {&lt;br /&gt;
        display.println(&amp;quot;ERROR: &amp;quot; + String(error));&lt;br /&gt;
        display.display();&lt;br /&gt;
        delay(1000);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    ArduinoOTA.begin();&lt;br /&gt;
&lt;br /&gt;
    if (DISPLAY_ENABLED) {&lt;br /&gt;
      display.println(WiFi.SSID());&lt;br /&gt;
      display.println(WiFi.localIP());&lt;br /&gt;
      display.display();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++) {&lt;br /&gt;
      ArduinoOTA.handle();&lt;br /&gt;
      delay(100);&lt;br /&gt;
      yield();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (!SD.begin(PIN_SD_CS)) {&lt;br /&gt;
    // no SD found&lt;br /&gt;
    display.clearDisplay();&lt;br /&gt;
    display.println(&amp;quot;No SD found&amp;quot;);&lt;br /&gt;
    display.display();&lt;br /&gt;
    // TODO: change delay to loop w/yield&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    yield();&lt;br /&gt;
  } else {&lt;br /&gt;
    // SD initialized&lt;br /&gt;
    sdEnabled = true;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  dht.begin();&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (wifiEnabled)&lt;br /&gt;
    ArduinoOTA.handle();&lt;br /&gt;
&lt;br /&gt;
  handleHumidity();&lt;br /&gt;
&lt;br /&gt;
  delay(50);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handleHumidity() {&lt;br /&gt;
  static unsigned long next = 10000; // Don&#039;t read for first 10 seconds&lt;br /&gt;
  unsigned long now = millis();&lt;br /&gt;
&lt;br /&gt;
  if (now &amp;gt; next) {&lt;br /&gt;
    bool validData = false;&lt;br /&gt;
&lt;br /&gt;
    next = now + 60000; // Read every 60 seconds&lt;br /&gt;
&lt;br /&gt;
    // Blip LED&lt;br /&gt;
    digitalWrite(5, HIGH);&lt;br /&gt;
&lt;br /&gt;
    float h, c, f;&lt;br /&gt;
    h = dht.readHumidity();&lt;br /&gt;
    c = dht.readTemperature();&lt;br /&gt;
    f = dht.readTemperature(true);&lt;br /&gt;
&lt;br /&gt;
    validData = (h &amp;gt;= 0 &amp;amp;&amp;amp; h &amp;lt;= 100);&lt;br /&gt;
&lt;br /&gt;
    if (validData) {&lt;br /&gt;
&lt;br /&gt;
        display.clearDisplay();&lt;br /&gt;
        display.setCursor(0, 0);&lt;br /&gt;
        display.setTextSize(2);&lt;br /&gt;
        display.println(String(int(c)) + &amp;quot;/&amp;quot; + String(int(f)));&lt;br /&gt;
        display.setTextSize(3);&lt;br /&gt;
        display.println(String(int(h)) + &amp;quot;%&amp;quot;);&lt;br /&gt;
        display.display();&lt;br /&gt;
&lt;br /&gt;
        if (sdEnabled) {&lt;br /&gt;
          String data = String(millis()) + &amp;quot;,&amp;quot;;&lt;br /&gt;
          data += String(h) + &amp;quot;,&amp;quot;;&lt;br /&gt;
          data += String(c) + &amp;quot;,&amp;quot;;&lt;br /&gt;
          data += String(f);&lt;br /&gt;
&lt;br /&gt;
          File dataFile = SD.open(&amp;quot;HUMIDITY.TXT&amp;quot;, FILE_WRITE);&lt;br /&gt;
&lt;br /&gt;
          if (dataFile) {&lt;br /&gt;
            dataFile.println(data);&lt;br /&gt;
            dataFile.close();&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
    } else {&lt;br /&gt;
        display.println(&amp;quot;DATA ERROR&amp;quot;);&lt;br /&gt;
        display.display();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(5, LOW);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Slightly modified version of Adafruit Nokia Display library (Adafruit_PCD8544.cpp)...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*********************************************************************&lt;br /&gt;
This is a library for our Monochrome Nokia 5110 LCD Displays&lt;br /&gt;
&lt;br /&gt;
  Pick one up today in the adafruit shop!&lt;br /&gt;
  ------&amp;gt; http://www.adafruit.com/products/338&lt;br /&gt;
&lt;br /&gt;
These displays use SPI to communicate, 4 or 5 pins are required to  &lt;br /&gt;
interface&lt;br /&gt;
&lt;br /&gt;
Adafruit invests time and resources providing this open source code, &lt;br /&gt;
please support Adafruit and open-source hardware by purchasing &lt;br /&gt;
products from Adafruit!&lt;br /&gt;
&lt;br /&gt;
Written by Limor Fried/Ladyada  for Adafruit Industries.  &lt;br /&gt;
BSD license, check license.txt for more information&lt;br /&gt;
All text above, and the splash screen below must be included in any redistribution&lt;br /&gt;
&lt;br /&gt;
Hacked for ESP8266 by thex #0ff&lt;br /&gt;
*********************************************************************/&lt;br /&gt;
&lt;br /&gt;
//#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#if defined(ESP8266)&lt;br /&gt;
#include &amp;lt;pgmspace.h&amp;gt;&lt;br /&gt;
#else&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
#endif&lt;br /&gt;
#if defined(ARDUINO) &amp;amp;&amp;amp; ARDUINO &amp;gt;= 100&lt;br /&gt;
  #include &amp;quot;Arduino.h&amp;quot;&lt;br /&gt;
#else&lt;br /&gt;
  #include &amp;quot;WProgram.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifdef __AVR__&lt;br /&gt;
  #include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifndef _BV&lt;br /&gt;
  #define _BV(x) (1 &amp;lt;&amp;lt; (x))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;quot;Adafruit_PCD8544.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// the memory buffer for the LCD&lt;br /&gt;
uint8_t pcd8544_buffer[LCDWIDTH * LCDHEIGHT / 8] = {&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFC, 0xFE, 0xFF, 0xFC, 0xE0,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,&lt;br /&gt;
0xF8, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x80, 0xC0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x7F,&lt;br /&gt;
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF,&lt;br /&gt;
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC7, 0xC7, 0x87, 0x8F, 0x9F, 0x9F, 0xFF, 0xFF, 0xFF,&lt;br /&gt;
0xC1, 0xC0, 0xE0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xFC, 0xFC, 0xFE, 0xFE, 0xFE,&lt;br /&gt;
0xFC, 0xFC, 0xF8, 0xF8, 0xF0, 0xE0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x80, 0xC0, 0xE0, 0xF1, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x0F, 0x0F, 0x87,&lt;br /&gt;
0xE7, 0xFF, 0xFF, 0xFF, 0x1F, 0x1F, 0x3F, 0xF9, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xFD, 0xFF,&lt;br /&gt;
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0xF0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,&lt;br /&gt;
0x7E, 0x3F, 0x3F, 0x0F, 0x1F, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xE0, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF,&lt;br /&gt;
0xFF, 0xFC, 0xF0, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01,&lt;br /&gt;
0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x1F, 0x3F, 0x7F, 0x7F,&lt;br /&gt;
0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x1F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// reduces how much is refreshed, which speeds it up!&lt;br /&gt;
// originally derived from Steve Evans/JCW&#039;s mod but cleaned up and&lt;br /&gt;
// optimized&lt;br /&gt;
//#define enablePartialUpdate&lt;br /&gt;
&lt;br /&gt;
#ifdef enablePartialUpdate&lt;br /&gt;
static uint8_t xUpdateMin, xUpdateMax, yUpdateMin, yUpdateMax;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
static void updateBoundingBox(uint8_t xmin, uint8_t ymin, uint8_t xmax, uint8_t ymax) {&lt;br /&gt;
#ifdef enablePartialUpdate&lt;br /&gt;
  if (xmin &amp;lt; xUpdateMin) xUpdateMin = xmin;&lt;br /&gt;
  if (xmax &amp;gt; xUpdateMax) xUpdateMax = xmax;&lt;br /&gt;
  if (ymin &amp;lt; yUpdateMin) yUpdateMin = ymin;&lt;br /&gt;
  if (ymax &amp;gt; yUpdateMax) yUpdateMax = ymax;&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Adafruit_PCD8544::Adafruit_PCD8544(int8_t SCLK, int8_t DIN, int8_t DC,&lt;br /&gt;
    int8_t CS, int8_t RST) : Adafruit_GFX(LCDWIDTH, LCDHEIGHT) {&lt;br /&gt;
  _din = DIN;&lt;br /&gt;
  _sclk = SCLK;&lt;br /&gt;
  _dc = DC;&lt;br /&gt;
  _rst = RST;&lt;br /&gt;
  _cs = CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Adafruit_PCD8544::Adafruit_PCD8544(int8_t SCLK, int8_t DIN, int8_t DC,&lt;br /&gt;
    int8_t RST) : Adafruit_GFX(LCDWIDTH, LCDHEIGHT) {&lt;br /&gt;
  _din = DIN;&lt;br /&gt;
  _sclk = SCLK;&lt;br /&gt;
  _dc = DC;&lt;br /&gt;
  _rst = RST;&lt;br /&gt;
  _cs = -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Adafruit_PCD8544::Adafruit_PCD8544(int8_t DC, int8_t CS, int8_t RST):&lt;br /&gt;
  Adafruit_GFX(LCDWIDTH, LCDHEIGHT) {&lt;br /&gt;
  // -1 for din and sclk specify using hardware SPI&lt;br /&gt;
  _din = -1;&lt;br /&gt;
  _sclk = -1;&lt;br /&gt;
  _dc = DC;&lt;br /&gt;
  _rst = RST;&lt;br /&gt;
  _cs = CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// the most basic function, set a single pixel&lt;br /&gt;
void Adafruit_PCD8544::drawPixel(int16_t x, int16_t y, uint16_t color) {&lt;br /&gt;
  if ((x &amp;lt; 0) || (x &amp;gt;= _width) || (y &amp;lt; 0) || (y &amp;gt;= _height))&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  int16_t t;&lt;br /&gt;
  switch(rotation){&lt;br /&gt;
    case 1:&lt;br /&gt;
      t = x;&lt;br /&gt;
      x = y;&lt;br /&gt;
      y =  LCDHEIGHT - 1 - t;&lt;br /&gt;
      break;&lt;br /&gt;
    case 2:&lt;br /&gt;
      x = LCDWIDTH - 1 - x;&lt;br /&gt;
      y = LCDHEIGHT - 1 - y;&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      t = x;&lt;br /&gt;
      x = LCDWIDTH - 1 - y;&lt;br /&gt;
      y = t;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if ((x &amp;lt; 0) || (x &amp;gt;= LCDWIDTH) || (y &amp;lt; 0) || (y &amp;gt;= LCDHEIGHT))&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  // x is which column&lt;br /&gt;
  if (color) &lt;br /&gt;
    pcd8544_buffer[x+ (y/8)*LCDWIDTH] |= _BV(y%8);  &lt;br /&gt;
  else&lt;br /&gt;
    pcd8544_buffer[x+ (y/8)*LCDWIDTH] &amp;amp;= ~_BV(y%8); &lt;br /&gt;
&lt;br /&gt;
  updateBoundingBox(x,y,x,y);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// the most basic function, get a single pixel&lt;br /&gt;
uint8_t Adafruit_PCD8544::getPixel(int8_t x, int8_t y) {&lt;br /&gt;
  if ((x &amp;lt; 0) || (x &amp;gt;= LCDWIDTH) || (y &amp;lt; 0) || (y &amp;gt;= LCDHEIGHT))&lt;br /&gt;
    return 0;&lt;br /&gt;
&lt;br /&gt;
  return (pcd8544_buffer[x+ (y/8)*LCDWIDTH] &amp;gt;&amp;gt; (y%8)) &amp;amp; 0x1;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Adafruit_PCD8544::begin(uint8_t contrast, uint8_t bias) {&lt;br /&gt;
  if (isHardwareSPI()) {&lt;br /&gt;
    // Setup hardware SPI.&lt;br /&gt;
    SPI.begin();&lt;br /&gt;
#ifdef ESP8266&lt;br /&gt;
    // Datasheet says 4 MHz is max SPI clock speed&lt;br /&gt;
    SPI.setFrequency(400000);&lt;br /&gt;
#else&lt;br /&gt;
    SPI.setClockDivider(PCD8544_SPI_CLOCK_DIV);&lt;br /&gt;
#endif&lt;br /&gt;
    SPI.setDataMode(SPI_MODE0);&lt;br /&gt;
    SPI.setBitOrder(MSBFIRST);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    // Setup software SPI.&lt;br /&gt;
&lt;br /&gt;
    // Set software SPI specific pin outputs.&lt;br /&gt;
    pinMode(_din, OUTPUT);&lt;br /&gt;
    pinMode(_sclk, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
#ifndef ESP8266&lt;br /&gt;
    // Set software SPI ports and masks.&lt;br /&gt;
    clkport     = portOutputRegister(digitalPinToPort(_sclk));&lt;br /&gt;
    clkpinmask  = digitalPinToBitMask(_sclk);&lt;br /&gt;
    mosiport    = portOutputRegister(digitalPinToPort(_din));&lt;br /&gt;
    mosipinmask = digitalPinToBitMask(_din);&lt;br /&gt;
#endif&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Set common pin outputs.&lt;br /&gt;
  pinMode(_dc, OUTPUT);&lt;br /&gt;
  if (_rst &amp;gt; 0)&lt;br /&gt;
      pinMode(_rst, OUTPUT);&lt;br /&gt;
  if (_cs &amp;gt; 0)&lt;br /&gt;
      pinMode(_cs, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // toggle RST low to reset&lt;br /&gt;
  if (_rst &amp;gt; 0) {&lt;br /&gt;
    digitalWrite(_rst, LOW);&lt;br /&gt;
    delay(500);&lt;br /&gt;
    digitalWrite(_rst, HIGH);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // get into the EXTENDED mode!&lt;br /&gt;
  command(PCD8544_FUNCTIONSET | PCD8544_EXTENDEDINSTRUCTION );&lt;br /&gt;
&lt;br /&gt;
  // LCD bias select (4 is optimal?)&lt;br /&gt;
  command(PCD8544_SETBIAS | bias);&lt;br /&gt;
&lt;br /&gt;
  // set VOP&lt;br /&gt;
  if (contrast &amp;gt; 0x7f)&lt;br /&gt;
    contrast = 0x7f;&lt;br /&gt;
&lt;br /&gt;
  command( PCD8544_SETVOP | contrast); // Experimentally determined&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // normal mode&lt;br /&gt;
  command(PCD8544_FUNCTIONSET);&lt;br /&gt;
&lt;br /&gt;
  // Set display to Normal&lt;br /&gt;
  command(PCD8544_DISPLAYCONTROL | PCD8544_DISPLAYNORMAL);&lt;br /&gt;
&lt;br /&gt;
  // initial display line&lt;br /&gt;
  // set page address&lt;br /&gt;
  // set column address&lt;br /&gt;
  // write display data&lt;br /&gt;
&lt;br /&gt;
  // set up a bounding box for screen updates&lt;br /&gt;
&lt;br /&gt;
  updateBoundingBox(0, 0, LCDWIDTH-1, LCDHEIGHT-1);&lt;br /&gt;
  // Push out pcd8544_buffer to the Display (will show the AFI logo)&lt;br /&gt;
  display();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
inline void Adafruit_PCD8544::spiWrite(uint8_t d) {&lt;br /&gt;
  if (isHardwareSPI()) {&lt;br /&gt;
    // Hardware SPI write.&lt;br /&gt;
    SPI.transfer(d);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
#ifdef ESP8266&lt;br /&gt;
    // Software SPI write with bit banging.&lt;br /&gt;
    for(uint8_t bit = 0x80; bit; bit &amp;gt;&amp;gt;= 1) {&lt;br /&gt;
      digitalWrite(_sclk, LOW);&lt;br /&gt;
      if (d &amp;amp; bit) digitalWrite(_din, HIGH);&lt;br /&gt;
      else         digitalWrite(_din, LOW);&lt;br /&gt;
      digitalWrite(_sclk, HIGH);&lt;br /&gt;
    }&lt;br /&gt;
#else&lt;br /&gt;
    // Software SPI write with bit banging.&lt;br /&gt;
    for(uint8_t bit = 0x80; bit; bit &amp;gt;&amp;gt;= 1) {&lt;br /&gt;
      *clkport &amp;amp;= ~clkpinmask;&lt;br /&gt;
      if(d &amp;amp; bit) *mosiport |=  mosipinmask;&lt;br /&gt;
      else        *mosiport &amp;amp;= ~mosipinmask;&lt;br /&gt;
      *clkport |=  clkpinmask;&lt;br /&gt;
    }&lt;br /&gt;
#endif&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool Adafruit_PCD8544::isHardwareSPI() {&lt;br /&gt;
  return (_din == -1 &amp;amp;&amp;amp; _sclk == -1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Adafruit_PCD8544::command(uint8_t c) {&lt;br /&gt;
  digitalWrite(_dc, LOW);&lt;br /&gt;
  if (_cs &amp;gt; 0)&lt;br /&gt;
    digitalWrite(_cs, LOW);&lt;br /&gt;
  spiWrite(c);&lt;br /&gt;
  if (_cs &amp;gt; 0)&lt;br /&gt;
    digitalWrite(_cs, HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Adafruit_PCD8544::data(uint8_t c) {&lt;br /&gt;
  digitalWrite(_dc, HIGH);&lt;br /&gt;
  if (_cs &amp;gt; 0)&lt;br /&gt;
    digitalWrite(_cs, LOW);&lt;br /&gt;
  spiWrite(c);&lt;br /&gt;
  if (_cs &amp;gt; 0)&lt;br /&gt;
    digitalWrite(_cs, HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Adafruit_PCD8544::setContrast(uint8_t val) {&lt;br /&gt;
  if (val &amp;gt; 0x7f) {&lt;br /&gt;
    val = 0x7f;&lt;br /&gt;
  }&lt;br /&gt;
  command(PCD8544_FUNCTIONSET | PCD8544_EXTENDEDINSTRUCTION );&lt;br /&gt;
  command( PCD8544_SETVOP | val); &lt;br /&gt;
  command(PCD8544_FUNCTIONSET);&lt;br /&gt;
  &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Adafruit_PCD8544::display(void) {&lt;br /&gt;
  uint8_t col, maxcol, p;&lt;br /&gt;
  &lt;br /&gt;
  for(p = 0; p &amp;lt; 6; p++) {&lt;br /&gt;
#ifdef enablePartialUpdate&lt;br /&gt;
    // check if this page is part of update&lt;br /&gt;
    if ( yUpdateMin &amp;gt;= ((p+1)*8) ) {&lt;br /&gt;
      continue;   // nope, skip it!&lt;br /&gt;
    }&lt;br /&gt;
    if (yUpdateMax &amp;lt; p*8) {&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
    command(PCD8544_SETYADDR | p);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#ifdef enablePartialUpdate&lt;br /&gt;
    col = xUpdateMin;&lt;br /&gt;
    maxcol = xUpdateMax;&lt;br /&gt;
#else&lt;br /&gt;
    // start at the beginning of the row&lt;br /&gt;
    col = 0;&lt;br /&gt;
    maxcol = LCDWIDTH-1;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
    command(PCD8544_SETXADDR | col);&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(_dc, HIGH);&lt;br /&gt;
    if (_cs &amp;gt; 0)&lt;br /&gt;
      digitalWrite(_cs, LOW);&lt;br /&gt;
    for(; col &amp;lt;= maxcol; col++) {&lt;br /&gt;
      spiWrite(pcd8544_buffer[(LCDWIDTH*p)+col]);&lt;br /&gt;
    }&lt;br /&gt;
    if (_cs &amp;gt; 0)&lt;br /&gt;
      digitalWrite(_cs, HIGH);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  command(PCD8544_SETYADDR );  // no idea why this is necessary but it is to finish the last byte?&lt;br /&gt;
#ifdef enablePartialUpdate&lt;br /&gt;
  xUpdateMin = LCDWIDTH - 1;&lt;br /&gt;
  xUpdateMax = 0;&lt;br /&gt;
  yUpdateMin = LCDHEIGHT-1;&lt;br /&gt;
  yUpdateMax = 0;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// clear everything&lt;br /&gt;
void Adafruit_PCD8544::clearDisplay(void) {&lt;br /&gt;
  memset(pcd8544_buffer, 0, LCDWIDTH*LCDHEIGHT/8);&lt;br /&gt;
  updateBoundingBox(0, 0, LCDWIDTH-1, LCDHEIGHT-1);&lt;br /&gt;
  cursor_y = cursor_x = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
// this doesnt touch the buffer, just clears the display RAM - might be handy&lt;br /&gt;
void Adafruit_PCD8544::clearDisplay(void) {&lt;br /&gt;
  &lt;br /&gt;
  uint8_t p, c;&lt;br /&gt;
  &lt;br /&gt;
  for(p = 0; p &amp;lt; 8; p++) {&lt;br /&gt;
&lt;br /&gt;
    st7565_command(CMD_SET_PAGE | p);&lt;br /&gt;
    for(c = 0; c &amp;lt; 129; c++) {&lt;br /&gt;
      //uart_putw_dec(c);&lt;br /&gt;
      //uart_putchar(&#039; &#039;);&lt;br /&gt;
      st7565_command(CMD_SET_COLUMN_LOWER | (c &amp;amp; 0xf));&lt;br /&gt;
      st7565_command(CMD_SET_COLUMN_UPPER | ((c &amp;gt;&amp;gt; 4) &amp;amp; 0xf));&lt;br /&gt;
      st7565_data(0x0);&lt;br /&gt;
    }     &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=ESP8266/DHT&amp;diff=52676</id>
		<title>ESP8266/DHT</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=ESP8266/DHT&amp;diff=52676"/>
		<updated>2016-07-08T03:56:37Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: lightened code + library mod #0ff&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Humidity/Temperature sensor with SD Card data logger.&lt;br /&gt;
&lt;br /&gt;
Note: Requires modified Nokia library.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266mDNS.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiUdp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ArduinoOTA.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SD.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_PCD8544.h&amp;gt;&lt;br /&gt;
#include &amp;lt;DHT.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define DHTTYPE DHT11&lt;br /&gt;
&lt;br /&gt;
#define PIN_DHT   1&lt;br /&gt;
&lt;br /&gt;
#define PIN_CE    16  //Pin 2 on LCD&lt;br /&gt;
#define PIN_DC    15  //Pin 3 on LCD&lt;br /&gt;
&lt;br /&gt;
#define PIN_SD_CS 10 // Make sure &amp;quot;DIO&amp;quot; is selected&lt;br /&gt;
&lt;br /&gt;
#define DISPLAY_ENABLED true&lt;br /&gt;
&lt;br /&gt;
bool sdEnabled = false;&lt;br /&gt;
&lt;br /&gt;
WiFiClient client;&lt;br /&gt;
&lt;br /&gt;
#if defined(DISPLAY_ENABLED)&lt;br /&gt;
Adafruit_PCD8544 display = Adafruit_PCD8544(PIN_DC, PIN_CE, -1);&lt;br /&gt;
#else&lt;br /&gt;
Adafruit_PCD8544 display = Adafruit_PCD8544(4, 5, 2, -1);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
bool wifiEnabled = false;&lt;br /&gt;
&lt;br /&gt;
DHT dht(PIN_DHT, DHTTYPE);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  pinMode(5, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  if (DISPLAY_ENABLED) {&lt;br /&gt;
    display.begin();&lt;br /&gt;
    display.setContrast(55);&lt;br /&gt;
&lt;br /&gt;
    display.clearDisplay();&lt;br /&gt;
&lt;br /&gt;
    display.setTextSize(1);&lt;br /&gt;
    display.setTextColor(BLACK);&lt;br /&gt;
    display.setCursor(0, 0);&lt;br /&gt;
    display.println(&amp;quot;#0FF DHT&amp;quot;);&lt;br /&gt;
    display.setTextColor(WHITE, BLACK); // &#039;inverted&#039; text&lt;br /&gt;
    display.setTextSize(2);&lt;br /&gt;
    display.println(&amp;quot; void &amp;quot;);&lt;br /&gt;
    display.setTextSize(1);&lt;br /&gt;
    display.setTextColor(BLACK);&lt;br /&gt;
    display.display();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // WiFi.begin(ssid, password);&lt;br /&gt;
  WiFi.begin();&lt;br /&gt;
  unsigned long timeout = millis() + 10000;&lt;br /&gt;
  while (WiFi.status() != WL_CONNECTED){&lt;br /&gt;
    digitalWrite(5, HIGH);&lt;br /&gt;
    delay(50);&lt;br /&gt;
    digitalWrite(5, LOW);&lt;br /&gt;
    delay(450);&lt;br /&gt;
    if (millis() &amp;gt; timeout)&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  wifiEnabled = WiFi.status() == WL_CONNECTED;&lt;br /&gt;
&lt;br /&gt;
  if (wifiEnabled) {&lt;br /&gt;
&lt;br /&gt;
  ArduinoOTA.onStart([]() {&lt;br /&gt;
    if (DISPLAY_ENABLED) {&lt;br /&gt;
      display.clearDisplay();&lt;br /&gt;
      display.setTextSize(1);&lt;br /&gt;
      display.setTextColor(BLACK);&lt;br /&gt;
      display.setCursor(0, 0);&lt;br /&gt;
      display.println(&amp;quot;*OTA Update*&amp;quot;);&lt;br /&gt;
      display.println(&amp;quot;&amp;quot;);&lt;br /&gt;
      display.setTextSize(2);&lt;br /&gt;
      display.display();&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {&lt;br /&gt;
    static uint8_t lastProgress = 0;&lt;br /&gt;
    static unsigned long nextTime = 0;&lt;br /&gt;
    uint8_t p = (progress / (total / 100));&lt;br /&gt;
&lt;br /&gt;
    if (p == 100 || (p != lastProgress &amp;amp;&amp;amp; millis() &amp;gt; nextTime)) {&lt;br /&gt;
      nextTime = millis() + 100;&lt;br /&gt;
      if (p &amp;lt; 100) {&lt;br /&gt;
        if (DISPLAY_ENABLED) {&lt;br /&gt;
          display.clearDisplay();&lt;br /&gt;
          display.setTextSize(1);&lt;br /&gt;
          display.setCursor(0, 0);&lt;br /&gt;
          display.println(&amp;quot;*OTA Update*&amp;quot;);&lt;br /&gt;
          display.println(&amp;quot;&amp;quot;);&lt;br /&gt;
          display.setTextSize(2);&lt;br /&gt;
          display.setCursor(24, 24);&lt;br /&gt;
          display.println(String(p) + &amp;quot;%&amp;quot;);&lt;br /&gt;
          display.display();&lt;br /&gt;
        }&lt;br /&gt;
        lastProgress = p;&lt;br /&gt;
      } else {&lt;br /&gt;
        if (DISPLAY_ENABLED) {&lt;br /&gt;
          display.clearDisplay();&lt;br /&gt;
          display.setTextSize(1);&lt;br /&gt;
          display.setTextColor(BLACK);&lt;br /&gt;
          display.setCursor(0, 0);&lt;br /&gt;
          display.println(&amp;quot;*OTA Success*&amp;quot;);&lt;br /&gt;
          display.println(&amp;quot;&amp;quot;);&lt;br /&gt;
          display.println(&amp;quot;rebooting...&amp;quot;);&lt;br /&gt;
          display.display();&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
  ArduinoOTA.onError([](ota_error_t error) {&lt;br /&gt;
    if (DISPLAY_ENABLED) {&lt;br /&gt;
      display.println(&amp;quot;ERROR: &amp;quot; + String(error));&lt;br /&gt;
      display.display();&lt;br /&gt;
      delay(1000);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
  ArduinoOTA.begin();&lt;br /&gt;
  &lt;br /&gt;
  if (DISPLAY_ENABLED) {&lt;br /&gt;
    display.println(WiFi.localIP());&lt;br /&gt;
    display.display();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; 10; i++) {&lt;br /&gt;
    ArduinoOTA.handle();&lt;br /&gt;
    delay(100);&lt;br /&gt;
    yield();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if(!SD.begin(PIN_SD_CS)) {&lt;br /&gt;
  //no SD found&lt;br /&gt;
  display.clearDisplay();&lt;br /&gt;
  display.println(&amp;quot;No SD found&amp;quot;);&lt;br /&gt;
  display.display();&lt;br /&gt;
  //TODO - change delay to loop w/yield&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
  } else {&lt;br /&gt;
    //SD initialized&lt;br /&gt;
    sdEnabled = true;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  dht.begin();&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (wifiEnabled)&lt;br /&gt;
    ArduinoOTA.handle();&lt;br /&gt;
&lt;br /&gt;
  handleHumidity();&lt;br /&gt;
&lt;br /&gt;
  delay(50);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handleHumidity() {&lt;br /&gt;
  static unsigned long next = 15000;&lt;br /&gt;
  unsigned long now = millis();&lt;br /&gt;
&lt;br /&gt;
  if (now &amp;gt; next) {&lt;br /&gt;
    next = now + 10000;&lt;br /&gt;
    int h, c, f;&lt;br /&gt;
    h = dht.readHumidity();&lt;br /&gt;
    c = dht.readTemperature();&lt;br /&gt;
    f = dht.readTemperature(true);&lt;br /&gt;
&lt;br /&gt;
    display.clearDisplay();&lt;br /&gt;
    display.setCursor(0, 0);&lt;br /&gt;
    display.setTextSize(2);&lt;br /&gt;
    display.println(String(c) + &amp;quot;/&amp;quot; + String(f));&lt;br /&gt;
    display.setTextSize(3);&lt;br /&gt;
    display.println(String(h) + &amp;quot;%&amp;quot;);&lt;br /&gt;
    display.display();&lt;br /&gt;
&lt;br /&gt;
    if (sdEnabled) {&lt;br /&gt;
      String data = String(millis()) + &amp;quot;,&amp;quot;;&lt;br /&gt;
      data += String(h) + &amp;quot;,&amp;quot;;&lt;br /&gt;
      data += String(c) + &amp;quot;,&amp;quot;;&lt;br /&gt;
      data += String(f);&lt;br /&gt;
  &lt;br /&gt;
      File dataFile = SD.open(&amp;quot;HUMIDITY.TXT&amp;quot;, FILE_WRITE);&lt;br /&gt;
  &lt;br /&gt;
      if (dataFile) {&lt;br /&gt;
        dataFile.println(data);&lt;br /&gt;
        dataFile.close();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(5, HIGH);&lt;br /&gt;
    delay(100);&lt;br /&gt;
    digitalWrite(5, LOW);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Slightly modified version of Adafruit Nokia Display library (Adafruit_PCD8544.cpp)...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*********************************************************************&lt;br /&gt;
This is a library for our Monochrome Nokia 5110 LCD Displays&lt;br /&gt;
&lt;br /&gt;
  Pick one up today in the adafruit shop!&lt;br /&gt;
  ------&amp;gt; http://www.adafruit.com/products/338&lt;br /&gt;
&lt;br /&gt;
These displays use SPI to communicate, 4 or 5 pins are required to  &lt;br /&gt;
interface&lt;br /&gt;
&lt;br /&gt;
Adafruit invests time and resources providing this open source code, &lt;br /&gt;
please support Adafruit and open-source hardware by purchasing &lt;br /&gt;
products from Adafruit!&lt;br /&gt;
&lt;br /&gt;
Written by Limor Fried/Ladyada  for Adafruit Industries.  &lt;br /&gt;
BSD license, check license.txt for more information&lt;br /&gt;
All text above, and the splash screen below must be included in any redistribution&lt;br /&gt;
&lt;br /&gt;
Hacked for ESP8266 by thex #0ff&lt;br /&gt;
*********************************************************************/&lt;br /&gt;
&lt;br /&gt;
//#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#if defined(ESP8266)&lt;br /&gt;
#include &amp;lt;pgmspace.h&amp;gt;&lt;br /&gt;
#else&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
#endif&lt;br /&gt;
#if defined(ARDUINO) &amp;amp;&amp;amp; ARDUINO &amp;gt;= 100&lt;br /&gt;
  #include &amp;quot;Arduino.h&amp;quot;&lt;br /&gt;
#else&lt;br /&gt;
  #include &amp;quot;WProgram.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifdef __AVR__&lt;br /&gt;
  #include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifndef _BV&lt;br /&gt;
  #define _BV(x) (1 &amp;lt;&amp;lt; (x))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;quot;Adafruit_PCD8544.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// the memory buffer for the LCD&lt;br /&gt;
uint8_t pcd8544_buffer[LCDWIDTH * LCDHEIGHT / 8] = {&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFC, 0xFE, 0xFF, 0xFC, 0xE0,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,&lt;br /&gt;
0xF8, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x80, 0xC0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x7F,&lt;br /&gt;
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF,&lt;br /&gt;
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC7, 0xC7, 0x87, 0x8F, 0x9F, 0x9F, 0xFF, 0xFF, 0xFF,&lt;br /&gt;
0xC1, 0xC0, 0xE0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xFC, 0xFC, 0xFE, 0xFE, 0xFE,&lt;br /&gt;
0xFC, 0xFC, 0xF8, 0xF8, 0xF0, 0xE0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x80, 0xC0, 0xE0, 0xF1, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x0F, 0x0F, 0x87,&lt;br /&gt;
0xE7, 0xFF, 0xFF, 0xFF, 0x1F, 0x1F, 0x3F, 0xF9, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xFD, 0xFF,&lt;br /&gt;
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0xF0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,&lt;br /&gt;
0x7E, 0x3F, 0x3F, 0x0F, 0x1F, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xE0, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF,&lt;br /&gt;
0xFF, 0xFC, 0xF0, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01,&lt;br /&gt;
0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x1F, 0x3F, 0x7F, 0x7F,&lt;br /&gt;
0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x1F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// reduces how much is refreshed, which speeds it up!&lt;br /&gt;
// originally derived from Steve Evans/JCW&#039;s mod but cleaned up and&lt;br /&gt;
// optimized&lt;br /&gt;
//#define enablePartialUpdate&lt;br /&gt;
&lt;br /&gt;
#ifdef enablePartialUpdate&lt;br /&gt;
static uint8_t xUpdateMin, xUpdateMax, yUpdateMin, yUpdateMax;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
static void updateBoundingBox(uint8_t xmin, uint8_t ymin, uint8_t xmax, uint8_t ymax) {&lt;br /&gt;
#ifdef enablePartialUpdate&lt;br /&gt;
  if (xmin &amp;lt; xUpdateMin) xUpdateMin = xmin;&lt;br /&gt;
  if (xmax &amp;gt; xUpdateMax) xUpdateMax = xmax;&lt;br /&gt;
  if (ymin &amp;lt; yUpdateMin) yUpdateMin = ymin;&lt;br /&gt;
  if (ymax &amp;gt; yUpdateMax) yUpdateMax = ymax;&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Adafruit_PCD8544::Adafruit_PCD8544(int8_t SCLK, int8_t DIN, int8_t DC,&lt;br /&gt;
    int8_t CS, int8_t RST) : Adafruit_GFX(LCDWIDTH, LCDHEIGHT) {&lt;br /&gt;
  _din = DIN;&lt;br /&gt;
  _sclk = SCLK;&lt;br /&gt;
  _dc = DC;&lt;br /&gt;
  _rst = RST;&lt;br /&gt;
  _cs = CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Adafruit_PCD8544::Adafruit_PCD8544(int8_t SCLK, int8_t DIN, int8_t DC,&lt;br /&gt;
    int8_t RST) : Adafruit_GFX(LCDWIDTH, LCDHEIGHT) {&lt;br /&gt;
  _din = DIN;&lt;br /&gt;
  _sclk = SCLK;&lt;br /&gt;
  _dc = DC;&lt;br /&gt;
  _rst = RST;&lt;br /&gt;
  _cs = -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Adafruit_PCD8544::Adafruit_PCD8544(int8_t DC, int8_t CS, int8_t RST):&lt;br /&gt;
  Adafruit_GFX(LCDWIDTH, LCDHEIGHT) {&lt;br /&gt;
  // -1 for din and sclk specify using hardware SPI&lt;br /&gt;
  _din = -1;&lt;br /&gt;
  _sclk = -1;&lt;br /&gt;
  _dc = DC;&lt;br /&gt;
  _rst = RST;&lt;br /&gt;
  _cs = CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// the most basic function, set a single pixel&lt;br /&gt;
void Adafruit_PCD8544::drawPixel(int16_t x, int16_t y, uint16_t color) {&lt;br /&gt;
  if ((x &amp;lt; 0) || (x &amp;gt;= _width) || (y &amp;lt; 0) || (y &amp;gt;= _height))&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  int16_t t;&lt;br /&gt;
  switch(rotation){&lt;br /&gt;
    case 1:&lt;br /&gt;
      t = x;&lt;br /&gt;
      x = y;&lt;br /&gt;
      y =  LCDHEIGHT - 1 - t;&lt;br /&gt;
      break;&lt;br /&gt;
    case 2:&lt;br /&gt;
      x = LCDWIDTH - 1 - x;&lt;br /&gt;
      y = LCDHEIGHT - 1 - y;&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      t = x;&lt;br /&gt;
      x = LCDWIDTH - 1 - y;&lt;br /&gt;
      y = t;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if ((x &amp;lt; 0) || (x &amp;gt;= LCDWIDTH) || (y &amp;lt; 0) || (y &amp;gt;= LCDHEIGHT))&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  // x is which column&lt;br /&gt;
  if (color) &lt;br /&gt;
    pcd8544_buffer[x+ (y/8)*LCDWIDTH] |= _BV(y%8);  &lt;br /&gt;
  else&lt;br /&gt;
    pcd8544_buffer[x+ (y/8)*LCDWIDTH] &amp;amp;= ~_BV(y%8); &lt;br /&gt;
&lt;br /&gt;
  updateBoundingBox(x,y,x,y);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// the most basic function, get a single pixel&lt;br /&gt;
uint8_t Adafruit_PCD8544::getPixel(int8_t x, int8_t y) {&lt;br /&gt;
  if ((x &amp;lt; 0) || (x &amp;gt;= LCDWIDTH) || (y &amp;lt; 0) || (y &amp;gt;= LCDHEIGHT))&lt;br /&gt;
    return 0;&lt;br /&gt;
&lt;br /&gt;
  return (pcd8544_buffer[x+ (y/8)*LCDWIDTH] &amp;gt;&amp;gt; (y%8)) &amp;amp; 0x1;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Adafruit_PCD8544::begin(uint8_t contrast, uint8_t bias) {&lt;br /&gt;
  if (isHardwareSPI()) {&lt;br /&gt;
    // Setup hardware SPI.&lt;br /&gt;
    SPI.begin();&lt;br /&gt;
#ifdef ESP8266&lt;br /&gt;
    // Datasheet says 4 MHz is max SPI clock speed&lt;br /&gt;
    SPI.setFrequency(400000);&lt;br /&gt;
#else&lt;br /&gt;
    SPI.setClockDivider(PCD8544_SPI_CLOCK_DIV);&lt;br /&gt;
#endif&lt;br /&gt;
    SPI.setDataMode(SPI_MODE0);&lt;br /&gt;
    SPI.setBitOrder(MSBFIRST);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    // Setup software SPI.&lt;br /&gt;
&lt;br /&gt;
    // Set software SPI specific pin outputs.&lt;br /&gt;
    pinMode(_din, OUTPUT);&lt;br /&gt;
    pinMode(_sclk, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
#ifndef ESP8266&lt;br /&gt;
    // Set software SPI ports and masks.&lt;br /&gt;
    clkport     = portOutputRegister(digitalPinToPort(_sclk));&lt;br /&gt;
    clkpinmask  = digitalPinToBitMask(_sclk);&lt;br /&gt;
    mosiport    = portOutputRegister(digitalPinToPort(_din));&lt;br /&gt;
    mosipinmask = digitalPinToBitMask(_din);&lt;br /&gt;
#endif&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Set common pin outputs.&lt;br /&gt;
  pinMode(_dc, OUTPUT);&lt;br /&gt;
  if (_rst &amp;gt; 0)&lt;br /&gt;
      pinMode(_rst, OUTPUT);&lt;br /&gt;
  if (_cs &amp;gt; 0)&lt;br /&gt;
      pinMode(_cs, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  // toggle RST low to reset&lt;br /&gt;
  if (_rst &amp;gt; 0) {&lt;br /&gt;
    digitalWrite(_rst, LOW);&lt;br /&gt;
    delay(500);&lt;br /&gt;
    digitalWrite(_rst, HIGH);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // get into the EXTENDED mode!&lt;br /&gt;
  command(PCD8544_FUNCTIONSET | PCD8544_EXTENDEDINSTRUCTION );&lt;br /&gt;
&lt;br /&gt;
  // LCD bias select (4 is optimal?)&lt;br /&gt;
  command(PCD8544_SETBIAS | bias);&lt;br /&gt;
&lt;br /&gt;
  // set VOP&lt;br /&gt;
  if (contrast &amp;gt; 0x7f)&lt;br /&gt;
    contrast = 0x7f;&lt;br /&gt;
&lt;br /&gt;
  command( PCD8544_SETVOP | contrast); // Experimentally determined&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // normal mode&lt;br /&gt;
  command(PCD8544_FUNCTIONSET);&lt;br /&gt;
&lt;br /&gt;
  // Set display to Normal&lt;br /&gt;
  command(PCD8544_DISPLAYCONTROL | PCD8544_DISPLAYNORMAL);&lt;br /&gt;
&lt;br /&gt;
  // initial display line&lt;br /&gt;
  // set page address&lt;br /&gt;
  // set column address&lt;br /&gt;
  // write display data&lt;br /&gt;
&lt;br /&gt;
  // set up a bounding box for screen updates&lt;br /&gt;
&lt;br /&gt;
  updateBoundingBox(0, 0, LCDWIDTH-1, LCDHEIGHT-1);&lt;br /&gt;
  // Push out pcd8544_buffer to the Display (will show the AFI logo)&lt;br /&gt;
  display();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
inline void Adafruit_PCD8544::spiWrite(uint8_t d) {&lt;br /&gt;
  if (isHardwareSPI()) {&lt;br /&gt;
    // Hardware SPI write.&lt;br /&gt;
    SPI.transfer(d);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
#ifdef ESP8266&lt;br /&gt;
    // Software SPI write with bit banging.&lt;br /&gt;
    for(uint8_t bit = 0x80; bit; bit &amp;gt;&amp;gt;= 1) {&lt;br /&gt;
      digitalWrite(_sclk, LOW);&lt;br /&gt;
      if (d &amp;amp; bit) digitalWrite(_din, HIGH);&lt;br /&gt;
      else         digitalWrite(_din, LOW);&lt;br /&gt;
      digitalWrite(_sclk, HIGH);&lt;br /&gt;
    }&lt;br /&gt;
#else&lt;br /&gt;
    // Software SPI write with bit banging.&lt;br /&gt;
    for(uint8_t bit = 0x80; bit; bit &amp;gt;&amp;gt;= 1) {&lt;br /&gt;
      *clkport &amp;amp;= ~clkpinmask;&lt;br /&gt;
      if(d &amp;amp; bit) *mosiport |=  mosipinmask;&lt;br /&gt;
      else        *mosiport &amp;amp;= ~mosipinmask;&lt;br /&gt;
      *clkport |=  clkpinmask;&lt;br /&gt;
    }&lt;br /&gt;
#endif&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool Adafruit_PCD8544::isHardwareSPI() {&lt;br /&gt;
  return (_din == -1 &amp;amp;&amp;amp; _sclk == -1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Adafruit_PCD8544::command(uint8_t c) {&lt;br /&gt;
  digitalWrite(_dc, LOW);&lt;br /&gt;
  if (_cs &amp;gt; 0)&lt;br /&gt;
    digitalWrite(_cs, LOW);&lt;br /&gt;
  spiWrite(c);&lt;br /&gt;
  if (_cs &amp;gt; 0)&lt;br /&gt;
    digitalWrite(_cs, HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Adafruit_PCD8544::data(uint8_t c) {&lt;br /&gt;
  digitalWrite(_dc, HIGH);&lt;br /&gt;
  if (_cs &amp;gt; 0)&lt;br /&gt;
    digitalWrite(_cs, LOW);&lt;br /&gt;
  spiWrite(c);&lt;br /&gt;
  if (_cs &amp;gt; 0)&lt;br /&gt;
    digitalWrite(_cs, HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Adafruit_PCD8544::setContrast(uint8_t val) {&lt;br /&gt;
  if (val &amp;gt; 0x7f) {&lt;br /&gt;
    val = 0x7f;&lt;br /&gt;
  }&lt;br /&gt;
  command(PCD8544_FUNCTIONSET | PCD8544_EXTENDEDINSTRUCTION );&lt;br /&gt;
  command( PCD8544_SETVOP | val); &lt;br /&gt;
  command(PCD8544_FUNCTIONSET);&lt;br /&gt;
  &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Adafruit_PCD8544::display(void) {&lt;br /&gt;
  uint8_t col, maxcol, p;&lt;br /&gt;
  &lt;br /&gt;
  for(p = 0; p &amp;lt; 6; p++) {&lt;br /&gt;
#ifdef enablePartialUpdate&lt;br /&gt;
    // check if this page is part of update&lt;br /&gt;
    if ( yUpdateMin &amp;gt;= ((p+1)*8) ) {&lt;br /&gt;
      continue;   // nope, skip it!&lt;br /&gt;
    }&lt;br /&gt;
    if (yUpdateMax &amp;lt; p*8) {&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
    command(PCD8544_SETYADDR | p);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#ifdef enablePartialUpdate&lt;br /&gt;
    col = xUpdateMin;&lt;br /&gt;
    maxcol = xUpdateMax;&lt;br /&gt;
#else&lt;br /&gt;
    // start at the beginning of the row&lt;br /&gt;
    col = 0;&lt;br /&gt;
    maxcol = LCDWIDTH-1;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
    command(PCD8544_SETXADDR | col);&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(_dc, HIGH);&lt;br /&gt;
    if (_cs &amp;gt; 0)&lt;br /&gt;
      digitalWrite(_cs, LOW);&lt;br /&gt;
    for(; col &amp;lt;= maxcol; col++) {&lt;br /&gt;
      spiWrite(pcd8544_buffer[(LCDWIDTH*p)+col]);&lt;br /&gt;
    }&lt;br /&gt;
    if (_cs &amp;gt; 0)&lt;br /&gt;
      digitalWrite(_cs, HIGH);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  command(PCD8544_SETYADDR );  // no idea why this is necessary but it is to finish the last byte?&lt;br /&gt;
#ifdef enablePartialUpdate&lt;br /&gt;
  xUpdateMin = LCDWIDTH - 1;&lt;br /&gt;
  xUpdateMax = 0;&lt;br /&gt;
  yUpdateMin = LCDHEIGHT-1;&lt;br /&gt;
  yUpdateMax = 0;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// clear everything&lt;br /&gt;
void Adafruit_PCD8544::clearDisplay(void) {&lt;br /&gt;
  memset(pcd8544_buffer, 0, LCDWIDTH*LCDHEIGHT/8);&lt;br /&gt;
  updateBoundingBox(0, 0, LCDWIDTH-1, LCDHEIGHT-1);&lt;br /&gt;
  cursor_y = cursor_x = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
// this doesnt touch the buffer, just clears the display RAM - might be handy&lt;br /&gt;
void Adafruit_PCD8544::clearDisplay(void) {&lt;br /&gt;
  &lt;br /&gt;
  uint8_t p, c;&lt;br /&gt;
  &lt;br /&gt;
  for(p = 0; p &amp;lt; 8; p++) {&lt;br /&gt;
&lt;br /&gt;
    st7565_command(CMD_SET_PAGE | p);&lt;br /&gt;
    for(c = 0; c &amp;lt; 129; c++) {&lt;br /&gt;
      //uart_putw_dec(c);&lt;br /&gt;
      //uart_putchar(&#039; &#039;);&lt;br /&gt;
      st7565_command(CMD_SET_COLUMN_LOWER | (c &amp;amp; 0xf));&lt;br /&gt;
      st7565_command(CMD_SET_COLUMN_UPPER | ((c &amp;gt;&amp;gt; 4) &amp;amp; 0xf));&lt;br /&gt;
      st7565_data(0x0);&lt;br /&gt;
    }     &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=ESP8266/DHT&amp;diff=52649</id>
		<title>ESP8266/DHT</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=ESP8266/DHT&amp;diff=52649"/>
		<updated>2016-07-08T02:27:27Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: #0ff&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Humidity/Temperature sensor with SD Card data logger.&lt;br /&gt;
&lt;br /&gt;
Note: Requires modified Nokia library.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266mDNS.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiUdp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ArduinoOTA.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SD.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_PCD8544.h&amp;gt;&lt;br /&gt;
#include &amp;lt;DHT.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define DHTTYPE DHT11&lt;br /&gt;
&lt;br /&gt;
#define PIN_DHT   1&lt;br /&gt;
&lt;br /&gt;
#define PIN_CE    16  //Pin 2 on LCD&lt;br /&gt;
#define PIN_DC    15  //Pin 3 on LCD&lt;br /&gt;
&lt;br /&gt;
#define PIN_PUSH  0  // Push Button Switch&lt;br /&gt;
&lt;br /&gt;
#define PIN_SD_CS 10 // Make sure &amp;quot;DIO&amp;quot; is selected&lt;br /&gt;
&lt;br /&gt;
#define PIN_SOUND 3 // Piezo, overlapped with Serial Rx&lt;br /&gt;
&lt;br /&gt;
//You may find a different size screen, but this one is 84 by 48 pixels&lt;br /&gt;
#define LCD_X     84&lt;br /&gt;
#define LCD_Y     48&lt;br /&gt;
&lt;br /&gt;
#define LINE_INTERVAL 200&lt;br /&gt;
#define PING_INTERVAL 1000&lt;br /&gt;
&lt;br /&gt;
#define MODE_HUMIDITY 16&lt;br /&gt;
#define MODE_SOUND 1&lt;br /&gt;
#define MODE_PING 2&lt;br /&gt;
#define MODE_CARD 3&lt;br /&gt;
#define MODE_FILE 4&lt;br /&gt;
#define MODE_CONTRAST 5&lt;br /&gt;
#define MODE_FIRMWARE 6&lt;br /&gt;
#define MODE_INITIALIZE 255&lt;br /&gt;
&lt;br /&gt;
#define SWITCH_DEBOUNCE_TIME 50 // Timeout for debouncing presses&lt;br /&gt;
#define SWITCH_MULTI_TIME 300   // Timeout for detecting multiple clicks&lt;br /&gt;
#define SWITCH_HOLD_TIME 2000   // Timeout for detecting press and hold&lt;br /&gt;
&lt;br /&gt;
#define SWITCH_PRESS 1&lt;br /&gt;
#define SWITCH_RELEASE 2&lt;br /&gt;
#define SWITCH_MULTI 4&lt;br /&gt;
#define SWITCH_HOLD 8&lt;br /&gt;
&lt;br /&gt;
#define DISPLAY_ENABLED true&lt;br /&gt;
&lt;br /&gt;
// set up variables using the SD utility library functions:&lt;br /&gt;
Sd2Card card;&lt;br /&gt;
SdVolume volume;&lt;br /&gt;
SdFile root;&lt;br /&gt;
bool sdEnabled = false;&lt;br /&gt;
&lt;br /&gt;
unsigned long nextLineMillis = 0;&lt;br /&gt;
unsigned long nextPing = 0;&lt;br /&gt;
unsigned long pingMillis = 0;&lt;br /&gt;
unsigned long debounceMillis = 0;&lt;br /&gt;
unsigned long doubleMillis = 0;&lt;br /&gt;
unsigned long holdMillis = 0;&lt;br /&gt;
&lt;br /&gt;
int lastPing = 0;&lt;br /&gt;
&lt;br /&gt;
bool pushStateOn = false;&lt;br /&gt;
&lt;br /&gt;
uint8_t activeMode = MODE_INITIALIZE;&lt;br /&gt;
uint8_t clickCount = 0;&lt;br /&gt;
&lt;br /&gt;
WiFiClient client;&lt;br /&gt;
&lt;br /&gt;
#if defined(DISPLAY_ENABLED)&lt;br /&gt;
Adafruit_PCD8544 display = Adafruit_PCD8544(PIN_DC, PIN_CE, -1);&lt;br /&gt;
#else&lt;br /&gt;
Adafruit_PCD8544 display = Adafruit_PCD8544(4, 5, 2, -1);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
bool wifiEnabled = false;&lt;br /&gt;
&lt;br /&gt;
DHT dht(PIN_DHT, DHTTYPE);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(PIN_PUSH, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PIN_SOUND, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  pinMode(5, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  if (DISPLAY_ENABLED) {&lt;br /&gt;
    display.begin();&lt;br /&gt;
    display.setContrast(55);&lt;br /&gt;
&lt;br /&gt;
    display.clearDisplay();&lt;br /&gt;
&lt;br /&gt;
    display.setTextSize(1);&lt;br /&gt;
    display.setTextColor(BLACK);&lt;br /&gt;
    display.setCursor(0, 0);&lt;br /&gt;
    display.println(&amp;quot;#0FF DHT&amp;quot;);&lt;br /&gt;
    display.setTextColor(WHITE, BLACK); // &#039;inverted&#039; text&lt;br /&gt;
    display.setTextSize(2);&lt;br /&gt;
    display.println(&amp;quot; void &amp;quot;);&lt;br /&gt;
    display.setTextSize(1);&lt;br /&gt;
    display.setTextColor(BLACK);&lt;br /&gt;
    display.println(&amp;quot;WiFi: &amp;quot; + String(ssid).substring(0, 7));&lt;br /&gt;
    display.display();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // WiFi.begin(ssid, password);&lt;br /&gt;
  WiFi.begin();&lt;br /&gt;
  unsigned long timeout = millis() + 10000;&lt;br /&gt;
  while (WiFi.status() != WL_CONNECTED){&lt;br /&gt;
    digitalWrite(5, HIGH);&lt;br /&gt;
    delay(50);&lt;br /&gt;
    digitalWrite(5, LOW);&lt;br /&gt;
    delay(450);&lt;br /&gt;
//    Serial.printf(&amp;quot;.\n&amp;quot;);&lt;br /&gt;
    if (millis() &amp;gt; timeout)&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  wifiEnabled = WiFi.status() == WL_CONNECTED;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (wifiEnabled) {&lt;br /&gt;
  // Port defaults to 8266&lt;br /&gt;
  // ArduinoOTA.setPort(8266);&lt;br /&gt;
&lt;br /&gt;
  // Hostname defaults to esp8266-[ChipID]&lt;br /&gt;
  // ArduinoOTA.setHostname(&amp;quot;myesp8266&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // No authentication by default&lt;br /&gt;
  // ArduinoOTA.setPassword((const char *)&amp;quot;123&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  ArduinoOTA.onStart([]() {&lt;br /&gt;
//    Serial.println(&amp;quot;Start&amp;quot;);&lt;br /&gt;
    if (DISPLAY_ENABLED) {&lt;br /&gt;
      display.clearDisplay();&lt;br /&gt;
      display.setTextSize(1);&lt;br /&gt;
      display.setTextColor(BLACK);&lt;br /&gt;
      display.setCursor(0, 0);&lt;br /&gt;
      display.println(&amp;quot;*OTA Update*&amp;quot;);&lt;br /&gt;
      display.println(&amp;quot;&amp;quot;);&lt;br /&gt;
      display.setTextSize(2);&lt;br /&gt;
      display.display();&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
  ArduinoOTA.onEnd([]() {&lt;br /&gt;
//    Serial.println(&amp;quot;\nEnd&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {&lt;br /&gt;
    static uint8_t lastProgress = 0;&lt;br /&gt;
    static unsigned long nextTime = 0;&lt;br /&gt;
    uint8_t p = (progress / (total / 100));&lt;br /&gt;
//    Serial.printf(&amp;quot;Progress: %u%%\r&amp;quot;, p);&lt;br /&gt;
    if (p == 100 || (p != lastProgress &amp;amp;&amp;amp; millis() &amp;gt; nextTime)) {&lt;br /&gt;
      nextTime = millis() + 100;&lt;br /&gt;
      if (p &amp;lt; 100) {&lt;br /&gt;
        if (DISPLAY_ENABLED) {&lt;br /&gt;
          display.clearDisplay();&lt;br /&gt;
          display.setTextSize(1);&lt;br /&gt;
          display.setCursor(0, 0);&lt;br /&gt;
          display.println(&amp;quot;*OTA Update*&amp;quot;);&lt;br /&gt;
          display.println(&amp;quot;&amp;quot;);&lt;br /&gt;
          display.setTextSize(2);&lt;br /&gt;
          display.setCursor(24, 24);&lt;br /&gt;
          display.println(String(p) + &amp;quot;%&amp;quot;);&lt;br /&gt;
          display.display();&lt;br /&gt;
        }&lt;br /&gt;
        lastProgress = p;&lt;br /&gt;
      } else {&lt;br /&gt;
//        Serial.println(&amp;quot;Start&amp;quot;);&lt;br /&gt;
        if (DISPLAY_ENABLED) {&lt;br /&gt;
          display.clearDisplay();&lt;br /&gt;
          display.setTextSize(1);&lt;br /&gt;
          display.setTextColor(BLACK);&lt;br /&gt;
          display.setCursor(0, 0);&lt;br /&gt;
          display.println(&amp;quot;*OTA Success*&amp;quot;);&lt;br /&gt;
          display.println(&amp;quot;&amp;quot;);&lt;br /&gt;
          display.println(&amp;quot;rebooting...&amp;quot;);&lt;br /&gt;
          display.display();&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
  ArduinoOTA.onError([](ota_error_t error) {&lt;br /&gt;
//    Serial.printf(&amp;quot;Error[%u]: &amp;quot;, error);&lt;br /&gt;
//    if (error == OTA_AUTH_ERROR) Serial.println(&amp;quot;Auth Failed&amp;quot;);&lt;br /&gt;
//    else if (error == OTA_BEGIN_ERROR) Serial.println(&amp;quot;Begin Failed&amp;quot;);&lt;br /&gt;
//    else if (error == OTA_CONNECT_ERROR) Serial.println(&amp;quot;Connect Failed&amp;quot;);&lt;br /&gt;
//    else if (error == OTA_RECEIVE_ERROR) Serial.println(&amp;quot;Receive Failed&amp;quot;);&lt;br /&gt;
//    else if (error == OTA_END_ERROR) Serial.println(&amp;quot;End Failed&amp;quot;);&lt;br /&gt;
    if (DISPLAY_ENABLED) {&lt;br /&gt;
      display.println(&amp;quot;ERROR: &amp;quot; + String(error));&lt;br /&gt;
      display.display();&lt;br /&gt;
      delay(1000);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
  ArduinoOTA.begin();&lt;br /&gt;
&lt;br /&gt;
//  Serial.println(&amp;quot;Ready&amp;quot;);&lt;br /&gt;
//  Serial.print(&amp;quot;IP address: &amp;quot;);&lt;br /&gt;
//  Serial.println(WiFi.localIP());&lt;br /&gt;
  &lt;br /&gt;
  if (DISPLAY_ENABLED) {&lt;br /&gt;
    display.println(WiFi.localIP());&lt;br /&gt;
    display.display();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; 10; i++) {&lt;br /&gt;
    ArduinoOTA.handle();&lt;br /&gt;
    delay(100);&lt;br /&gt;
    yield();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//TODO - change delay to loop funtion&lt;br /&gt;
&lt;br /&gt;
if(!SD.begin(PIN_SD_CS)) {&lt;br /&gt;
  //no SD found&lt;br /&gt;
  display.clearDisplay();&lt;br /&gt;
  display.println(&amp;quot;No SD found&amp;quot;);&lt;br /&gt;
  display.display();&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
  } else {&lt;br /&gt;
  //SD initialized&lt;br /&gt;
  sdEnabled = true;&lt;br /&gt;
  }&lt;br /&gt;
  dht.begin();&lt;br /&gt;
&lt;br /&gt;
  setMode(MODE_HUMIDITY);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (wifiEnabled)&lt;br /&gt;
    ArduinoOTA.handle();&lt;br /&gt;
&lt;br /&gt;
  unsigned long now = millis();&lt;br /&gt;
  bool pushed = !digitalRead(PIN_PUSH);&lt;br /&gt;
  uint8_t buttonAction = 0;&lt;br /&gt;
&lt;br /&gt;
  if (client.connected()) {&lt;br /&gt;
    bool got = checkGet();&lt;br /&gt;
    if (got) {&lt;br /&gt;
      lastPing = millis() - pingMillis;&lt;br /&gt;
      nextPing = millis() + PING_INTERVAL;&lt;br /&gt;
    }&lt;br /&gt;
  } else if (millis() &amp;gt; nextPing) {&lt;br /&gt;
    sendGet();&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // Handle switch state(s)&lt;br /&gt;
  if (now &amp;gt; debounceMillis &amp;amp;&amp;amp;  pushed != pushStateOn) {&lt;br /&gt;
    // Push switch state change&lt;br /&gt;
    debounceMillis = now + SWITCH_DEBOUNCE_TIME;&lt;br /&gt;
    if (pushed) {&lt;br /&gt;
      // Switch pushed&lt;br /&gt;
      pushStateOn = true;&lt;br /&gt;
      if (doubleMillis &amp;lt; now) {&lt;br /&gt;
        doubleMillis = now + SWITCH_MULTI_TIME;&lt;br /&gt;
        clickCount = 1;&lt;br /&gt;
        // string2Line(&amp;quot;Switch: ON&amp;quot;, 4);&lt;br /&gt;
        buttonAction = SWITCH_PRESS;&lt;br /&gt;
      } else {&lt;br /&gt;
        // Multi-click, goto next mode&lt;br /&gt;
        setMode(activeMode &amp;lt; 5 ? activeMode + 1 : 0);&lt;br /&gt;
        clickCount++;&lt;br /&gt;
        // string2Line(&amp;quot;Mode: &amp;quot; + String(activeMode), 2);&lt;br /&gt;
        // string2Line(&amp;quot;Click: &amp;quot; + String(clickCount), 4);&lt;br /&gt;
        buttonAction = SWITCH_MULTI;&lt;br /&gt;
      }&lt;br /&gt;
      holdMillis = now + SWITCH_HOLD_TIME;&lt;br /&gt;
    } else {&lt;br /&gt;
      // Switch released&lt;br /&gt;
      pushStateOn = false;&lt;br /&gt;
      // string2Line(&amp;quot;Switch: OFF&amp;quot;, 4);&lt;br /&gt;
      holdMillis = 0;&lt;br /&gt;
      buttonAction = SWITCH_RELEASE;&lt;br /&gt;
    }&lt;br /&gt;
  } else if (pushed &amp;amp;&amp;amp; holdMillis &amp;gt; 0 &amp;amp;&amp;amp; now &amp;gt; holdMillis) {&lt;br /&gt;
    // Long press&lt;br /&gt;
    // string2Line(&amp;quot;Switch: HOLD&amp;quot;, 4);&lt;br /&gt;
    holdMillis = 0;&lt;br /&gt;
    buttonAction = SWITCH_HOLD;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (activeMode == MODE_HUMIDITY) {&lt;br /&gt;
    handleHumidity();&lt;br /&gt;
  } else if (activeMode == MODE_PING) {&lt;br /&gt;
    handlePingMode(buttonAction);&lt;br /&gt;
  } else if (activeMode == MODE_CARD) {&lt;br /&gt;
    handleCardMode(buttonAction);&lt;br /&gt;
  } else if (activeMode == MODE_FILE) {&lt;br /&gt;
    handleFileMode(buttonAction);&lt;br /&gt;
  } else if (activeMode == MODE_FIRMWARE) {&lt;br /&gt;
    handleFirmwareMode(buttonAction);&lt;br /&gt;
  } else if (activeMode == MODE_CONTRAST) {&lt;br /&gt;
    handleContrastMode();&lt;br /&gt;
  } else if (activeMode == MODE_SOUND) {&lt;br /&gt;
    handleSoundMode(buttonAction);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  int a = analogRead(A0) / 4;&lt;br /&gt;
  if (a &amp;gt; 255)&lt;br /&gt;
    a = 255;&lt;br /&gt;
  analogWrite(4, a);&lt;br /&gt;
  // analogWrite(5, digitalRead(0) ? 0 : 127);&lt;br /&gt;
&lt;br /&gt;
  delay(50);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setMode(uint8_t newMode) {&lt;br /&gt;
  if (newMode != activeMode) {&lt;br /&gt;
&lt;br /&gt;
    if (DISPLAY_ENABLED) {&lt;br /&gt;
      display.clearDisplay();&lt;br /&gt;
      display.setTextSize(1);&lt;br /&gt;
      display.setTextColor(BLACK);&lt;br /&gt;
      display.setCursor(28, 0);&lt;br /&gt;
      display.println(&amp;quot;mode:&amp;quot;);&lt;br /&gt;
      display.setCursor(32, 12);&lt;br /&gt;
      display.setTextSize(3);&lt;br /&gt;
      display.println(newMode);&lt;br /&gt;
      display.display();&lt;br /&gt;
      delay(300);&lt;br /&gt;
      yield();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (newMode == MODE_PING) {&lt;br /&gt;
      handlePingMode(0);&lt;br /&gt;
    } else if (newMode == MODE_CARD) {&lt;br /&gt;
      handleCardMode(SWITCH_HOLD);&lt;br /&gt;
    } else if (newMode == MODE_FILE) {&lt;br /&gt;
      handleFileMode(SWITCH_PRESS);&lt;br /&gt;
    } else if (newMode == MODE_FIRMWARE) {&lt;br /&gt;
      handleFirmwareMode(0);&lt;br /&gt;
    } else if (newMode == MODE_CONTRAST) {&lt;br /&gt;
      handleContrastMode();&lt;br /&gt;
    } else if (newMode == MODE_SOUND) {&lt;br /&gt;
      handleSoundMode(SWITCH_RELEASE);&lt;br /&gt;
    }&lt;br /&gt;
    activeMode = newMode;&lt;br /&gt;
  } else {&lt;br /&gt;
    // Not a new mode selection&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handleHumidity() {&lt;br /&gt;
  static unsigned long next = 5000;&lt;br /&gt;
  unsigned long now = millis();&lt;br /&gt;
&lt;br /&gt;
  if (now &amp;gt; next) {&lt;br /&gt;
    next = now + 2000;&lt;br /&gt;
    int h, c, f;&lt;br /&gt;
    h = dht.readHumidity();&lt;br /&gt;
    c = dht.readTemperature();&lt;br /&gt;
    f = dht.readTemperature(true);&lt;br /&gt;
&lt;br /&gt;
    display.clearDisplay();&lt;br /&gt;
    display.setCursor(0, 0);&lt;br /&gt;
    display.setTextSize(2);&lt;br /&gt;
    display.println(String(c) + &amp;quot;/&amp;quot; + String(f));&lt;br /&gt;
    display.setTextSize(3);&lt;br /&gt;
    display.println(String(h) + &amp;quot;%&amp;quot;);&lt;br /&gt;
    display.display();&lt;br /&gt;
&lt;br /&gt;
    if (sdEnabled) {&lt;br /&gt;
      String data = String(millis()) + &amp;quot;,&amp;quot;;&lt;br /&gt;
      data += String(h) + &amp;quot;,&amp;quot;;&lt;br /&gt;
      data += String(c) + &amp;quot;,&amp;quot;;&lt;br /&gt;
      data += String(f);&lt;br /&gt;
  &lt;br /&gt;
      File dataFile = SD.open(&amp;quot;humidity.txt&amp;quot;, FILE_WRITE);&lt;br /&gt;
  &lt;br /&gt;
      if (dataFile) {&lt;br /&gt;
        dataFile.println(data);&lt;br /&gt;
        dataFile.close();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(5, HIGH);&lt;br /&gt;
    delay(200);&lt;br /&gt;
    digitalWrite(5, LOW);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handlePingMode(uint8_t action) {&lt;br /&gt;
  if (client.connected()) {&lt;br /&gt;
    bool got = checkGet();&lt;br /&gt;
    if (got) {&lt;br /&gt;
      lastPing = millis() - pingMillis;&lt;br /&gt;
      nextPing = millis() + PING_INTERVAL;&lt;br /&gt;
//      Serial.println(&amp;quot;Ping: &amp;quot; + String(lastPing) + &amp;quot;ms&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  } else if (action == SWITCH_PRESS &amp;amp;&amp;amp; millis() &amp;gt; nextPing) {&lt;br /&gt;
    // Do new ping on switch press&lt;br /&gt;
    sendGet();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Check/show signal strength&lt;br /&gt;
  if (millis() &amp;gt; nextLineMillis) {&lt;br /&gt;
    int signalStrength = WiFi.RSSI() &amp;gt;= -50 ? 100 : 2 * (WiFi.RSSI() + 100);&lt;br /&gt;
    String signalBars = &amp;quot; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    nextLineMillis = millis() + LINE_INTERVAL;&lt;br /&gt;
&lt;br /&gt;
    if (DISPLAY_ENABLED) {&lt;br /&gt;
      display.clearDisplay();&lt;br /&gt;
      display.setTextSize(1);&lt;br /&gt;
      display.setTextColor(BLACK);&lt;br /&gt;
      display.setCursor(0, 0);&lt;br /&gt;
&lt;br /&gt;
      for (int i = 0; i &amp;lt; signalStrength / 10; i++)&lt;br /&gt;
        signalBars += &amp;quot;*&amp;quot;;&lt;br /&gt;
      display.println(signalBars);&lt;br /&gt;
      display.println(String(WiFi.RSSI()) + &amp;quot;db/&amp;quot; + String(signalStrength) + &amp;quot;%&amp;quot;);&lt;br /&gt;
      display.println();&lt;br /&gt;
      display.println(&amp;quot;Ping: &amp;quot; + String(lastPing) + &amp;quot;ms&amp;quot;);&lt;br /&gt;
      display.println();&lt;br /&gt;
      display.println(&amp;quot;#007 &amp;quot; + String(millis() / 1000));&lt;br /&gt;
&lt;br /&gt;
      display.display();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handleCardMode(uint8_t action) {&lt;br /&gt;
  if (action == SWITCH_HOLD)&lt;br /&gt;
    testSD();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handleFileMode(uint8_t action) {&lt;br /&gt;
  if (action == SWITCH_PRESS)&lt;br /&gt;
    getNextFile();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handleFirmwareMode(uint8_t action) {&lt;br /&gt;
  digitalWrite(PIN_SD_CS, digitalRead(2));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handleContrastMode() {&lt;br /&gt;
  static uint8_t contrast = 50;&lt;br /&gt;
  uint8_t analog = analogRead(A0) / 8;&lt;br /&gt;
&lt;br /&gt;
  if (!DISPLAY_ENABLED)&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  if (analog != contrast) {&lt;br /&gt;
    contrast = analog;&lt;br /&gt;
    display.clearDisplay();&lt;br /&gt;
    display.setCursor(0, 0);&lt;br /&gt;
    display.setTextSize(1);&lt;br /&gt;
    display.println(&amp;quot;  Contrast:&amp;quot;);&lt;br /&gt;
    display.setTextSize(3);&lt;br /&gt;
    display.println(contrast);&lt;br /&gt;
    display.setContrast(contrast);&lt;br /&gt;
    display.display();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  yield();&lt;br /&gt;
  delay(50);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handleSoundMode(uint8_t action) {&lt;br /&gt;
  static bool soundOn = false;&lt;br /&gt;
  static int frequency = 1000;&lt;br /&gt;
  static int duty = 512;&lt;br /&gt;
&lt;br /&gt;
  bool refresh = action != 0;&lt;br /&gt;
  &lt;br /&gt;
  if (action == SWITCH_HOLD) {&lt;br /&gt;
    // Toggle sound on&lt;br /&gt;
    soundOn = !soundOn;&lt;br /&gt;
    if (soundOn) {&lt;br /&gt;
      analogWrite(PIN_SOUND, duty);&lt;br /&gt;
    } else {&lt;br /&gt;
      analogWrite(PIN_SOUND, 0);&lt;br /&gt;
    }&lt;br /&gt;
  } else if (action == SWITCH_PRESS) {&lt;br /&gt;
    frequency = analogRead(A0) * 4;&lt;br /&gt;
    // Crash if set to 0, espressif PWM defined as 100Hz-1Khz&lt;br /&gt;
    if (frequency &amp;lt; 10) frequency = 10;&lt;br /&gt;
    analogWriteFreq(frequency);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (!digitalRead(2)) {&lt;br /&gt;
    // Right switch pressed&lt;br /&gt;
    duty = analogRead(A0);&lt;br /&gt;
    if (soundOn)&lt;br /&gt;
      analogWrite(PIN_SOUND, duty);&lt;br /&gt;
    refresh = true;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (refresh) {&lt;br /&gt;
    display.clearDisplay();&lt;br /&gt;
    display.setCursor(0, 0);&lt;br /&gt;
    display.setTextSize(1);&lt;br /&gt;
    display.println(&amp;quot; Sound: &amp;quot; + String(soundOn ? &amp;quot;ON&amp;quot; : &amp;quot;OFF&amp;quot;) + &amp;quot;\r\n&amp;quot;);&lt;br /&gt;
    display.setTextSize(2);&lt;br /&gt;
    display.println((frequency &amp;lt; 100 ? &amp;quot; &amp;quot; : &amp;quot;&amp;quot;) + String(frequency) + &amp;quot;Hz&amp;quot;);&lt;br /&gt;
    display.println(&amp;quot;  &amp;quot; + String(int(duty / 10.24)) + &amp;quot;%&amp;quot;);&lt;br /&gt;
    display.display();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  yield();&lt;br /&gt;
  delay(50);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void sendGet() {&lt;br /&gt;
  pingMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  if (!client.connect(&amp;quot;void-local.tablesugar.info&amp;quot;, 80)) {&lt;br /&gt;
    // Error&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  client.print(&amp;quot;GET /none.html HTTP/1.1\r\nHost: void-local.tablesugar.info\r\nConnection: close\r\n\r\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool checkGet() {&lt;br /&gt;
  if (client.available()) {&lt;br /&gt;
    // Got something&lt;br /&gt;
    client.stop();&lt;br /&gt;
    return true;&lt;br /&gt;
  } else if (millis() - pingMillis &amp;gt; 2000) {&lt;br /&gt;
    // Timeout&lt;br /&gt;
    client.stop();&lt;br /&gt;
    return true;&lt;br /&gt;
  }&lt;br /&gt;
  return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void testSD() {&lt;br /&gt;
//  Serial.print(&amp;quot;\nInitializing SD card...&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  if (DISPLAY_ENABLED) {&lt;br /&gt;
    display.clearDisplay();&lt;br /&gt;
    display.setTextSize(1);&lt;br /&gt;
    display.setTextColor(BLACK);&lt;br /&gt;
    display.setCursor(0, 0);&lt;br /&gt;
    display.println(&amp;quot;*Testing SD*&amp;quot;);&lt;br /&gt;
    display.display();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // we&#039;ll use the initialization code from the utility libraries&lt;br /&gt;
  // since we&#039;re just testing if the card is working!&lt;br /&gt;
  // if (!card.init(SPI_HALF_SPEED, PIN_SD_CS)) {&lt;br /&gt;
  if (!card.init(400000, PIN_SD_CS)) {&lt;br /&gt;
//    Serial.println(&amp;quot;initialization failed. Things to check:&amp;quot;);&lt;br /&gt;
//    Serial.println(&amp;quot;* is a card inserted?&amp;quot;);&lt;br /&gt;
//    Serial.println(&amp;quot;* is your wiring correct?&amp;quot;);&lt;br /&gt;
//    Serial.println(&amp;quot;* did you change the PIN_SD_CS pin to match your shield or module?&amp;quot;);&lt;br /&gt;
    if (DISPLAY_ENABLED) {&lt;br /&gt;
      display.println(&amp;quot;NO CARD!!!&amp;quot;);&lt;br /&gt;
      display.display();&lt;br /&gt;
    }&lt;br /&gt;
    return;&lt;br /&gt;
  } else {&lt;br /&gt;
//    Serial.println(&amp;quot;Wiring is correct and a card is present.&amp;quot;);&lt;br /&gt;
    // string2Line(&amp;quot;Card found&amp;quot;, 1);&lt;br /&gt;
    nextLineMillis = nextPing = 5000;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // print the type of card&lt;br /&gt;
//  Serial.print(&amp;quot;\nCard type: &amp;quot;);&lt;br /&gt;
  String cardType;&lt;br /&gt;
  switch (card.type()) {&lt;br /&gt;
    case SD_CARD_TYPE_SD1:&lt;br /&gt;
      cardType = &amp;quot;SD1&amp;quot;;&lt;br /&gt;
      break;&lt;br /&gt;
    case SD_CARD_TYPE_SD2:&lt;br /&gt;
      cardType = &amp;quot;SD2&amp;quot;;&lt;br /&gt;
      break;&lt;br /&gt;
    case SD_CARD_TYPE_SDHC:&lt;br /&gt;
      cardType = &amp;quot;SDHC&amp;quot;;&lt;br /&gt;
      break;&lt;br /&gt;
//    default:&lt;br /&gt;
//      Serial.println(&amp;quot;????&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Now we will try to open the &#039;volume&#039;/&#039;partition&#039; - it should be FAT16 or FAT32&lt;br /&gt;
  if (!volume.init(card)) {&lt;br /&gt;
//    Serial.println(&amp;quot;Could not find FAT16/FAT32 partition.\nMake sure you&#039;ve formatted the card&amp;quot;);&lt;br /&gt;
//    Serial.println(cardType);&lt;br /&gt;
    if (DISPLAY_ENABLED) {&lt;br /&gt;
      display.println(&amp;quot;No partition\r\nFAT16/FAT32\r\nfmt needed.&amp;quot;);&lt;br /&gt;
      display.display();&lt;br /&gt;
    }&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // print the type and size of the first FAT-type volume&lt;br /&gt;
  uint32_t volumesize;&lt;br /&gt;
//  Serial.print(&amp;quot;\nVolume type is FAT&amp;quot;);&lt;br /&gt;
//  Serial.println(volume.fatType(), DEC);&lt;br /&gt;
//  Serial.println();&lt;br /&gt;
&lt;br /&gt;
//  Serial.println(cardType);&lt;br /&gt;
&lt;br /&gt;
  if (DISPLAY_ENABLED)&lt;br /&gt;
    display.println(cardType + &amp;quot;/FAT&amp;quot; + String(volume.fatType()));&lt;br /&gt;
&lt;br /&gt;
  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks&lt;br /&gt;
  volumesize *= volume.clusterCount();       // we&#039;ll have a lot of clusters&lt;br /&gt;
  volumesize *= 512;                            // SD card blocks are always 512 bytes&lt;br /&gt;
//  Serial.print(&amp;quot;Volume size (bytes): &amp;quot;);&lt;br /&gt;
//  Serial.println(volumesize);&lt;br /&gt;
//  Serial.print(&amp;quot;Volume size (Kbytes): &amp;quot;);&lt;br /&gt;
  volumesize /= 1024;&lt;br /&gt;
//  Serial.println(volumesize);&lt;br /&gt;
//  Serial.print(&amp;quot;Volume size (Mbytes): &amp;quot;);&lt;br /&gt;
  volumesize /= 1024;&lt;br /&gt;
//  Serial.println(volumesize);&lt;br /&gt;
&lt;br /&gt;
  if (volumesize &amp;lt; 1000) {&lt;br /&gt;
    if (DISPLAY_ENABLED)&lt;br /&gt;
      display.println(&amp;quot;Size: &amp;quot; + String(volumesize) + &amp;quot;MB&amp;quot;);&lt;br /&gt;
  } else {&lt;br /&gt;
    if (DISPLAY_ENABLED)&lt;br /&gt;
      display.println(&amp;quot;Size: &amp;quot; + String(round(volumesize / 100) / 10) + &amp;quot;GB&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (DISPLAY_ENABLED)&lt;br /&gt;
    display.display();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//  Serial.println(&amp;quot;\nFiles found on the card (name, date and size in bytes): &amp;quot;);&lt;br /&gt;
  root.openRoot(volume);&lt;br /&gt;
&lt;br /&gt;
  // list all files in the card with date and size&lt;br /&gt;
  root.ls(LS_R | LS_DATE | LS_SIZE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void getNextFile() {&lt;br /&gt;
  static bool inited = false;&lt;br /&gt;
  static int fileCount = 0;&lt;br /&gt;
&lt;br /&gt;
//  Serial.println(&amp;quot;Get files...&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  if (DISPLAY_ENABLED) {&lt;br /&gt;
    display.clearDisplay();&lt;br /&gt;
    display.setTextSize(1);&lt;br /&gt;
    display.setTextColor(BLACK);&lt;br /&gt;
    display.setCursor(0, 0);&lt;br /&gt;
    display.print(&amp;quot;SD: &amp;quot; + String(fileCount) + &amp;quot; &amp;quot;);&lt;br /&gt;
    display.display();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (!inited &amp;amp;&amp;amp; !SD.begin(PIN_SD_CS)) {&lt;br /&gt;
//    Serial.println(&amp;quot;Initialization failed!&amp;quot;);&lt;br /&gt;
    if (DISPLAY_ENABLED) {&lt;br /&gt;
      display.println(&amp;quot;Initializat-\r\nion failed!&amp;quot;);&lt;br /&gt;
      display.display();&lt;br /&gt;
    }&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  inited = true;&lt;br /&gt;
&lt;br /&gt;
  File files = SD.open(&amp;quot;/&amp;quot;);&lt;br /&gt;
  File file;&lt;br /&gt;
  unsigned long fileSize;&lt;br /&gt;
&lt;br /&gt;
  int index = 0;&lt;br /&gt;
  while (true) {&lt;br /&gt;
    file = files.openNextFile();&lt;br /&gt;
    if (!file) {&lt;br /&gt;
      // end&lt;br /&gt;
//      Serial.println(&amp;quot;end of files&amp;quot;);&lt;br /&gt;
      if (DISPLAY_ENABLED)&lt;br /&gt;
        display.println(&amp;quot;end of files&amp;quot;);&lt;br /&gt;
        display.display();&lt;br /&gt;
      fileCount = 0;&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if (!file.isDirectory()) {&lt;br /&gt;
      if (index == fileCount) {&lt;br /&gt;
        // name of next file&lt;br /&gt;
//        Serial.print(String(file.name()));&lt;br /&gt;
        fileSize = file.size();&lt;br /&gt;
        if (fileSize &amp;lt; 1024) {&lt;br /&gt;
          if (DISPLAY_ENABLED)&lt;br /&gt;
            display.print(String(fileSize) + &amp;quot;Bytes&amp;quot;);&lt;br /&gt;
        } else if (fileSize &amp;lt; 100000) {&lt;br /&gt;
          if (DISPLAY_ENABLED)&lt;br /&gt;
            display.print(String(round(file.size() / 1024)) + &amp;quot;KB&amp;quot;);&lt;br /&gt;
        } else {&lt;br /&gt;
          if (DISPLAY_ENABLED)&lt;br /&gt;
            display.print(String(round(file.size() / 1024 / 10.24) / 100.0) + &amp;quot;MB&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        if (DISPLAY_ENABLED)&lt;br /&gt;
          display.println(&amp;quot;\r\n&amp;quot; + String(file.name()));&lt;br /&gt;
        fileCount++;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
      index++;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  String fileContent = &amp;quot;&amp;quot;;&lt;br /&gt;
  while (file.available() &amp;amp;&amp;amp; fileContent.length() &amp;lt; 36) {&lt;br /&gt;
    fileContent += char(file.read());&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  while (fileContent.length() &amp;lt; 64)&lt;br /&gt;
    fileContent += &amp;quot; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  if (DISPLAY_ENABLED)&lt;br /&gt;
    display.println(fileContent);&lt;br /&gt;
&lt;br /&gt;
  display.display();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=Mushroom_cultivation&amp;diff=52626</id>
		<title>Mushroom cultivation</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=Mushroom_cultivation&amp;diff=52626"/>
		<updated>2016-07-05T16:53:45Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: #ff0 automation project info&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Mushroom cultivation=&lt;br /&gt;
&lt;br /&gt;
Welcome to the Tastebridge mushroom cultivation wiki. This page is meant as a combined documentation of the Noisebridge mushroom project, and a simple beginner&#039;s guide to doing the same at home. The page is sorted by species (so far only one) and sub-divided by substrate for those species that have been / are growing on more than one different substrate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Oyster mushrooms==&lt;br /&gt;
&lt;br /&gt;
TODO: A little information about these muchrooms...&lt;br /&gt;
&lt;br /&gt;
===Sawdust substrate===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ingredients&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* sawdust, 50/50 oak/alder&lt;br /&gt;
* gypsum&lt;br /&gt;
* water added to 65% wet weight&lt;br /&gt;
* hydrogen peroxide 3%&lt;br /&gt;
* Spawn Mate SEII&lt;br /&gt;
* mushroom spawn&lt;br /&gt;
* spawn bags&lt;br /&gt;
&lt;br /&gt;
The initial moisture content of the substrate should be measured before start; this can be done by weighing out a small sample of sawdust, drying it in a microwave oven, weighing it again and calculating % moisture like so:&lt;br /&gt;
&lt;br /&gt;
  Wtotal - Wdry = Wwater&lt;br /&gt;
  (100 / Wtotal) * Wwater = % moisture&lt;br /&gt;
&lt;br /&gt;
The final moisture content should be around 60% of the total weight, so adding about 65% water will result in appropriate levels after evaporation and addition of gypsum and Spawn Mate. The water should be boiling when it is poured on the sawdust, mixed in as quickly and thoroughly as possible, and the mix then left to cool.&lt;br /&gt;
&lt;br /&gt;
Once the wet sawdust has cooled to &amp;lt;50°C / 120°F, add 3 % by wet weight of a 3% hydrogen peroxide solution, after first, making sure that the hydrogen peroxide does not react with enzymes (peroxisomes) in the saw dust, as this will spoil the disinfective properties. This can be done by mixing a bit of the sawdust with hydrogen peroxide. If there is no fizzing, simply add gypsum and boiling water. If it fizzes, the sawdust will need to be boiled for about 30 minutes to cease enzymatic activity before the peroxide can be added. Also, do not be tempted to add the peroxide to the water before boiling, as the decomposition rate of H2O2 increases massively with temperature.&lt;br /&gt;
&lt;br /&gt;
Once peroxide has been mixed well into the sawdust/gypsum, the substrate needs to be further cooled to room temperature, then supplemented with 7-32% per dry weight Spawn Mate SEII:&lt;br /&gt;
&lt;br /&gt;
 (Wdry / 100) * target% = Wsmii&lt;br /&gt;
&lt;br /&gt;
The last step is the inoculation; a relatively high spawning rate is recommended with the peroxide treatment, as mycelial growth will be slowed down somewhat by the peroxide, and by the microbial competition that  the substrate has not been sterilized of commercial spawn grown on millet (from Amycel, Inc.), then transferred in 12-13 lbs. portions to XL spawn bags. The mixing can be done in the spawn bags or in a large plastic tote, and the final mix is then put in the spawn bags, which are sealed, preferably with an impact sealer.&lt;br /&gt;
&lt;br /&gt;
Original estimates of colonization rates were about 4 weeks, but these turned out to be overly pessimistic. Our blocks were inoculated on two separate occasions, 21 and 27 July 2011, and the first blocks were fully colonized by July 29th and fruiting heavily by 8 Aug (see photo). Once the blocks are completely colonized (see picture), the fruiting can be initiated either by taking them out of the bags, or by making a bunch of X-slits in the bags spaced about 2&amp;quot; / 10 cm apart and placed in a climate-controlled fruiting chamber. The chamber can be constructed by covering a wire shelf rack with thick plastic, adding a small fan and a humidifier (preferably on a timer so it only runs during day time) - temperatures should be within 15-25°C / 60-75°F, and relative air humidity optimally between 90% and 93%.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Coffee ground substrate===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ingredients&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* coffee grounds from a coffee shop&lt;br /&gt;
* coarse vermiculite (optional)&lt;br /&gt;
* Spawn Mate SEII (optional)&lt;br /&gt;
* mushroom spawn&lt;br /&gt;
* spawn bags&lt;br /&gt;
&lt;br /&gt;
In an attempt to bring mushroom cultivation costs down as low as possible, we wanted to try out coffee grounds as a fruiting substrate for oyster mushrooms, as grounds are (generally) free and plentiful, and easy to come by in urban areas with lots of coffee shops. The initial plan was to use the peroxide technique again, but the peroxide reacted fairly strongly with the coffee, so instead, we tried three different options: 1) pressure cooking + Spawn Mate supplementation, 2) no cooking + Spawn Mate supplementation, and 3) no cooking + no supplementation.&lt;br /&gt;
&lt;br /&gt;
Start out by measuring the moisture content of the coffee grounds as described for the sawdust above. Then add water, and optionally vermiculite for a looser texture.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Container ==&lt;br /&gt;
&lt;br /&gt;
TODO: Specs&lt;br /&gt;
&lt;br /&gt;
This works with a box about yay big, so high, made of stuff, and filled with things...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Process ==&lt;br /&gt;
&lt;br /&gt;
# this step&lt;br /&gt;
# that step&lt;br /&gt;
# and then&lt;br /&gt;
# and so on...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Automation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Let teh robots do it!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Monitoring ===&lt;br /&gt;
&lt;br /&gt;
The two critical factors for monitoring are temperature and humidity. There is a readily available combined sensor for this, in the form of a DHT11 for less than a few dollars. However, the near 100% humidity environment is outside the operational range of this sensor. This sensor would be suitable for monitoring of the ambient surrounding indoor environment. There is a newer version of the sensor, a DHT12, this is smaller and the same price, with a functional range of 95% humidity. Alternatively a DHT22 has a full range of up to 100%, and better overall accuracy and sensitivity. These sensors are a little more than a few dollars and are also available as AM2302 which has short wire lead extensions. All of these sensors are 3-5 volt compatible and use a pair or wires for power, and a single data pin for I2C communication. A pull-up resistor of &amp;gt;5K Ohm may be needed, not that an internal pullup on a micro-controller is generally sufficient.&lt;br /&gt;
&lt;br /&gt;
=== Temperature Control ===&lt;br /&gt;
&lt;br /&gt;
Simply locating within a home that maintains a generally consistent room temperature can be sufficient. In other cases a heating and/or cooling element may be needed. A simple solution could be the use of a heating pad.&lt;br /&gt;
&lt;br /&gt;
In this particular case the use of a peltier device will be considered. These devices have the ability to &amp;quot;pump&amp;quot; heat into or out of a relatively small contained area and are often used in portable temperature controlled coolers. They are available in a range of sizes for a reasonable price and are also fairly energy efficient. They are available at different voltages, often around 12 volts, and can range from a few 100mA to several amps.&lt;br /&gt;
&lt;br /&gt;
For controlling the temperature a pair of relays can be used, switching on a current flow to either increase or decrease the temperature. A cooling fan and large heat sink should also be implemented to increase efficiency and  thus turned on with a relay when the system is running. A thermister should additionally be attached in contact with the peltier to monitor/limit maximum operating temperatures.&lt;br /&gt;
&lt;br /&gt;
=== Humidity Control ===&lt;br /&gt;
&lt;br /&gt;
The humidity can be increased as needed with a &amp;quot;cool mist&amp;quot; or ultrasonic style humidifier. These humidifiers are readily available for $10-30. They can be controlled with a relay and run for many hours with a built in reservoir. An additional sensor could be considered to monitor the water level, however in practice this wouldn&#039;t be necessary to check other than every few days.&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=G1226&amp;diff=52056</id>
		<title>G1226</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=G1226&amp;diff=52056"/>
		<updated>2016-05-10T23:51:55Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: HIGH &amp;quot;-&amp;quot; VOLTAGE! w/bias #660&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Seiko LCD Module 128 x 64&lt;br /&gt;
&lt;br /&gt;
Monochrome graphics display with backlight and built-in RAM.&lt;br /&gt;
&lt;br /&gt;
Size: 93.0 x 70.0 x 11.4 mm&lt;br /&gt;
Viewing Area: 70.7 x 38.8 mm&lt;br /&gt;
Dot size: 0.44 x 0.44 mm&lt;br /&gt;
Dot pitch: 0.48 x 0.48 mm&lt;br /&gt;
&lt;br /&gt;
Voltage: 5.0v DC&lt;br /&gt;
Current: &amp;lt;5 mA&lt;br /&gt;
&lt;br /&gt;
LED Backlight voltage: 4.1 DC&lt;br /&gt;
LED Backlight current: &amp;lt;125 mA&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;** NEGATIVE LCD VOLTAGE **&#039;&#039;&#039;&lt;br /&gt;
LCD Bias -8v DC (+/-1v&#039;ish)&lt;br /&gt;
&lt;br /&gt;
This module is fairly straightforward, and works fantastically with the openGLCD library. There&#039;s a set of chips on the back that handle the LCD control, one for the common driver and two for the segments which each handle half of the screen.&lt;br /&gt;
&lt;br /&gt;
The major gotcha for getting this going is that it requires a fairly high negative voltage to drive the LCD bias. This breaks down to about -8v, the spec says -8.3v, I&#039;ve found -7.0v is extremely light and up to 9.0v is required for really dark contrast. So you really need at least a -9v supply voltage and a potentiometer for adjusting the contrast, which will vary with temperature. This only seems to draw 1mA at 8.3v, so it doesn&#039;t need to be vary hefty. There is an IC for this job, a MAX736, however that costs more than the display, and would be useful if you were trying to run more than a dozen of these displays at once. The simplest way I&#039;ve found to get this to work is to take a second 9v+ power source, connecting the positive to the ground along with one side of a potentiometer, then connect the other side of the potentiometer to the negative of the 9v power supply giving you a -9v referenced to ground. Then connect teh tap of the potentiometer to the Vlc pin and use the potentiometer to adjust the ideal contrast.&lt;br /&gt;
&lt;br /&gt;
Alternatively I&#039;ve found that you can build a charge pump with a couple of diodes and a PWM signal (http://www.hantronix.com/files/down/neg-invr.pdf) and you can use a PWM&#039;d IO pin to generate this signal and thus negative voltage. While this works, driving it off of a 5v IO pin results in less than -4v, which won&#039;t get so much of a ghost to appear on the display. So using a 555 timer chip I was able to construct an oscillator to generate the PWM and power the chip with a +12v power supply and then run that thru a charge pump created with 2 diodes, two caps, and a potentiometer creating an adjustable negative voltage of nearly -10v! Hook that to the Vlc and you are good to go. If your project already has a 12v supply this makes for a pretty minimal fix. However, if you only have the 5v supply to start with a boost converter would be really nice, not sure if this can be hacked with some discrete components to generate the 1mA easily.&lt;br /&gt;
&lt;br /&gt;
Library for getting it working with Arduino:&lt;br /&gt;
*https://bitbucket.org/bperrybap/openglcd/wiki/Home&lt;br /&gt;
*http://playground.arduino.cc/Code/GLCDks0108 (Legacy for wiring/tips)&lt;br /&gt;
&lt;br /&gt;
Available at Anchor Electronics for $5.95:&lt;br /&gt;
http://anchor-electronics.com/product/128-x-64-lcd-module/&lt;br /&gt;
&lt;br /&gt;
Part No:&lt;br /&gt;
G1226B1J000S&lt;br /&gt;
&lt;br /&gt;
Data Sheet:&lt;br /&gt;
http://pdf.datasheetcatalog.com/datasheets2/95/951116_1.pdf&lt;br /&gt;
&lt;br /&gt;
On the back of the module are two 64 channel LCD segment drivers (KS0108B) and a 64 common driver (KS0107).&lt;br /&gt;
&lt;br /&gt;
Data Sheet:&lt;br /&gt;
*https://www.sparkfun.com/datasheets/LCD/ks0108b.pdf&lt;br /&gt;
*http://www.waveshare.com/datasheet/LCD_en_PDF/KS0107.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pinout:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1. Vcc (+5v)&lt;br /&gt;
2. Ground&lt;br /&gt;
3. Vlc (~-8v, LCD negative bias)&lt;br /&gt;
4. D0 (data bus)&lt;br /&gt;
5. D1    &amp;quot; &amp;quot;&lt;br /&gt;
6. D2    &amp;quot; &amp;quot;&lt;br /&gt;
7. D3    &amp;quot; &amp;quot;&lt;br /&gt;
8. D4    &amp;quot; &amp;quot;&lt;br /&gt;
9. D5    &amp;quot; &amp;quot;&lt;br /&gt;
10. D6   &amp;quot; &amp;quot;&lt;br /&gt;
11. D7   &amp;quot; &amp;quot;&lt;br /&gt;
12. CS1 (chip select)&lt;br /&gt;
13. CS2     &amp;quot; &amp;quot;&lt;br /&gt;
14. Reset&lt;br /&gt;
15. R/W&lt;br /&gt;
16. RS&lt;br /&gt;
17. E&lt;br /&gt;
18. Chassis ground&lt;br /&gt;
19. LED + Backlight (Internally? limited to 75mA @5v)&lt;br /&gt;
20. LED - Backlight&lt;br /&gt;
&lt;br /&gt;
XX. Vop + (Not connected)&lt;br /&gt;
XX. Vop -      &amp;quot; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
* All pinouts verified by continuity check with KS0108B and LED Backlight terminals&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=555&amp;diff=52055</id>
		<title>555</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=555&amp;diff=52055"/>
		<updated>2016-05-10T21:31:13Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Teh world famous&#039;ist/old&#039;ish/ubiquitous IC&lt;br /&gt;
&amp;lt;pre&amp;gt;                                                   &lt;br /&gt;
    555555555555555555 555555555555555555 555555555555555555 &lt;br /&gt;
    5::::::::::::::::5 5::::::::::::::::5 5::::::::::::::::5 &lt;br /&gt;
    5::::::::::::::::5 5::::::::::::::::5 5::::::::::::::::5 &lt;br /&gt;
    5:::::555555555555 5:::::555555555555 5:::::555555555555 &lt;br /&gt;
    5:::::5            5:::::5            5:::::5            &lt;br /&gt;
    5:::::5            5:::::5            5:::::5            &lt;br /&gt;
    5:::::5555555555   5:::::5555555555   5:::::5555555555   &lt;br /&gt;
    5:::::::::::::::5  5:::::::::::::::5  5:::::::::::::::5  &lt;br /&gt;
    555555555555:::::5 555555555555:::::5 555555555555:::::5 &lt;br /&gt;
                5:::::5            5:::::5            5:::::5&lt;br /&gt;
                5:::::5            5:::::5            5:::::5&lt;br /&gt;
    5555555     5:::::55555555     5:::::55555555     5:::::5&lt;br /&gt;
    5::::::55555::::::55::::::55555::::::55::::::5#660::::::5&lt;br /&gt;
     55:::::::::::::55  55:::::::::::::55  55:::::::::::::55 &lt;br /&gt;
       55:::::::::55      55:::::::::55      55:::::::::55   &lt;br /&gt;
         555555555          555555555          555555555     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Operating Voltage 3-15v (typical)&lt;br /&gt;
*Operating frequency &amp;gt;500Khz&lt;br /&gt;
*Astable and monostable modes&lt;br /&gt;
*Adjustable duty cycle&lt;br /&gt;
*Output source or sink up to 200mA&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
           ---U---&lt;br /&gt;
   GND (1)-|     |-(8) Vcc&lt;br /&gt;
  TRIG (2)-| 555 |-(7) DIS&lt;br /&gt;
   OUT (3)-|     |-(6) THR&lt;br /&gt;
 RESET (4)-|     |-(5) CTRL&lt;br /&gt;
           -------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datasheet: http://www2.st.com/resource/en/datasheet/ne555.pdf&lt;br /&gt;
&lt;br /&gt;
More: https://en.wikipedia.org/wiki/555_timer_IC&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=555&amp;diff=52054</id>
		<title>555</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=555&amp;diff=52054"/>
		<updated>2016-05-10T21:29:30Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: d33ts&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Teh world famous&#039;ist/old&#039;ish/ubiquitous IC&lt;br /&gt;
&amp;lt;pre&amp;gt;                                                   &lt;br /&gt;
    555555555555555555 555555555555555555 555555555555555555 &lt;br /&gt;
    5::::::::::::::::5 5::::::::::::::::5 5::::::::::::::::5 &lt;br /&gt;
    5::::::::::::::::5 5::::::::::::::::5 5::::::::::::::::5 &lt;br /&gt;
    5:::::555555555555 5:::::555555555555 5:::::555555555555 &lt;br /&gt;
    5:::::5            5:::::5            5:::::5            &lt;br /&gt;
    5:::::5            5:::::5            5:::::5            &lt;br /&gt;
    5:::::5555555555   5:::::5555555555   5:::::5555555555   &lt;br /&gt;
    5:::::::::::::::5  5:::::::::::::::5  5:::::::::::::::5  &lt;br /&gt;
    555555555555:::::5 555555555555:::::5 555555555555:::::5 &lt;br /&gt;
                5:::::5            5:::::5            5:::::5&lt;br /&gt;
                5:::::5            5:::::5            5:::::5&lt;br /&gt;
    5555555     5:::::55555555     5:::::55555555     5:::::5&lt;br /&gt;
    5::::::55555::::::55::::::55555::::::55::::::5#660::::::5&lt;br /&gt;
     55:::::::::::::55  55:::::::::::::55  55:::::::::::::55 &lt;br /&gt;
       55:::::::::55      55:::::::::55      55:::::::::55   &lt;br /&gt;
         555555555          555555555          555555555     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Operating Voltage 3-15v (typical)&lt;br /&gt;
*Operating frequency &amp;gt;500Khz&lt;br /&gt;
*Astable and monostable modes&lt;br /&gt;
*Adjustable duty cycle&lt;br /&gt;
*Output source or sink up to 200mA&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
       ---U---&lt;br /&gt;
   GND-|     |-Vcc&lt;br /&gt;
  TRIG-| 555 |-DIS&lt;br /&gt;
   OUT-|     |-THR&lt;br /&gt;
 RESET-|     |-CTRL&lt;br /&gt;
       -------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datasheet: http://www2.st.com/resource/en/datasheet/ne555.pdf&lt;br /&gt;
&lt;br /&gt;
More: https://en.wikipedia.org/wiki/555_timer_IC&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=555&amp;diff=52053</id>
		<title>555</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=555&amp;diff=52053"/>
		<updated>2016-05-10T21:23:39Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: OSCILLATIONz! #660&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Teh world famous&#039;ist/old&#039;ish/ubiquitous IC&lt;br /&gt;
&amp;lt;pre&amp;gt;                                                   &lt;br /&gt;
    555555555555555555 555555555555555555 555555555555555555 &lt;br /&gt;
    5::::::::::::::::5 5::::::::::::::::5 5::::::::::::::::5 &lt;br /&gt;
    5::::::::::::::::5 5::::::::::::::::5 5::::::::::::::::5 &lt;br /&gt;
    5:::::555555555555 5:::::555555555555 5:::::555555555555 &lt;br /&gt;
    5:::::5            5:::::5            5:::::5            &lt;br /&gt;
    5:::::5            5:::::5            5:::::5            &lt;br /&gt;
    5:::::5555555555   5:::::5555555555   5:::::5555555555   &lt;br /&gt;
    5:::::::::::::::5  5:::::::::::::::5  5:::::::::::::::5  &lt;br /&gt;
    555555555555:::::5 555555555555:::::5 555555555555:::::5 &lt;br /&gt;
                5:::::5            5:::::5            5:::::5&lt;br /&gt;
                5:::::5            5:::::5            5:::::5&lt;br /&gt;
    5555555     5:::::55555555     5:::::55555555     5:::::5&lt;br /&gt;
    5::::::55555::::::55::::::55555::::::55::::::5#660::::::5&lt;br /&gt;
     55:::::::::::::55  55:::::::::::::55  55:::::::::::::55 &lt;br /&gt;
       55:::::::::55      55:::::::::55      55:::::::::55   &lt;br /&gt;
         555555555          555555555          555555555     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datasheet: http://www2.st.com/resource/en/datasheet/ne555.pdf&lt;br /&gt;
&lt;br /&gt;
More: https://en.wikipedia.org/wiki/555_timer_IC&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=KST1602B-B&amp;diff=52052</id>
		<title>KST1602B-B</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=KST1602B-B&amp;diff=52052"/>
		<updated>2016-05-10T19:30:04Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: LCD with character(s) #660&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;KEST KST1602B-B&lt;br /&gt;
&lt;br /&gt;
Monochrome 16x2 character display with blue backlight and built-in controller.&lt;br /&gt;
&lt;br /&gt;
This is a 5v device, that is compatible with data signals driven directly by a 3.3v microcontroller without level shifters.&lt;br /&gt;
&lt;br /&gt;
Voltage: 5.0 DC&lt;br /&gt;
Current: 1.5 mA&lt;br /&gt;
&lt;br /&gt;
LED Backlight voltage: 5.0 DC&lt;br /&gt;
LED Backlight current: 30 mA&lt;br /&gt;
&lt;br /&gt;
Available at Anchor Electronics for $3.95:&lt;br /&gt;
http://anchor-electronics.com/product/16-x-2-lcd/&lt;br /&gt;
&lt;br /&gt;
Part No:&lt;br /&gt;
KST1602B-B&lt;br /&gt;
&lt;br /&gt;
Data Sheet:&lt;br /&gt;
http://kestmfg.com/datasheets/KST1602B-B.pdf&lt;br /&gt;
&lt;br /&gt;
* Note that the pinout on the datasheet may not be correct, refer to silk screen on back of board.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The built-in controller is a SPLC780D1 or equivelant.&lt;br /&gt;
&lt;br /&gt;
Data Sheet: http://www.winstar.com.tw/UserFiles/downloads/13511323500823064564.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pinout:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1. Ground&lt;br /&gt;
2. Vdd (+5v)&lt;br /&gt;
3. V0 (LCD contrast adjust)&lt;br /&gt;
4. RS&lt;br /&gt;
5. R/W&lt;br /&gt;
6. E&lt;br /&gt;
7. D0 (data bus)&lt;br /&gt;
8. D1    &amp;quot; &amp;quot;&lt;br /&gt;
9. D2    &amp;quot; &amp;quot;&lt;br /&gt;
10. D3    &amp;quot; &amp;quot;&lt;br /&gt;
11. D4    &amp;quot; &amp;quot;&lt;br /&gt;
12. D5    &amp;quot; &amp;quot;&lt;br /&gt;
13. D6   &amp;quot; &amp;quot;&lt;br /&gt;
14. D7   &amp;quot; &amp;quot;&lt;br /&gt;
15. LED + Backlight (+5v)&lt;br /&gt;
16. LED - Backlight&lt;br /&gt;
&lt;br /&gt;
* All pinouts verified by functionality, may vary from board to board&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=G1226&amp;diff=52051</id>
		<title>G1226</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=G1226&amp;diff=52051"/>
		<updated>2016-05-10T19:17:23Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: more on pins #660&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Seiko LCD Module 128 x 64&lt;br /&gt;
&lt;br /&gt;
Monochrome graphics display with backlight and built-in RAM.&lt;br /&gt;
&lt;br /&gt;
Size: 93.0 x 70.0 x 11.4 mm&lt;br /&gt;
Viewing Area: 70.7 x 38.8 mm&lt;br /&gt;
Dot size: 0.44 x 0.44 mm&lt;br /&gt;
Dot pitch: 0.48 x 0.48 mm&lt;br /&gt;
&lt;br /&gt;
Voltage: 5.0 DC&lt;br /&gt;
Current: 5 mA&lt;br /&gt;
&lt;br /&gt;
LED Backlight voltage: 4.1 DC&lt;br /&gt;
LED Backlight current: 125 mA&lt;br /&gt;
&lt;br /&gt;
Available at Anchor Electronics for $5.95:&lt;br /&gt;
http://anchor-electronics.com/product/128-x-64-lcd-module/&lt;br /&gt;
&lt;br /&gt;
Part No:&lt;br /&gt;
G1226B1J000S&lt;br /&gt;
&lt;br /&gt;
Data Sheet:&lt;br /&gt;
http://pdf.datasheetcatalog.com/datasheets2/95/951116_1.pdf&lt;br /&gt;
&lt;br /&gt;
On the back of the module are two 64 channel LCD segment drivers (KS0108B) and a 64 common driver (KS0107).&lt;br /&gt;
&lt;br /&gt;
Data Sheet:&lt;br /&gt;
*https://www.sparkfun.com/datasheets/LCD/ks0108b.pdf&lt;br /&gt;
*http://www.waveshare.com/datasheet/LCD_en_PDF/KS0107.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pinout:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1. Vcc (+5v)&lt;br /&gt;
2. Ground&lt;br /&gt;
3. Vlc (LCD negative bias)&lt;br /&gt;
4. D0 (data bus)&lt;br /&gt;
5. D1    &amp;quot; &amp;quot;&lt;br /&gt;
6. D2    &amp;quot; &amp;quot;&lt;br /&gt;
7. D3    &amp;quot; &amp;quot;&lt;br /&gt;
8. D4    &amp;quot; &amp;quot;&lt;br /&gt;
9. D5    &amp;quot; &amp;quot;&lt;br /&gt;
10. D6   &amp;quot; &amp;quot;&lt;br /&gt;
11. D7   &amp;quot; &amp;quot;&lt;br /&gt;
12. CS1 (Chip select left)&lt;br /&gt;
13. CS2 (Chip select right)&lt;br /&gt;
14. Reset&lt;br /&gt;
15. R/W&lt;br /&gt;
16. RS&lt;br /&gt;
17. E&lt;br /&gt;
18. Chassis ground&lt;br /&gt;
19. LED + Backlight (Internally? limited to 75mA @5v)&lt;br /&gt;
20. LED - Backlight&lt;br /&gt;
&lt;br /&gt;
* All pinouts verified by continuity check with KS0108B and LED Backlight terminals&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=G1226&amp;diff=52050</id>
		<title>G1226</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=G1226&amp;diff=52050"/>
		<updated>2016-05-10T18:34:16Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: pinouts as tested #660&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Seiko LCD Module 128 x 64&lt;br /&gt;
&lt;br /&gt;
Monochrome graphics display with backlight and built-in RAM.&lt;br /&gt;
&lt;br /&gt;
Size: 93.0 x 70.0 x 11.4 mm&lt;br /&gt;
Viewing Area: 70.7 x 38.8 mm&lt;br /&gt;
Dot size: 0.44 x 0.44 mm&lt;br /&gt;
Dot pitch: 0.48 x 0.48 mm&lt;br /&gt;
&lt;br /&gt;
Voltage: 5.0 DC&lt;br /&gt;
Current: 5 mA&lt;br /&gt;
&lt;br /&gt;
LED Backlight coltage: 4.1 DC&lt;br /&gt;
LED Backlight current: 125 mA&lt;br /&gt;
&lt;br /&gt;
Part No:&lt;br /&gt;
G1226B1J000S&lt;br /&gt;
&lt;br /&gt;
Data Sheet:&lt;br /&gt;
http://pdf.datasheetcatalog.com/datasheets2/95/951116_1.pdf&lt;br /&gt;
&lt;br /&gt;
On the back of the module are two 64 channel LCD segment drivers (KS0108B) and a 64 common driver (KS0107).&lt;br /&gt;
&lt;br /&gt;
Data Sheet:&lt;br /&gt;
https://www.sparkfun.com/datasheets/LCD/ks0108b.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pinout:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1. Vcc (+5v)&lt;br /&gt;
2. Ground&lt;br /&gt;
3. Vlc (LCD negative bias)&lt;br /&gt;
4. D0 (data bus)&lt;br /&gt;
5. D1    &amp;quot; &amp;quot;&lt;br /&gt;
6. D2    &amp;quot; &amp;quot;&lt;br /&gt;
7. D3    &amp;quot; &amp;quot;&lt;br /&gt;
8. D4    &amp;quot; &amp;quot;&lt;br /&gt;
9. D5    &amp;quot; &amp;quot;&lt;br /&gt;
10. D6   &amp;quot; &amp;quot;&lt;br /&gt;
11. D7   &amp;quot; &amp;quot;&lt;br /&gt;
12. CS1 (Chip select left)&lt;br /&gt;
13. CS2 (Chip select right)&lt;br /&gt;
14. Reset&lt;br /&gt;
15. R/W&lt;br /&gt;
16. RS&lt;br /&gt;
17. E&lt;br /&gt;
18. Chassis ground&lt;br /&gt;
19. LED + Backlight (+5v w/10ohm resistor)&lt;br /&gt;
20. LED - Backlight&lt;br /&gt;
&lt;br /&gt;
* All pinouts verified by continuity check with KS0108B and LED Backlight terminals&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=G1226&amp;diff=52049</id>
		<title>G1226</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=G1226&amp;diff=52049"/>
		<updated>2016-05-10T18:02:23Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: Graphics LCD #660&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Seiko LCD Module 128 x 64&lt;br /&gt;
&lt;br /&gt;
Monochrome graphics display with backlight and built-in RAM.&lt;br /&gt;
&lt;br /&gt;
Size: 93.0 x 70.0 x 11.4 mm&lt;br /&gt;
Viewing Area: 70.7 x 38.8 mm&lt;br /&gt;
Dot size: 0.44 x 0.44 mm&lt;br /&gt;
Dot pitch: 0.48 x 0.48 mm&lt;br /&gt;
&lt;br /&gt;
Voltage: 5.0 DC&lt;br /&gt;
Current: 5 mA&lt;br /&gt;
&lt;br /&gt;
LED Backlight coltage: 4.1 DC&lt;br /&gt;
LED Backlight current: 125 mA&lt;br /&gt;
&lt;br /&gt;
Part No:&lt;br /&gt;
G1226B1J000S&lt;br /&gt;
&lt;br /&gt;
Data Sheet:&lt;br /&gt;
http://pdf.datasheetcatalog.com/datasheets2/95/951116_1.pdf&lt;br /&gt;
&lt;br /&gt;
On the back of the module are two 64 channel LCD segment drivers (KS0108B) and a 64 common driver (KS0107).&lt;br /&gt;
&lt;br /&gt;
Data Sheet:&lt;br /&gt;
https://www.sparkfun.com/datasheets/LCD/ks0108b.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pinout:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1. &lt;br /&gt;
2. &lt;br /&gt;
3. &lt;br /&gt;
4. &lt;br /&gt;
5. &lt;br /&gt;
6. &lt;br /&gt;
7. &lt;br /&gt;
8. &lt;br /&gt;
9. &lt;br /&gt;
10. &lt;br /&gt;
11. &lt;br /&gt;
12. &lt;br /&gt;
13. &lt;br /&gt;
14. &lt;br /&gt;
15. &lt;br /&gt;
16. &lt;br /&gt;
17. &lt;br /&gt;
18. &lt;br /&gt;
19. &lt;br /&gt;
20. &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=Shopping&amp;diff=51893</id>
		<title>Shopping</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=Shopping&amp;diff=51893"/>
		<updated>2016-05-01T18:04:36Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: Get teh goodies #888&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Where to get teh good stuff...&lt;br /&gt;
&lt;br /&gt;
Work in progress selection of electronics suppliers, new, used, surplus, etc.&lt;br /&gt;
&lt;br /&gt;
== Bay Area ==&lt;br /&gt;
=== Anchor Electronics ===&lt;br /&gt;
http://anchor-electronics.com&lt;br /&gt;
&lt;br /&gt;
=== Fry&#039;s ===&lt;br /&gt;
http://frys.com&lt;br /&gt;
&lt;br /&gt;
=== RadioShack ===&lt;br /&gt;
http://radioshack.com&lt;br /&gt;
&lt;br /&gt;
=== Jameco ===&lt;br /&gt;
http://jameco.com&lt;br /&gt;
&lt;br /&gt;
=== HSC ===&lt;br /&gt;
http://halted.com&lt;br /&gt;
&lt;br /&gt;
=== Advanced Component Electronics ===&lt;br /&gt;
http://acecomponents.com&lt;br /&gt;
&lt;br /&gt;
=== Weird Stuff ===&lt;br /&gt;
http://weirdstuff.com&lt;br /&gt;
&lt;br /&gt;
=== Alltronics ===&lt;br /&gt;
http://alltronics.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
=== Adafruit ===&lt;br /&gt;
http://adafruit.com&lt;br /&gt;
&lt;br /&gt;
=== Mouser ===&lt;br /&gt;
http://mouser.com&lt;br /&gt;
&lt;br /&gt;
=== Digikey ===&lt;br /&gt;
http://digikey.com&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=ESP8266&amp;diff=51671</id>
		<title>ESP8266</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=ESP8266&amp;diff=51671"/>
		<updated>2016-04-08T19:24:26Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:CyanBread bb.png|800px]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄ &lt;br /&gt;
▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌&lt;br /&gt;
▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀█░▌ ▀▀▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀▀▀ &lt;br /&gt;
▐░▌          ▐░▌          ▐░▌       ▐░▌▐░▌       ▐░▌          ▐░▌▐░▌          ▐░▌          &lt;br /&gt;
▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄█░▌          ▐░▌▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄▄▄ &lt;br /&gt;
▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌ ▐░░░░░░░░░▌  ▄▄▄▄▄▄▄▄▄█░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌&lt;br /&gt;
▐░█▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀█░▌▐░░░░░░░░░░░▌▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀█░▌&lt;br /&gt;
▐░▌                    ▐░▌▐░▌          ▐░▌       ▐░▌▐░█▀▀▀▀▀▀▀▀▀ ▐░▌       ▐░▌▐░▌       ▐░▌&lt;br /&gt;
▐░█▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄█░▌▐░▌          ▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄█░▌&lt;br /&gt;
▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░▌          ▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌&lt;br /&gt;
 ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀            ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀                                                                                           &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* [[ESP8266/OTA]]&lt;br /&gt;
* [[ESP8266/Blink]]&lt;br /&gt;
* [[ESP8266/WS2812]]&lt;br /&gt;
* [[ESP8266/PIR]]&lt;br /&gt;
* [[ESP8266/Temp]]&lt;br /&gt;
* [[ESP8266/Matrix]]&lt;br /&gt;
&lt;br /&gt;
* https://nurdspace.nl/ESP8266&lt;br /&gt;
* https://github.com/espressif/ESP8266_AT/wiki&lt;br /&gt;
* http://www.esp8266.com/wiki/doku.php?id=esp8266-module-family&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ESP8266 is a small, low-cost wifi-talking board. It&#039;s the new center of the Internet of Things. Originally intended as a &amp;quot;wifi modem&amp;quot;, it exposes the WiFi interface over AT-style commands.&lt;br /&gt;
&lt;br /&gt;
Some hackers immediately noticed there is a general-purpose microcontroller on the box, and made a firmware for it that takes Lua programs. Now you don&#039;t need another microcontroller. Sweet!&lt;br /&gt;
&lt;br /&gt;
Several additional community efforts have also been initiated and are generally discussed at http://esp8266.com one of the newer developmentss is the addition of integrated support in the Arduino IDE, further details follow in the &#039;&#039;Software&#039;&#039; section below.&lt;br /&gt;
&lt;br /&gt;
== Boot Modes ==&lt;br /&gt;
&lt;br /&gt;
To load new firmware, connect GPIO0 to ground, and momentarily connect RESET to ground, or cycle the power. You can then disconnect GPIO0 and program the chip over Serial with 115,200 baud. Then reset or power cycle after the firmware upload completes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reset causes:&lt;br /&gt;
        0: &lt;br /&gt;
        1: normal boot&lt;br /&gt;
        2: reset pin&lt;br /&gt;
        3: software reset&lt;br /&gt;
        4: watchdog reset&lt;br /&gt;
&lt;br /&gt;
    boot device:&lt;br /&gt;
        0:&lt;br /&gt;
        1: ram&lt;br /&gt;
        3: flash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  -15cm-&lt;br /&gt;
		  ESP-01 Module Pinout and Wiring:&lt;br /&gt;
+---------+&lt;br /&gt;
| |-| |---|	    Vcc to 3.3v power&lt;br /&gt;
| | |-|   |	    EN/CH_PD &amp;amp; Rst each to Vcc w/10k Resistor&lt;br /&gt;
| |---- ..|  |	    GPIO0 to Ground &amp;amp; Reset for firmware update&lt;br /&gt;
|         | 25cm    RxD to Serial TxD &amp;amp; TxD to Serial RxD&lt;br /&gt;
| G I I R |  |	      74,480 bps for bootloader output&lt;br /&gt;
| n O O x |           115,200 bps for upload and debug&lt;br /&gt;
| d 2 0 D |&lt;br /&gt;
| * * * * |&lt;br /&gt;
| * * * * |&lt;br /&gt;
+---------+&lt;br /&gt;
  T E R V&lt;br /&gt;
  x N s c&lt;br /&gt;
  D   t c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For full specs, see [https://nurdspace.nl/ESP8266]. Important facts:&lt;br /&gt;
* 3.3v *only* - 5v will let out the majikul smoke&lt;br /&gt;
* Power draw &amp;lt; 250 mA&lt;br /&gt;
* Talks 802.1n, supports most major auth types.&lt;br /&gt;
&lt;br /&gt;
There are a number of ESP8266 hardware versions. The ones of interest are:&lt;br /&gt;
&lt;br /&gt;
* ESP-01: 8 pins (basically one I/O plus power, etc.). Breadboard friendly 2x4 header (2.54mm), but not useful standalone&lt;br /&gt;
* ESP-12: 16 pins (I/O, power, 9 GPIO). Non-breadboard friendly: 2mm pin spacing&lt;br /&gt;
* ESP-12e: 22 pins, same as ESP-12, with an additional 6 pins on the back edge adding 1 I/O and SPI connections&lt;br /&gt;
&lt;br /&gt;
=== Sources ===&lt;br /&gt;
&lt;br /&gt;
Most modules are available from this ebay store http://stores.ebay.com/tomyuen007/ for $3 and up, ships from US, generally less than a week for delivery.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== espressif SDK ===&lt;br /&gt;
&lt;br /&gt;
https://github.com/espressif/ESP8266_RTOS_SDK&lt;br /&gt;
&lt;br /&gt;
Toolchain setup on VM: http://www.esp8266.com/wiki/doku.php?id=toolchain&lt;br /&gt;
&lt;br /&gt;
Loading Firmware: http://www.esp8266.com/wiki/doku.php?id=loading_firmware&lt;br /&gt;
&lt;br /&gt;
=== Arduino IDE ===&lt;br /&gt;
&lt;br /&gt;
Enhancements to the Arduino IDE in versions 1.6.4 and later have enabled support for the esp8266 and the ability to upload new firmware. Version 1.6.5 r5 or later is recommended.&lt;br /&gt;
&lt;br /&gt;
The current version of the IDE can be downloaded from https://www.arduino.cc/en/Main/Software&lt;br /&gt;
&lt;br /&gt;
Two additional steps are required to add esp8266 support to the Arduino IDE&lt;br /&gt;
# Open the preferences menu in the Arduino IDE and add &amp;lt;code&amp;gt;http://arduino.esp8266.com/stable/package_esp8266com_index.json&amp;lt;/code&amp;gt; into &amp;quot;Additional Board Manager URLs&amp;quot; field&lt;br /&gt;
# Open Boards Manager from &amp;quot;Tools &amp;gt; Board: ______ &amp;gt; Boards Manager...&amp;quot; menu, scroll down to esp8266, click to select it and then click the install button.&lt;br /&gt;
&lt;br /&gt;
Details about esp8266 support can be found at https://github.com/esp8266/Arduino&lt;br /&gt;
&lt;br /&gt;
Once it downloads you&#039;ll see &amp;quot;ESP8266 Modules&amp;quot; section added to the list of target boards under &amp;quot;Tools &amp;gt; Board: ______&amp;gt;&amp;quot;. You can use the &amp;quot;Generic ESP8266 Module&amp;quot; option for programming ESP-## modules using a 3.3v USB-Serial connector.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll need a USB to Serial cable/dongle for programming the board, connecting Ground/Rx/Tx. If you&#039;re using the cheap USB dongles, like the AI branded ones using a CH340G chip, you may also need to install the drivers.&lt;br /&gt;
&lt;br /&gt;
* http://www.wch.cn/download/CH341SER_ZIP.html (Windows)&lt;br /&gt;
* http://www.wch.cn/download/CH341SER_MAC_ZIP.html (Mac)&lt;br /&gt;
* http://www.wch.cn/download/CH341SER_LINUX_ZIP.html (Linux)&lt;br /&gt;
&lt;br /&gt;
In order to enable the ESP8266 to accept new firmware, temporarily connect GPIO0 to ground, and cycle the power.&lt;br /&gt;
&lt;br /&gt;
=== LUA ===&lt;br /&gt;
There are a wide variety of firmware builds available for the chip. Of interest is the software [http://nodemcu.com/index_en.html NodeMCU], which turns the serial port in to a Lua REPL. [[User:Yesac|Yesac]] is working on an [https://github.com/squeed/nodemcu-env environment] within NodeMCU for doing TFTP and some other junk.&lt;br /&gt;
&lt;br /&gt;
Uploading firmware is easy with [https://github.com/themadinventor/esptool esptool]&lt;br /&gt;
&lt;br /&gt;
= Projects =&lt;br /&gt;
&lt;br /&gt;
== IoT X&#039;ample ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Breadboarded multi-function device using ESP-12 module, PIR sensor, buzzer, indicator LEDs and light sensor.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
See additional PIR info [[ESP8266/PIR]]&lt;br /&gt;
&lt;br /&gt;
[[File:BoardRoom_bb.png|800px]]&lt;br /&gt;
&lt;br /&gt;
The following code can be used on the above diagrammed hardware. Using a web browser the ESP8266 will respond the following url requests&lt;br /&gt;
* http://xxx.xxx.xxx.xxx/ (Displays current status, motion and light level)&lt;br /&gt;
* http://xxx.xxx.xxx.xxx/buzz (Triggers the buzzer to make a noise)&lt;br /&gt;
* http://xxx.xxx.xxx.xxx/hello (Returns a simple hello message)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
   AS IS NO GUARANTEE NO WARRANTY&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClient.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266mDNS.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const char *ssid = &amp;quot;YourWiFi&amp;quot;;&lt;br /&gt;
const char *password = &amp;quot;WiFiPassword&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
ESP8266WebServer server ( 80 );&lt;br /&gt;
&lt;br /&gt;
const int pir = 4;&lt;br /&gt;
const int led = 14;&lt;br /&gt;
const int buzzer = 12;&lt;br /&gt;
&lt;br /&gt;
void handleRoot() {&lt;br /&gt;
	&lt;br /&gt;
	char temp[400];&lt;br /&gt;
	int sec = millis() / 1000;&lt;br /&gt;
	int min = sec / 60;&lt;br /&gt;
	int hr = min / 60;&lt;br /&gt;
&lt;br /&gt;
	snprintf ( temp, 400,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;html&amp;gt;\&lt;br /&gt;
  &amp;lt;head&amp;gt;\&lt;br /&gt;
    &amp;lt;title&amp;gt;PIR Demo&amp;lt;/title&amp;gt;\&lt;br /&gt;
    &amp;lt;style&amp;gt;\&lt;br /&gt;
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\&lt;br /&gt;
    &amp;lt;/style&amp;gt;\&lt;br /&gt;
  &amp;lt;/head&amp;gt;\&lt;br /&gt;
  &amp;lt;body&amp;gt;\&lt;br /&gt;
    &amp;lt;h1&amp;gt;Hello from ESP8266 PIR!&amp;lt;/h1&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Uptime: %02d:%02d:%02d&amp;lt;/p&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Motion: %s&amp;lt;/p&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Ambient: %d%&amp;lt;/p&amp;gt;\&lt;br /&gt;
  &amp;lt;/body&amp;gt;\&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		hr, min % 60, sec % 60, digitalRead(pir)?&amp;quot;true&amp;quot;:&amp;quot;false&amp;quot;, round(analogRead(A0)/10.24)&lt;br /&gt;
	);&lt;br /&gt;
	server.send ( 200, &amp;quot;text/html&amp;quot;, temp );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handleBuzz() {&lt;br /&gt;
  	&lt;br /&gt;
	char temp[400];&lt;br /&gt;
	int sec = millis() / 1000;&lt;br /&gt;
	int min = sec / 60;&lt;br /&gt;
	int hr = min / 60;&lt;br /&gt;
&lt;br /&gt;
	snprintf ( temp, 400,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;html&amp;gt;\&lt;br /&gt;
  &amp;lt;head&amp;gt;\&lt;br /&gt;
    &amp;lt;title&amp;gt;BUZZ!!!&amp;lt;/title&amp;gt;\&lt;br /&gt;
    &amp;lt;style&amp;gt;\&lt;br /&gt;
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #ff0000; }\&lt;br /&gt;
    &amp;lt;/style&amp;gt;\&lt;br /&gt;
  &amp;lt;/head&amp;gt;\&lt;br /&gt;
  &amp;lt;body&amp;gt;\&lt;br /&gt;
    &amp;lt;h1&amp;gt;BUZZ!!!&amp;lt;/h1&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Uptime: %02d:%02d:%02d&amp;lt;/p&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Motion: %s&amp;lt;/p&amp;gt;\&lt;br /&gt;
  &amp;lt;/body&amp;gt;\&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		hr, min % 60, sec % 60, digitalRead(pir)?&amp;quot;true&amp;quot;:&amp;quot;false&amp;quot;&lt;br /&gt;
	);&lt;br /&gt;
	server.send ( 200, &amp;quot;text/html&amp;quot;, temp );&lt;br /&gt;
&lt;br /&gt;
        digitalWrite(buzzer, HIGH);&lt;br /&gt;
        delay(300);&lt;br /&gt;
        digitalWrite(buzzer, LOW);&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
void handleNotFound() {&lt;br /&gt;
	String message = &amp;quot;File Not Found\n\n&amp;quot;;&lt;br /&gt;
	message += &amp;quot;URI: &amp;quot;;&lt;br /&gt;
	message += server.uri();&lt;br /&gt;
	message += &amp;quot;\nMethod: &amp;quot;;&lt;br /&gt;
	message += ( server.method() == HTTP_GET ) ? &amp;quot;GET&amp;quot; : &amp;quot;POST&amp;quot;;&lt;br /&gt;
	message += &amp;quot;\nArguments: &amp;quot;;&lt;br /&gt;
	message += server.args();&lt;br /&gt;
	message += &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	for ( uint8_t i = 0; i &amp;lt; server.args(); i++ ) {&lt;br /&gt;
		message += &amp;quot; &amp;quot; + server.argName ( i ) + &amp;quot;: &amp;quot; + server.arg ( i ) + &amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	server.send ( 404, &amp;quot;text/plain&amp;quot;, message );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup ( void ) {&lt;br /&gt;
	pinMode ( led, OUTPUT );&lt;br /&gt;
	digitalWrite ( led, 0 );&lt;br /&gt;
         &lt;br /&gt;
        pinMode(buzzer, OUTPUT);&lt;br /&gt;
        digitalWrite(buzzer, 0);&lt;br /&gt;
        &lt;br /&gt;
        pinMode(pir, INPUT);&lt;br /&gt;
&lt;br /&gt;
	Serial.begin ( 115200 );&lt;br /&gt;
	WiFi.begin ( ssid, password );&lt;br /&gt;
	Serial.println ( &amp;quot;&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	// Wait for connection&lt;br /&gt;
	while ( WiFi.status() != WL_CONNECTED ) {&lt;br /&gt;
		delay ( 500 );&lt;br /&gt;
		Serial.print ( &amp;quot;.&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	Serial.println ( &amp;quot;&amp;quot; );&lt;br /&gt;
	Serial.print ( &amp;quot;Connected to &amp;quot; );&lt;br /&gt;
	Serial.println ( ssid );&lt;br /&gt;
	Serial.print ( &amp;quot;IP address: &amp;quot; );&lt;br /&gt;
	Serial.println ( WiFi.localIP() );&lt;br /&gt;
&lt;br /&gt;
	server.on ( &amp;quot;/&amp;quot;, handleRoot );&lt;br /&gt;
        server.on(&amp;quot;/buzz&amp;quot;, handleBuzz);&lt;br /&gt;
	server.on ( &amp;quot;/hello&amp;quot;, []() {&lt;br /&gt;
		server.send ( 200, &amp;quot;text/plain&amp;quot;, &amp;quot;hi, how ya doin?&amp;quot; );&lt;br /&gt;
	} );&lt;br /&gt;
	server.onNotFound ( handleNotFound );&lt;br /&gt;
	server.begin();&lt;br /&gt;
	Serial.println ( &amp;quot;HTTP server started&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop ( void ) {&lt;br /&gt;
        &lt;br /&gt;
        if (digitalRead(pir)) {&lt;br /&gt;
          // Do something interesting on motion&lt;br /&gt;
        } else {&lt;br /&gt;
          // Nothing new here&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // LED on if motion == true&lt;br /&gt;
        digitalWrite(led, digitalRead(pir));&lt;br /&gt;
&lt;br /&gt;
	server.handleClient();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=ESP8266&amp;diff=51670</id>
		<title>ESP8266</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=ESP8266&amp;diff=51670"/>
		<updated>2016-04-08T19:14:46Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:CyanBread bb.png|800px]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄ &lt;br /&gt;
▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌&lt;br /&gt;
▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀█░▌ ▀▀▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀▀▀ &lt;br /&gt;
▐░▌          ▐░▌          ▐░▌       ▐░▌▐░▌       ▐░▌          ▐░▌▐░▌          ▐░▌          &lt;br /&gt;
▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄█░▌          ▐░▌▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄▄▄ &lt;br /&gt;
▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌ ▐░░░░░░░░░▌  ▄▄▄▄▄▄▄▄▄█░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌&lt;br /&gt;
▐░█▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀█░▌▐░░░░░░░░░░░▌▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀█░▌&lt;br /&gt;
▐░▌                    ▐░▌▐░▌          ▐░▌       ▐░▌▐░█▀▀▀▀▀▀▀▀▀ ▐░▌       ▐░▌▐░▌       ▐░▌&lt;br /&gt;
▐░█▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄█░▌▐░▌          ▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄█░▌&lt;br /&gt;
▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░▌          ▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌&lt;br /&gt;
 ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀            ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀                                                                                           &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* [[ESP8266/OTA]]&lt;br /&gt;
* [[ESP8266/Blink]]&lt;br /&gt;
* [[ESP8266/WS2812]]&lt;br /&gt;
* [[ESP8266/PIR]]&lt;br /&gt;
* [[ESP8266/Temp]]&lt;br /&gt;
* [[ESP8266/Matrix]]&lt;br /&gt;
&lt;br /&gt;
* https://nurdspace.nl/ESP8266&lt;br /&gt;
* https://github.com/espressif/ESP8266_AT/wiki&lt;br /&gt;
* http://www.esp8266.com/wiki/doku.php?id=esp8266-module-family&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ESP8266 is a small, low-cost wifi-talking board. It&#039;s the new center of the Internet of Things. Originally intended as a &amp;quot;wifi modem&amp;quot;, it exposes the WiFi interface over AT-style commands.&lt;br /&gt;
&lt;br /&gt;
Some hackers immediately noticed there is a general-purpose microcontroller on the box, and made a firmware for it that takes Lua programs. Now you don&#039;t need another microcontroller. Sweet!&lt;br /&gt;
&lt;br /&gt;
Several additional community efforts have also been initiated and are generally discussed at http://esp8266.com one of the newer developmentss is the addition of integrated support in the Arduino IDE, further details follow in the &#039;&#039;Software&#039;&#039; section below.&lt;br /&gt;
&lt;br /&gt;
== Boot Modes ==&lt;br /&gt;
&lt;br /&gt;
To load new firmware, connect GPIO0 to ground, and momentarily connect RESET to ground, or cycle the power. You can then disconnect GPIO0 and program the chip over Serial with 115,200 baud. Then reset or power cycle after the firmware upload completes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reset causes:&lt;br /&gt;
        0: &lt;br /&gt;
        1: normal boot&lt;br /&gt;
        2: reset pin&lt;br /&gt;
        3: software reset&lt;br /&gt;
        4: watchdog reset&lt;br /&gt;
&lt;br /&gt;
    boot device:&lt;br /&gt;
        0:&lt;br /&gt;
        1: ram&lt;br /&gt;
        3: flash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  -15cm-&lt;br /&gt;
&lt;br /&gt;
+---------+&lt;br /&gt;
| |-| |---|&lt;br /&gt;
| | |-|   |&lt;br /&gt;
| |---- ..|  |&lt;br /&gt;
|         | 25cm &lt;br /&gt;
| G I I R |  |&lt;br /&gt;
| n O O x |&lt;br /&gt;
| d 2 0 D |&lt;br /&gt;
| * * * * |&lt;br /&gt;
| * * * * |&lt;br /&gt;
+---------+&lt;br /&gt;
  T E R V&lt;br /&gt;
  x N s c&lt;br /&gt;
  D   t c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For full specs, see [https://nurdspace.nl/ESP8266]. Important facts:&lt;br /&gt;
* 3.3v *only* - 5v will let out the majikul smoke&lt;br /&gt;
* Power draw &amp;lt; 250 mA&lt;br /&gt;
* Talks 802.1n, supports most major auth types.&lt;br /&gt;
&lt;br /&gt;
There are a number of ESP8266 hardware versions. The ones of interest are:&lt;br /&gt;
&lt;br /&gt;
* ESP-01: 8 pins (basically one I/O plus power, etc.). Breadboard friendly 2x4 header (2.54mm), but not useful standalone&lt;br /&gt;
* ESP-12: 16 pins (I/O, power, 9 GPIO). Non-breadboard friendly: 2mm pin spacing&lt;br /&gt;
* ESP-12e: 22 pins, same as ESP-12, with an additional 6 pins on the back edge adding 1 I/O and SPI connections&lt;br /&gt;
&lt;br /&gt;
=== Sources ===&lt;br /&gt;
&lt;br /&gt;
Most modules are available from this ebay store http://stores.ebay.com/tomyuen007/ for $3 and up, ships from US, generally less than a week for delivery.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== espressif SDK ===&lt;br /&gt;
&lt;br /&gt;
https://github.com/espressif/ESP8266_RTOS_SDK&lt;br /&gt;
&lt;br /&gt;
Toolchain setup on VM: http://www.esp8266.com/wiki/doku.php?id=toolchain&lt;br /&gt;
&lt;br /&gt;
Loading Firmware: http://www.esp8266.com/wiki/doku.php?id=loading_firmware&lt;br /&gt;
&lt;br /&gt;
=== Arduino IDE ===&lt;br /&gt;
&lt;br /&gt;
Enhancements to the Arduino IDE in versions 1.6.4 and later have enabled support for the esp8266 and the ability to upload new firmware. Version 1.6.5 r5 or later is recommended.&lt;br /&gt;
&lt;br /&gt;
The current version of the IDE can be downloaded from https://www.arduino.cc/en/Main/Software&lt;br /&gt;
&lt;br /&gt;
Two additional steps are required to add esp8266 support to the Arduino IDE&lt;br /&gt;
# Open the preferences menu in the Arduino IDE and add &amp;lt;code&amp;gt;http://arduino.esp8266.com/stable/package_esp8266com_index.json&amp;lt;/code&amp;gt; into &amp;quot;Additional Board Manager URLs&amp;quot; field&lt;br /&gt;
# Open Boards Manager from &amp;quot;Tools &amp;gt; Board: ______ &amp;gt; Boards Manager...&amp;quot; menu, scroll down to esp8266, click to select it and then click the install button.&lt;br /&gt;
&lt;br /&gt;
Details about esp8266 support can be found at https://github.com/esp8266/Arduino&lt;br /&gt;
&lt;br /&gt;
Once it downloads you&#039;ll see &amp;quot;ESP8266 Modules&amp;quot; section added to the list of target boards under &amp;quot;Tools &amp;gt; Board: ______&amp;gt;&amp;quot;. You can use the &amp;quot;Generic ESP8266 Module&amp;quot; option for programming ESP-## modules using a 3.3v USB-Serial connector.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll need a USB to Serial cable/dongle for programming the board, connecting Ground/Rx/Tx. If you&#039;re using the cheap USB dongles, like the AI branded ones using a CH340G chip, you may also need to install the drivers.&lt;br /&gt;
&lt;br /&gt;
* http://www.wch.cn/download/CH341SER_ZIP.html (Windows)&lt;br /&gt;
* http://www.wch.cn/download/CH341SER_MAC_ZIP.html (Mac)&lt;br /&gt;
* http://www.wch.cn/download/CH341SER_LINUX_ZIP.html (Linux)&lt;br /&gt;
&lt;br /&gt;
In order to enable the ESP8266 to accept new firmware, temporarily connect GPIO0 to ground, and cycle the power.&lt;br /&gt;
&lt;br /&gt;
=== LUA ===&lt;br /&gt;
There are a wide variety of firmware builds available for the chip. Of interest is the software [http://nodemcu.com/index_en.html NodeMCU], which turns the serial port in to a Lua REPL. [[User:Yesac|Yesac]] is working on an [https://github.com/squeed/nodemcu-env environment] within NodeMCU for doing TFTP and some other junk.&lt;br /&gt;
&lt;br /&gt;
Uploading firmware is easy with [https://github.com/themadinventor/esptool esptool]&lt;br /&gt;
&lt;br /&gt;
= Projects =&lt;br /&gt;
&lt;br /&gt;
== IoT X&#039;ample ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Breadboarded multi-function device using ESP-12 module, PIR sensor, buzzer, indicator LEDs and light sensor.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
See additional PIR info [[ESP8266/PIR]]&lt;br /&gt;
&lt;br /&gt;
[[File:BoardRoom_bb.png|800px]]&lt;br /&gt;
&lt;br /&gt;
The following code can be used on the above diagrammed hardware. Using a web browser the ESP8266 will respond the following url requests&lt;br /&gt;
* http://xxx.xxx.xxx.xxx/ (Displays current status, motion and light level)&lt;br /&gt;
* http://xxx.xxx.xxx.xxx/buzz (Triggers the buzzer to make a noise)&lt;br /&gt;
* http://xxx.xxx.xxx.xxx/hello (Returns a simple hello message)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
   AS IS NO GUARANTEE NO WARRANTY&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClient.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266mDNS.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const char *ssid = &amp;quot;YourWiFi&amp;quot;;&lt;br /&gt;
const char *password = &amp;quot;WiFiPassword&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
ESP8266WebServer server ( 80 );&lt;br /&gt;
&lt;br /&gt;
const int pir = 4;&lt;br /&gt;
const int led = 14;&lt;br /&gt;
const int buzzer = 12;&lt;br /&gt;
&lt;br /&gt;
void handleRoot() {&lt;br /&gt;
	&lt;br /&gt;
	char temp[400];&lt;br /&gt;
	int sec = millis() / 1000;&lt;br /&gt;
	int min = sec / 60;&lt;br /&gt;
	int hr = min / 60;&lt;br /&gt;
&lt;br /&gt;
	snprintf ( temp, 400,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;html&amp;gt;\&lt;br /&gt;
  &amp;lt;head&amp;gt;\&lt;br /&gt;
    &amp;lt;title&amp;gt;PIR Demo&amp;lt;/title&amp;gt;\&lt;br /&gt;
    &amp;lt;style&amp;gt;\&lt;br /&gt;
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\&lt;br /&gt;
    &amp;lt;/style&amp;gt;\&lt;br /&gt;
  &amp;lt;/head&amp;gt;\&lt;br /&gt;
  &amp;lt;body&amp;gt;\&lt;br /&gt;
    &amp;lt;h1&amp;gt;Hello from ESP8266 PIR!&amp;lt;/h1&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Uptime: %02d:%02d:%02d&amp;lt;/p&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Motion: %s&amp;lt;/p&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Ambient: %d%&amp;lt;/p&amp;gt;\&lt;br /&gt;
  &amp;lt;/body&amp;gt;\&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		hr, min % 60, sec % 60, digitalRead(pir)?&amp;quot;true&amp;quot;:&amp;quot;false&amp;quot;, round(analogRead(A0)/10.24)&lt;br /&gt;
	);&lt;br /&gt;
	server.send ( 200, &amp;quot;text/html&amp;quot;, temp );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handleBuzz() {&lt;br /&gt;
  	&lt;br /&gt;
	char temp[400];&lt;br /&gt;
	int sec = millis() / 1000;&lt;br /&gt;
	int min = sec / 60;&lt;br /&gt;
	int hr = min / 60;&lt;br /&gt;
&lt;br /&gt;
	snprintf ( temp, 400,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;html&amp;gt;\&lt;br /&gt;
  &amp;lt;head&amp;gt;\&lt;br /&gt;
    &amp;lt;title&amp;gt;BUZZ!!!&amp;lt;/title&amp;gt;\&lt;br /&gt;
    &amp;lt;style&amp;gt;\&lt;br /&gt;
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #ff0000; }\&lt;br /&gt;
    &amp;lt;/style&amp;gt;\&lt;br /&gt;
  &amp;lt;/head&amp;gt;\&lt;br /&gt;
  &amp;lt;body&amp;gt;\&lt;br /&gt;
    &amp;lt;h1&amp;gt;BUZZ!!!&amp;lt;/h1&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Uptime: %02d:%02d:%02d&amp;lt;/p&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Motion: %s&amp;lt;/p&amp;gt;\&lt;br /&gt;
  &amp;lt;/body&amp;gt;\&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		hr, min % 60, sec % 60, digitalRead(pir)?&amp;quot;true&amp;quot;:&amp;quot;false&amp;quot;&lt;br /&gt;
	);&lt;br /&gt;
	server.send ( 200, &amp;quot;text/html&amp;quot;, temp );&lt;br /&gt;
&lt;br /&gt;
        digitalWrite(buzzer, HIGH);&lt;br /&gt;
        delay(300);&lt;br /&gt;
        digitalWrite(buzzer, LOW);&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
void handleNotFound() {&lt;br /&gt;
	String message = &amp;quot;File Not Found\n\n&amp;quot;;&lt;br /&gt;
	message += &amp;quot;URI: &amp;quot;;&lt;br /&gt;
	message += server.uri();&lt;br /&gt;
	message += &amp;quot;\nMethod: &amp;quot;;&lt;br /&gt;
	message += ( server.method() == HTTP_GET ) ? &amp;quot;GET&amp;quot; : &amp;quot;POST&amp;quot;;&lt;br /&gt;
	message += &amp;quot;\nArguments: &amp;quot;;&lt;br /&gt;
	message += server.args();&lt;br /&gt;
	message += &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	for ( uint8_t i = 0; i &amp;lt; server.args(); i++ ) {&lt;br /&gt;
		message += &amp;quot; &amp;quot; + server.argName ( i ) + &amp;quot;: &amp;quot; + server.arg ( i ) + &amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	server.send ( 404, &amp;quot;text/plain&amp;quot;, message );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup ( void ) {&lt;br /&gt;
	pinMode ( led, OUTPUT );&lt;br /&gt;
	digitalWrite ( led, 0 );&lt;br /&gt;
         &lt;br /&gt;
        pinMode(buzzer, OUTPUT);&lt;br /&gt;
        digitalWrite(buzzer, 0);&lt;br /&gt;
        &lt;br /&gt;
        pinMode(pir, INPUT);&lt;br /&gt;
&lt;br /&gt;
	Serial.begin ( 115200 );&lt;br /&gt;
	WiFi.begin ( ssid, password );&lt;br /&gt;
	Serial.println ( &amp;quot;&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	// Wait for connection&lt;br /&gt;
	while ( WiFi.status() != WL_CONNECTED ) {&lt;br /&gt;
		delay ( 500 );&lt;br /&gt;
		Serial.print ( &amp;quot;.&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	Serial.println ( &amp;quot;&amp;quot; );&lt;br /&gt;
	Serial.print ( &amp;quot;Connected to &amp;quot; );&lt;br /&gt;
	Serial.println ( ssid );&lt;br /&gt;
	Serial.print ( &amp;quot;IP address: &amp;quot; );&lt;br /&gt;
	Serial.println ( WiFi.localIP() );&lt;br /&gt;
&lt;br /&gt;
	server.on ( &amp;quot;/&amp;quot;, handleRoot );&lt;br /&gt;
        server.on(&amp;quot;/buzz&amp;quot;, handleBuzz);&lt;br /&gt;
	server.on ( &amp;quot;/hello&amp;quot;, []() {&lt;br /&gt;
		server.send ( 200, &amp;quot;text/plain&amp;quot;, &amp;quot;hi, how ya doin?&amp;quot; );&lt;br /&gt;
	} );&lt;br /&gt;
	server.onNotFound ( handleNotFound );&lt;br /&gt;
	server.begin();&lt;br /&gt;
	Serial.println ( &amp;quot;HTTP server started&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop ( void ) {&lt;br /&gt;
        &lt;br /&gt;
        if (digitalRead(pir)) {&lt;br /&gt;
          // Do something interesting on motion&lt;br /&gt;
        } else {&lt;br /&gt;
          // Nothing new here&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // LED on if motion == true&lt;br /&gt;
        digitalWrite(led, digitalRead(pir));&lt;br /&gt;
&lt;br /&gt;
	server.handleClient();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=ESP8266/Matrix&amp;diff=51599</id>
		<title>ESP8266/Matrix</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=ESP8266/Matrix&amp;diff=51599"/>
		<updated>2016-03-29T20:10:51Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: QA PASS #cc0&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hacking on old Sure Electronics LED Matrix Displays.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;current&amp;quot; generation of displays from sure use HT1632C chips and are referred to as 3208 with four 8x8 modules on a single board. The &amp;quot;original/older&amp;quot; displays use the HT1632 chip (no &#039;C&#039;) and are referred to as 0832, I&#039;ve managed to get several of these working with some minor modifications and fiddling.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;CONFIRMED this works with ESP8266 driving the CS, WR and Data pins with 3.3v, and powering with 3.3v or 5v!&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wiring ===&lt;br /&gt;
&lt;br /&gt;
For a single display you&#039;ll need 5 wires. +5v, Ground, CS1, WR, and data. You can connect up to 4 displays chained together by additionally connected CS2, CS3, and CS4. Set the dip switch on the back of each board so that only the switch corresponding to that boards position, starting with 1, is &amp;quot;on&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== HT1632-for-Arduino ===&lt;br /&gt;
&lt;br /&gt;
This seems to be the most popular library and looks to be designed for the newer boards, a few edits and it will work with the 0832&#039;s as well.&lt;br /&gt;
https://github.com/gauravmm/HT1632-for-Arduino&lt;br /&gt;
&lt;br /&gt;
The only real difference between using the HT1632 &amp;amp; HT1632C seems to be teh initialization. There&#039;s a bit more on that here http://timewitharduino.blogspot.com/2011/10/difference-between-3208-and-0832-led.html&lt;br /&gt;
&lt;br /&gt;
To modify the library to additionally support 0832, do the following.&lt;br /&gt;
&lt;br /&gt;
Edit HT1632.h and add &#039;&#039;#define LEGACY_0832 1&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you haven&#039;t already done so comment out &#039;&#039; #define TYPE_3216_BICOLOR 1&#039;&#039; and uncomment &#039;&#039;#define TYPE_3208_MONO 1&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Then edit HT1632.c and find this section&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Custom initialization from each:&lt;br /&gt;
#if defined TYPE_3208_MONO&lt;br /&gt;
	writeCommand(HT1632_CMD_COMS00);&lt;br /&gt;
#elif defined TYPE_3216_BICOLOR&lt;br /&gt;
	writeCommand(HT1632_CMD_COMS00);&lt;br /&gt;
	writeCommand(HT1632_CMD_RCCLK);  // Master Mode, external clock&lt;br /&gt;
#else&lt;br /&gt;
	writeCommand(HT1632_CMD_COMS00);&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Change it to the following, by adding the additional if for legacy&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Custom initialization from each:&lt;br /&gt;
#if defined TYPE_3208_MONO&lt;br /&gt;
	#if defined LEGACY_0832&lt;br /&gt;
		writeCommand(HT1632_CMD_COMS10);  // PMOS drivers&lt;br /&gt;
		writeCommand(HT1632_CMD_MSTMD);  // Master Mode&lt;br /&gt;
	#else&lt;br /&gt;
		writeCommand(HT1632_CMD_COMS00);&lt;br /&gt;
	#endif&lt;br /&gt;
#elif defined TYPE_3216_BICOLOR&lt;br /&gt;
	writeCommand(HT1632_CMD_COMS00);&lt;br /&gt;
	writeCommand(HT1632_CMD_RCCLK);  // Master Mode, external clock&lt;br /&gt;
#else&lt;br /&gt;
	writeCommand(HT1632_CMD_COMS00);&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using the Text examples, comment out or do not use the line &#039;&#039;HT1632.drawTarget(BUFFER_BOARD(1));&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Other Code ===&lt;br /&gt;
&lt;br /&gt;
This library which is a re-packaging of the original code from sure will run with a couple of updates on Arduino&lt;br /&gt;
http://download.milesburton.com/Arduino/Sure2416/MatrixDisplay_201B_0832Version.zip&lt;br /&gt;
&lt;br /&gt;
There seems to be some issues with the newer versions of the Arduino IDE. You need to comment out the includes for wiring.h in the header files. You also need to modify the MatrixDisplay.cpp file by removing the calls to the pinMode() method, set these in your setup function of your main code file instead. In font.h you need to add &#039;&#039;const&#039;&#039; to the beginning of the myfont variable declaration.&lt;br /&gt;
&lt;br /&gt;
If you are using a Leonardo the Serial.println() calls also need to be removed.&lt;br /&gt;
&lt;br /&gt;
There is some additional info and vids available at http://www.milesburton.com/HT1632_Arduino_%22Matrix_Display%22_Library_for_the_Sure_2416_and_0832&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=ESP8266&amp;diff=51584</id>
		<title>ESP8266</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=ESP8266&amp;diff=51584"/>
		<updated>2016-03-25T06:41:49Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: +dev pic, dropped xpired grp order #0dd&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:CyanBread bb.png|800px]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄ &lt;br /&gt;
▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌&lt;br /&gt;
▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀█░▌ ▀▀▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀▀▀ &lt;br /&gt;
▐░▌          ▐░▌          ▐░▌       ▐░▌▐░▌       ▐░▌          ▐░▌▐░▌          ▐░▌          &lt;br /&gt;
▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄█░▌          ▐░▌▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄▄▄ &lt;br /&gt;
▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌ ▐░░░░░░░░░▌  ▄▄▄▄▄▄▄▄▄█░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌&lt;br /&gt;
▐░█▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀█░▌▐░░░░░░░░░░░▌▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀█░▌&lt;br /&gt;
▐░▌                    ▐░▌▐░▌          ▐░▌       ▐░▌▐░█▀▀▀▀▀▀▀▀▀ ▐░▌       ▐░▌▐░▌       ▐░▌&lt;br /&gt;
▐░█▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄█░▌▐░▌          ▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄█░▌&lt;br /&gt;
▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░▌          ▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌&lt;br /&gt;
 ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀            ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀                                                                                           &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* [[ESP8266/OTA]]&lt;br /&gt;
* [[ESP8266/Blink]]&lt;br /&gt;
* [[ESP8266/WS2812]]&lt;br /&gt;
* [[ESP8266/PIR]]&lt;br /&gt;
* [[ESP8266/Temp]]&lt;br /&gt;
* [[ESP8266/Matrix]]&lt;br /&gt;
&lt;br /&gt;
* https://nurdspace.nl/ESP8266&lt;br /&gt;
* https://github.com/espressif/ESP8266_AT/wiki&lt;br /&gt;
* http://www.esp8266.com/wiki/doku.php?id=esp8266-module-family&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ESP8266 is a small, low-cost wifi-talking board. It&#039;s the new center of the Internet of Things. Originally intended as a &amp;quot;wifi modem&amp;quot;, it exposes the WiFi interface over AT-style commands.&lt;br /&gt;
&lt;br /&gt;
Some hackers immediately noticed there is a general-purpose microcontroller on the box, and made a firmware for it that takes Lua programs. Now you don&#039;t need another microcontroller. Sweet!&lt;br /&gt;
&lt;br /&gt;
Several additional community efforts have also been initiated and are generally discussed at http://esp8266.com one of the newer developmentss is the addition of integrated support in the Arduino IDE, further details follow in the &#039;&#039;Software&#039;&#039; section below.&lt;br /&gt;
&lt;br /&gt;
== Boot Modes ==&lt;br /&gt;
&lt;br /&gt;
To load new firmware, connect GPIO0 to ground, and momentarily connect RESET to ground, or cycle the power. You can then disconnect GPIO0 and program the chip over Serial with 115,200 baud. Then reset or power cycle after the firmware upload completes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reset causes:&lt;br /&gt;
        0: &lt;br /&gt;
        1: normal boot&lt;br /&gt;
        2: reset pin&lt;br /&gt;
        3: software reset&lt;br /&gt;
        4: watchdog reset&lt;br /&gt;
&lt;br /&gt;
    boot device:&lt;br /&gt;
        0:&lt;br /&gt;
        1: ram&lt;br /&gt;
        3: flash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
For full specs, see [https://nurdspace.nl/ESP8266]. Important facts:&lt;br /&gt;
* 3.3v *only* - 5v will let out the majikul smoke&lt;br /&gt;
* Some reports say 1A current draw, others say 250 mA&lt;br /&gt;
* Talks 802.1n, supports most major auth types.&lt;br /&gt;
&lt;br /&gt;
There are a number of ESP8266 hardware versions. The ones of interest are:&lt;br /&gt;
&lt;br /&gt;
* ESP-01: 8 pins (basically one I/O plus power, etc.). Breadboard friendly 2x4 header (2.54mm), but not useful standalone&lt;br /&gt;
* ESP-12: 16 pins (I/O, power, 9 GPIO). Non-breadboard friendly: 2mm pin spacing&lt;br /&gt;
* ESP-12e: 22 pins, same as ESP-12, with an additional 6 pins on the back edge adding 1 I/O and SPI connections&lt;br /&gt;
&lt;br /&gt;
=== Sources ===&lt;br /&gt;
&lt;br /&gt;
Most modules are available from this ebay store http://stores.ebay.com/tomyuen007/ for $3 and up, ships from US, generally less than a week for delivery.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== espressif SDK ===&lt;br /&gt;
&lt;br /&gt;
https://github.com/espressif/ESP8266_RTOS_SDK&lt;br /&gt;
&lt;br /&gt;
Toolchain setup on VM: http://www.esp8266.com/wiki/doku.php?id=toolchain&lt;br /&gt;
&lt;br /&gt;
Loading Firmware: http://www.esp8266.com/wiki/doku.php?id=loading_firmware&lt;br /&gt;
&lt;br /&gt;
=== Arduino IDE ===&lt;br /&gt;
&lt;br /&gt;
Enhancements to the Arduino IDE in versions 1.6.4 and later have enabled support for the esp8266 and the ability to upload new firmware. Version 1.6.5 r5 or later is recommended.&lt;br /&gt;
&lt;br /&gt;
The current version of the IDE can be downloaded from https://www.arduino.cc/en/Main/Software&lt;br /&gt;
&lt;br /&gt;
Two additional steps are required to add esp8266 support to the Arduino IDE&lt;br /&gt;
# Open the preferences menu in the Arduino IDE and add &amp;lt;code&amp;gt;http://arduino.esp8266.com/stable/package_esp8266com_index.json&amp;lt;/code&amp;gt; into &amp;quot;Additional Board Manager URLs&amp;quot; field&lt;br /&gt;
# Open Boards Manager from &amp;quot;Tools &amp;gt; Board: ______ &amp;gt; Boards Manager...&amp;quot; menu, scroll down to esp8266, click to select it and then click the install button.&lt;br /&gt;
&lt;br /&gt;
Details about esp8266 support can be found at https://github.com/esp8266/Arduino&lt;br /&gt;
&lt;br /&gt;
Once it downloads you&#039;ll see &amp;quot;ESP8266 Modules&amp;quot; section added to the list of target boards under &amp;quot;Tools &amp;gt; Board: ______&amp;gt;&amp;quot;. You can use the &amp;quot;Generic ESP8266 Module&amp;quot; option for programming ESP-## modules using a 3.3v USB-Serial connector.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll need a USB to Serial cable/dongle for programming the board, connecting Ground/Rx/Tx. If you&#039;re using the cheap USB dongles, like the AI branded ones using a CH340G chip, you may also need to install the drivers.&lt;br /&gt;
&lt;br /&gt;
* http://www.wch.cn/download/CH341SER_ZIP.html (Windows)&lt;br /&gt;
* http://www.wch.cn/download/CH341SER_MAC_ZIP.html (Mac)&lt;br /&gt;
* http://www.wch.cn/download/CH341SER_LINUX_ZIP.html (Linux)&lt;br /&gt;
&lt;br /&gt;
In order to enable the ESP8266 to accept new firmware, temporarily connect GPIO0 to ground, and cycle the power.&lt;br /&gt;
&lt;br /&gt;
=== LUA ===&lt;br /&gt;
There are a wide variety of firmware builds available for the chip. Of interest is the software [http://nodemcu.com/index_en.html NodeMCU], which turns the serial port in to a Lua REPL. [[User:Yesac|Yesac]] is working on an [https://github.com/squeed/nodemcu-env environment] within NodeMCU for doing TFTP and some other junk.&lt;br /&gt;
&lt;br /&gt;
Uploading firmware is easy with [https://github.com/themadinventor/esptool esptool]&lt;br /&gt;
&lt;br /&gt;
= Projects =&lt;br /&gt;
&lt;br /&gt;
== IoT X&#039;ample ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Breadboarded multi-function device using ESP-12 module, PIR sensor, buzzer, indicator LEDs and light sensor.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
See additional PIR info [[ESP8266/PIR]]&lt;br /&gt;
&lt;br /&gt;
[[File:BoardRoom_bb.png|800px]]&lt;br /&gt;
&lt;br /&gt;
The following code can be used on the above diagrammed hardware. Using a web browser the ESP8266 will respond the following url requests&lt;br /&gt;
* http://xxx.xxx.xxx.xxx/ (Displays current status, motion and light level)&lt;br /&gt;
* http://xxx.xxx.xxx.xxx/buzz (Triggers the buzzer to make a noise)&lt;br /&gt;
* http://xxx.xxx.xxx.xxx/hello (Returns a simple hello message)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
   AS IS NO GUARANTEE NO WARRANTY&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClient.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266mDNS.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const char *ssid = &amp;quot;YourWiFi&amp;quot;;&lt;br /&gt;
const char *password = &amp;quot;WiFiPassword&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
ESP8266WebServer server ( 80 );&lt;br /&gt;
&lt;br /&gt;
const int pir = 4;&lt;br /&gt;
const int led = 14;&lt;br /&gt;
const int buzzer = 12;&lt;br /&gt;
&lt;br /&gt;
void handleRoot() {&lt;br /&gt;
	&lt;br /&gt;
	char temp[400];&lt;br /&gt;
	int sec = millis() / 1000;&lt;br /&gt;
	int min = sec / 60;&lt;br /&gt;
	int hr = min / 60;&lt;br /&gt;
&lt;br /&gt;
	snprintf ( temp, 400,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;html&amp;gt;\&lt;br /&gt;
  &amp;lt;head&amp;gt;\&lt;br /&gt;
    &amp;lt;title&amp;gt;PIR Demo&amp;lt;/title&amp;gt;\&lt;br /&gt;
    &amp;lt;style&amp;gt;\&lt;br /&gt;
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\&lt;br /&gt;
    &amp;lt;/style&amp;gt;\&lt;br /&gt;
  &amp;lt;/head&amp;gt;\&lt;br /&gt;
  &amp;lt;body&amp;gt;\&lt;br /&gt;
    &amp;lt;h1&amp;gt;Hello from ESP8266 PIR!&amp;lt;/h1&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Uptime: %02d:%02d:%02d&amp;lt;/p&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Motion: %s&amp;lt;/p&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Ambient: %d%&amp;lt;/p&amp;gt;\&lt;br /&gt;
  &amp;lt;/body&amp;gt;\&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		hr, min % 60, sec % 60, digitalRead(pir)?&amp;quot;true&amp;quot;:&amp;quot;false&amp;quot;, round(analogRead(A0)/10.24)&lt;br /&gt;
	);&lt;br /&gt;
	server.send ( 200, &amp;quot;text/html&amp;quot;, temp );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handleBuzz() {&lt;br /&gt;
  	&lt;br /&gt;
	char temp[400];&lt;br /&gt;
	int sec = millis() / 1000;&lt;br /&gt;
	int min = sec / 60;&lt;br /&gt;
	int hr = min / 60;&lt;br /&gt;
&lt;br /&gt;
	snprintf ( temp, 400,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;html&amp;gt;\&lt;br /&gt;
  &amp;lt;head&amp;gt;\&lt;br /&gt;
    &amp;lt;title&amp;gt;BUZZ!!!&amp;lt;/title&amp;gt;\&lt;br /&gt;
    &amp;lt;style&amp;gt;\&lt;br /&gt;
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #ff0000; }\&lt;br /&gt;
    &amp;lt;/style&amp;gt;\&lt;br /&gt;
  &amp;lt;/head&amp;gt;\&lt;br /&gt;
  &amp;lt;body&amp;gt;\&lt;br /&gt;
    &amp;lt;h1&amp;gt;BUZZ!!!&amp;lt;/h1&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Uptime: %02d:%02d:%02d&amp;lt;/p&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Motion: %s&amp;lt;/p&amp;gt;\&lt;br /&gt;
  &amp;lt;/body&amp;gt;\&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		hr, min % 60, sec % 60, digitalRead(pir)?&amp;quot;true&amp;quot;:&amp;quot;false&amp;quot;&lt;br /&gt;
	);&lt;br /&gt;
	server.send ( 200, &amp;quot;text/html&amp;quot;, temp );&lt;br /&gt;
&lt;br /&gt;
        digitalWrite(buzzer, HIGH);&lt;br /&gt;
        delay(300);&lt;br /&gt;
        digitalWrite(buzzer, LOW);&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
void handleNotFound() {&lt;br /&gt;
	String message = &amp;quot;File Not Found\n\n&amp;quot;;&lt;br /&gt;
	message += &amp;quot;URI: &amp;quot;;&lt;br /&gt;
	message += server.uri();&lt;br /&gt;
	message += &amp;quot;\nMethod: &amp;quot;;&lt;br /&gt;
	message += ( server.method() == HTTP_GET ) ? &amp;quot;GET&amp;quot; : &amp;quot;POST&amp;quot;;&lt;br /&gt;
	message += &amp;quot;\nArguments: &amp;quot;;&lt;br /&gt;
	message += server.args();&lt;br /&gt;
	message += &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	for ( uint8_t i = 0; i &amp;lt; server.args(); i++ ) {&lt;br /&gt;
		message += &amp;quot; &amp;quot; + server.argName ( i ) + &amp;quot;: &amp;quot; + server.arg ( i ) + &amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	server.send ( 404, &amp;quot;text/plain&amp;quot;, message );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup ( void ) {&lt;br /&gt;
	pinMode ( led, OUTPUT );&lt;br /&gt;
	digitalWrite ( led, 0 );&lt;br /&gt;
         &lt;br /&gt;
        pinMode(buzzer, OUTPUT);&lt;br /&gt;
        digitalWrite(buzzer, 0);&lt;br /&gt;
        &lt;br /&gt;
        pinMode(pir, INPUT);&lt;br /&gt;
&lt;br /&gt;
	Serial.begin ( 115200 );&lt;br /&gt;
	WiFi.begin ( ssid, password );&lt;br /&gt;
	Serial.println ( &amp;quot;&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	// Wait for connection&lt;br /&gt;
	while ( WiFi.status() != WL_CONNECTED ) {&lt;br /&gt;
		delay ( 500 );&lt;br /&gt;
		Serial.print ( &amp;quot;.&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	Serial.println ( &amp;quot;&amp;quot; );&lt;br /&gt;
	Serial.print ( &amp;quot;Connected to &amp;quot; );&lt;br /&gt;
	Serial.println ( ssid );&lt;br /&gt;
	Serial.print ( &amp;quot;IP address: &amp;quot; );&lt;br /&gt;
	Serial.println ( WiFi.localIP() );&lt;br /&gt;
&lt;br /&gt;
	server.on ( &amp;quot;/&amp;quot;, handleRoot );&lt;br /&gt;
        server.on(&amp;quot;/buzz&amp;quot;, handleBuzz);&lt;br /&gt;
	server.on ( &amp;quot;/hello&amp;quot;, []() {&lt;br /&gt;
		server.send ( 200, &amp;quot;text/plain&amp;quot;, &amp;quot;hi, how ya doin?&amp;quot; );&lt;br /&gt;
	} );&lt;br /&gt;
	server.onNotFound ( handleNotFound );&lt;br /&gt;
	server.begin();&lt;br /&gt;
	Serial.println ( &amp;quot;HTTP server started&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop ( void ) {&lt;br /&gt;
        &lt;br /&gt;
        if (digitalRead(pir)) {&lt;br /&gt;
          // Do something interesting on motion&lt;br /&gt;
        } else {&lt;br /&gt;
          // Nothing new here&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // LED on if motion == true&lt;br /&gt;
        digitalWrite(led, digitalRead(pir));&lt;br /&gt;
&lt;br /&gt;
	server.handleClient();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=File:CyanBread_bb.png&amp;diff=51583</id>
		<title>File:CyanBread bb.png</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=File:CyanBread_bb.png&amp;diff=51583"/>
		<updated>2016-03-25T06:36:33Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: Test and develop breadboard for ESP8266 (ESP-12x)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Test and develop breadboard for ESP8266 (ESP-12x)&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=ESP8266&amp;diff=51561</id>
		<title>ESP8266</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=ESP8266&amp;diff=51561"/>
		<updated>2016-03-24T01:30:21Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: /* Software */ SDK #0d0&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄ &lt;br /&gt;
▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌&lt;br /&gt;
▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀█░▌ ▀▀▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀▀▀ &lt;br /&gt;
▐░▌          ▐░▌          ▐░▌       ▐░▌▐░▌       ▐░▌          ▐░▌▐░▌          ▐░▌          &lt;br /&gt;
▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄█░▌          ▐░▌▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄▄▄ &lt;br /&gt;
▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌ ▐░░░░░░░░░▌  ▄▄▄▄▄▄▄▄▄█░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌&lt;br /&gt;
▐░█▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀█░▌▐░░░░░░░░░░░▌▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀█░▌&lt;br /&gt;
▐░▌                    ▐░▌▐░▌          ▐░▌       ▐░▌▐░█▀▀▀▀▀▀▀▀▀ ▐░▌       ▐░▌▐░▌       ▐░▌&lt;br /&gt;
▐░█▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄█░▌▐░▌          ▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄█░▌&lt;br /&gt;
▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░▌          ▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌&lt;br /&gt;
 ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀            ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀                                                                                           &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* [[ESP8266/OTA]]&lt;br /&gt;
* [[ESP8266/Blink]]&lt;br /&gt;
* [[ESP8266/WS2812]]&lt;br /&gt;
* [[ESP8266/PIR]]&lt;br /&gt;
* [[ESP8266/Temp]]&lt;br /&gt;
* [[ESP8266/Matrix]]&lt;br /&gt;
&lt;br /&gt;
* https://nurdspace.nl/ESP8266&lt;br /&gt;
* https://github.com/espressif/ESP8266_AT/wiki&lt;br /&gt;
* http://www.esp8266.com/wiki/doku.php?id=esp8266-module-family&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ESP8266 is a small, low-cost wifi-talking board. It&#039;s the new center of the Internet of Things. Originally intended as a &amp;quot;wifi modem&amp;quot;, it exposes the WiFi interface over AT-style commands.&lt;br /&gt;
&lt;br /&gt;
Some hackers immediately noticed there is a general-purpose microcontroller on the box, and made a firmware for it that takes Lua programs. Now you don&#039;t need another microcontroller. Sweet!&lt;br /&gt;
&lt;br /&gt;
Several additional community efforts have also been initiated and are generally discussed at http://esp8266.com one of the newer developmentss is the addition of integrated support in the Arduino IDE, further details follow in the &#039;&#039;Software&#039;&#039; section below.&lt;br /&gt;
&lt;br /&gt;
== Boot Modes ==&lt;br /&gt;
&lt;br /&gt;
To load new firmware, connect GPIO0 to ground, and momentarily connect RESET to ground, or cycle the power. You can then disconnect GPIO0 and program the chip over Serial with 115,200 baud. Then reset or power cycle after the firmware upload completes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reset causes:&lt;br /&gt;
        0: &lt;br /&gt;
        1: normal boot&lt;br /&gt;
        2: reset pin&lt;br /&gt;
        3: software reset&lt;br /&gt;
        4: watchdog reset&lt;br /&gt;
&lt;br /&gt;
    boot device:&lt;br /&gt;
        0:&lt;br /&gt;
        1: ram&lt;br /&gt;
        3: flash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
For full specs, see [https://nurdspace.nl/ESP8266]. Important facts:&lt;br /&gt;
* 3.3v *only* - 5v will let out the majikul smoke&lt;br /&gt;
* Some reports say 1A current draw, others say 250 mA&lt;br /&gt;
* Talks 802.1n, supports most major auth types.&lt;br /&gt;
&lt;br /&gt;
There are a number of ESP8266 hardware versions. The ones of interest are:&lt;br /&gt;
&lt;br /&gt;
* ESP-01: 8 pins (basically one I/O plus power, etc.). Breadboard friendly 2x4 header (2.54mm), but not useful standalone&lt;br /&gt;
* ESP-12: 16 pins (I/O, power, 9 GPIO). Non-breadboard friendly: 2mm pin spacing&lt;br /&gt;
* ESP-12e: 22 pins, same as ESP-12, with an additional 6 pins on the back edge adding 1 I/O and SPI connections&lt;br /&gt;
&lt;br /&gt;
=== Sources ===&lt;br /&gt;
&lt;br /&gt;
Most modules are available from this ebay store http://stores.ebay.com/tomyuen007/ for $3 and up, ships from US, generally less than a week for delivery.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== espressif SDK ===&lt;br /&gt;
&lt;br /&gt;
https://github.com/espressif/ESP8266_RTOS_SDK&lt;br /&gt;
&lt;br /&gt;
Toolchain setup on VM: http://www.esp8266.com/wiki/doku.php?id=toolchain&lt;br /&gt;
&lt;br /&gt;
Loading Firmware: http://www.esp8266.com/wiki/doku.php?id=loading_firmware&lt;br /&gt;
&lt;br /&gt;
=== Arduino IDE ===&lt;br /&gt;
&lt;br /&gt;
Enhancements to the Arduino IDE in versions 1.6.4 and later have enabled support for the esp8266 and the ability to upload new firmware. Version 1.6.5 r5 or later is recommended.&lt;br /&gt;
&lt;br /&gt;
The current version of the IDE can be downloaded from https://www.arduino.cc/en/Main/Software&lt;br /&gt;
&lt;br /&gt;
Two additional steps are required to add esp8266 support to the Arduino IDE&lt;br /&gt;
# Open the preferences menu in the Arduino IDE and add &amp;lt;code&amp;gt;http://arduino.esp8266.com/stable/package_esp8266com_index.json&amp;lt;/code&amp;gt; into &amp;quot;Additional Board Manager URLs&amp;quot; field&lt;br /&gt;
# Open Boards Manager from &amp;quot;Tools &amp;gt; Board: ______ &amp;gt; Boards Manager...&amp;quot; menu, scroll down to esp8266, click to select it and then click the install button.&lt;br /&gt;
&lt;br /&gt;
Details about esp8266 support can be found at https://github.com/esp8266/Arduino&lt;br /&gt;
&lt;br /&gt;
Once it downloads you&#039;ll see &amp;quot;ESP8266 Modules&amp;quot; section added to the list of target boards under &amp;quot;Tools &amp;gt; Board: ______&amp;gt;&amp;quot;. You can use the &amp;quot;Generic ESP8266 Module&amp;quot; option for programming ESP-## modules using a 3.3v USB-Serial connector.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll need a USB to Serial cable/dongle for programming the board, connecting Ground/Rx/Tx. If you&#039;re using the cheap USB dongles, like the AI branded ones using a CH340G chip, you may also need to install the drivers.&lt;br /&gt;
&lt;br /&gt;
* http://www.wch.cn/download/CH341SER_ZIP.html (Windows)&lt;br /&gt;
* http://www.wch.cn/download/CH341SER_MAC_ZIP.html (Mac)&lt;br /&gt;
* http://www.wch.cn/download/CH341SER_LINUX_ZIP.html (Linux)&lt;br /&gt;
&lt;br /&gt;
In order to enable the ESP8266 to accept new firmware, temporarily connect GPIO0 to ground, and cycle the power.&lt;br /&gt;
&lt;br /&gt;
=== LUA ===&lt;br /&gt;
There are a wide variety of firmware builds available for the chip. Of interest is the software [http://nodemcu.com/index_en.html NodeMCU], which turns the serial port in to a Lua REPL. [[User:Yesac|Yesac]] is working on an [https://github.com/squeed/nodemcu-env environment] within NodeMCU for doing TFTP and some other junk.&lt;br /&gt;
&lt;br /&gt;
Uploading firmware is easy with [https://github.com/themadinventor/esptool esptool]&lt;br /&gt;
&lt;br /&gt;
= Projects =&lt;br /&gt;
&lt;br /&gt;
== IoT X&#039;ample ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Breadboarded multi-function device using ESP-12 module, PIR sensor, buzzer, indicator LEDs and light sensor.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
See additional PIR info [[ESP8266/PIR]]&lt;br /&gt;
&lt;br /&gt;
[[File:BoardRoom_bb.png|800px]]&lt;br /&gt;
&lt;br /&gt;
The following code can be used on the above diagrammed hardware. Using a web browser the ESP8266 will respond the following url requests&lt;br /&gt;
* http://xxx.xxx.xxx.xxx/ (Displays current status, motion and light level)&lt;br /&gt;
* http://xxx.xxx.xxx.xxx/buzz (Triggers the buzzer to make a noise)&lt;br /&gt;
* http://xxx.xxx.xxx.xxx/hello (Returns a simple hello message)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
   AS IS NO GUARANTEE NO WARRANTY&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClient.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266mDNS.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const char *ssid = &amp;quot;YourWiFi&amp;quot;;&lt;br /&gt;
const char *password = &amp;quot;WiFiPassword&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
ESP8266WebServer server ( 80 );&lt;br /&gt;
&lt;br /&gt;
const int pir = 4;&lt;br /&gt;
const int led = 14;&lt;br /&gt;
const int buzzer = 12;&lt;br /&gt;
&lt;br /&gt;
void handleRoot() {&lt;br /&gt;
	&lt;br /&gt;
	char temp[400];&lt;br /&gt;
	int sec = millis() / 1000;&lt;br /&gt;
	int min = sec / 60;&lt;br /&gt;
	int hr = min / 60;&lt;br /&gt;
&lt;br /&gt;
	snprintf ( temp, 400,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;html&amp;gt;\&lt;br /&gt;
  &amp;lt;head&amp;gt;\&lt;br /&gt;
    &amp;lt;title&amp;gt;PIR Demo&amp;lt;/title&amp;gt;\&lt;br /&gt;
    &amp;lt;style&amp;gt;\&lt;br /&gt;
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\&lt;br /&gt;
    &amp;lt;/style&amp;gt;\&lt;br /&gt;
  &amp;lt;/head&amp;gt;\&lt;br /&gt;
  &amp;lt;body&amp;gt;\&lt;br /&gt;
    &amp;lt;h1&amp;gt;Hello from ESP8266 PIR!&amp;lt;/h1&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Uptime: %02d:%02d:%02d&amp;lt;/p&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Motion: %s&amp;lt;/p&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Ambient: %d%&amp;lt;/p&amp;gt;\&lt;br /&gt;
  &amp;lt;/body&amp;gt;\&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		hr, min % 60, sec % 60, digitalRead(pir)?&amp;quot;true&amp;quot;:&amp;quot;false&amp;quot;, round(analogRead(A0)/10.24)&lt;br /&gt;
	);&lt;br /&gt;
	server.send ( 200, &amp;quot;text/html&amp;quot;, temp );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handleBuzz() {&lt;br /&gt;
  	&lt;br /&gt;
	char temp[400];&lt;br /&gt;
	int sec = millis() / 1000;&lt;br /&gt;
	int min = sec / 60;&lt;br /&gt;
	int hr = min / 60;&lt;br /&gt;
&lt;br /&gt;
	snprintf ( temp, 400,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;html&amp;gt;\&lt;br /&gt;
  &amp;lt;head&amp;gt;\&lt;br /&gt;
    &amp;lt;title&amp;gt;BUZZ!!!&amp;lt;/title&amp;gt;\&lt;br /&gt;
    &amp;lt;style&amp;gt;\&lt;br /&gt;
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #ff0000; }\&lt;br /&gt;
    &amp;lt;/style&amp;gt;\&lt;br /&gt;
  &amp;lt;/head&amp;gt;\&lt;br /&gt;
  &amp;lt;body&amp;gt;\&lt;br /&gt;
    &amp;lt;h1&amp;gt;BUZZ!!!&amp;lt;/h1&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Uptime: %02d:%02d:%02d&amp;lt;/p&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Motion: %s&amp;lt;/p&amp;gt;\&lt;br /&gt;
  &amp;lt;/body&amp;gt;\&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		hr, min % 60, sec % 60, digitalRead(pir)?&amp;quot;true&amp;quot;:&amp;quot;false&amp;quot;&lt;br /&gt;
	);&lt;br /&gt;
	server.send ( 200, &amp;quot;text/html&amp;quot;, temp );&lt;br /&gt;
&lt;br /&gt;
        digitalWrite(buzzer, HIGH);&lt;br /&gt;
        delay(300);&lt;br /&gt;
        digitalWrite(buzzer, LOW);&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
void handleNotFound() {&lt;br /&gt;
	String message = &amp;quot;File Not Found\n\n&amp;quot;;&lt;br /&gt;
	message += &amp;quot;URI: &amp;quot;;&lt;br /&gt;
	message += server.uri();&lt;br /&gt;
	message += &amp;quot;\nMethod: &amp;quot;;&lt;br /&gt;
	message += ( server.method() == HTTP_GET ) ? &amp;quot;GET&amp;quot; : &amp;quot;POST&amp;quot;;&lt;br /&gt;
	message += &amp;quot;\nArguments: &amp;quot;;&lt;br /&gt;
	message += server.args();&lt;br /&gt;
	message += &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	for ( uint8_t i = 0; i &amp;lt; server.args(); i++ ) {&lt;br /&gt;
		message += &amp;quot; &amp;quot; + server.argName ( i ) + &amp;quot;: &amp;quot; + server.arg ( i ) + &amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	server.send ( 404, &amp;quot;text/plain&amp;quot;, message );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup ( void ) {&lt;br /&gt;
	pinMode ( led, OUTPUT );&lt;br /&gt;
	digitalWrite ( led, 0 );&lt;br /&gt;
         &lt;br /&gt;
        pinMode(buzzer, OUTPUT);&lt;br /&gt;
        digitalWrite(buzzer, 0);&lt;br /&gt;
        &lt;br /&gt;
        pinMode(pir, INPUT);&lt;br /&gt;
&lt;br /&gt;
	Serial.begin ( 115200 );&lt;br /&gt;
	WiFi.begin ( ssid, password );&lt;br /&gt;
	Serial.println ( &amp;quot;&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	// Wait for connection&lt;br /&gt;
	while ( WiFi.status() != WL_CONNECTED ) {&lt;br /&gt;
		delay ( 500 );&lt;br /&gt;
		Serial.print ( &amp;quot;.&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	Serial.println ( &amp;quot;&amp;quot; );&lt;br /&gt;
	Serial.print ( &amp;quot;Connected to &amp;quot; );&lt;br /&gt;
	Serial.println ( ssid );&lt;br /&gt;
	Serial.print ( &amp;quot;IP address: &amp;quot; );&lt;br /&gt;
	Serial.println ( WiFi.localIP() );&lt;br /&gt;
&lt;br /&gt;
	server.on ( &amp;quot;/&amp;quot;, handleRoot );&lt;br /&gt;
        server.on(&amp;quot;/buzz&amp;quot;, handleBuzz);&lt;br /&gt;
	server.on ( &amp;quot;/hello&amp;quot;, []() {&lt;br /&gt;
		server.send ( 200, &amp;quot;text/plain&amp;quot;, &amp;quot;hi, how ya doin?&amp;quot; );&lt;br /&gt;
	} );&lt;br /&gt;
	server.onNotFound ( handleNotFound );&lt;br /&gt;
	server.begin();&lt;br /&gt;
	Serial.println ( &amp;quot;HTTP server started&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop ( void ) {&lt;br /&gt;
        &lt;br /&gt;
        if (digitalRead(pir)) {&lt;br /&gt;
          // Do something interesting on motion&lt;br /&gt;
        } else {&lt;br /&gt;
          // Nothing new here&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // LED on if motion == true&lt;br /&gt;
        digitalWrite(led, digitalRead(pir));&lt;br /&gt;
&lt;br /&gt;
	server.handleClient();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Group order 01/2015 =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prices are from the same store, and are competitive within a few cents.&lt;br /&gt;
&lt;br /&gt;
* ESP-12, Without breakout (Option A): $2.60 [http://www.aliexpress.com/store/product/Free-Shipping-10pcs-lot-ESP8266-remote-serial-Port-WIFI-wireless-module-through-walls-Wang-ESP-12/413752_32243298445.html aliex]&lt;br /&gt;
* ESP-12, with breakout board, battery socket, resistors, and power regulator (2.54mm pitch): $4.50 [http://www.aliexpress.com/item/Free-shipping-10pcs-lot-ESP8266-ESP-12-serial-WIFI-Industrial-stable-version-A-full-test-board/32260087529.html aliex]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Order Participants ===&lt;br /&gt;
Put your name, email, and quantity of With and Without breakout desired.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name&lt;br /&gt;
! Email&lt;br /&gt;
! No Breakout&lt;br /&gt;
! Breakout&lt;br /&gt;
|- &lt;br /&gt;
| Casey&lt;br /&gt;
| c1@caseyc.net&lt;br /&gt;
| 0&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| Adrian&lt;br /&gt;
| adrian@freebsd&lt;br /&gt;
| 0&lt;br /&gt;
| 5&lt;br /&gt;
|-&lt;br /&gt;
| Naomi&lt;br /&gt;
| naomi at nthmost&lt;br /&gt;
| 0&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| Dana&lt;br /&gt;
| dsniezko at sonic net&lt;br /&gt;
| 0&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| Patrick&lt;br /&gt;
| p@trickod.com&lt;br /&gt;
| 0&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| Les Jones&lt;br /&gt;
|&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| Brad&lt;br /&gt;
| brad.schwagler at gmail&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| Torrie&lt;br /&gt;
| tdfischer at hackerbots&lt;br /&gt;
| 10&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| Jake&lt;br /&gt;
| jake at spaz odt org&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| Henner&lt;br /&gt;
| h.zeller at acm.org&lt;br /&gt;
| 10&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| John E.&lt;br /&gt;
| neurofog@gmail.com&lt;br /&gt;
| 2&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| devin&lt;br /&gt;
| &amp;lt;- that at doormouse org&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| Scotty&lt;br /&gt;
| &amp;lt;- that at scottyallen com&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| Tom&lt;br /&gt;
| &amp;lt;- that at tomdee.co.uk&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| mct&lt;br /&gt;
| mct at toren dot net&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| adi&lt;br /&gt;
| adi@hexapodia.org&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| ondine&lt;br /&gt;
| okilker at gmail&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=MQTT&amp;diff=51542</id>
		<title>MQTT</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=MQTT&amp;diff=51542"/>
		<updated>2016-03-22T22:17:36Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: /* CONNECT/CONNACK */ zero byte client ident #d80&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;MQTT&#039;&#039;&#039; is a machine-to-machine (M2M)/&amp;quot;Internet of Things&amp;quot; connectivity protocol. It was designed as an extremely lightweight publish/subscribe messaging transport. It is useful for connections with remote locations where a small code footprint is required and/or network bandwidth is at a premium. For example, it has been used in sensors communicating to a broker via satellite link, over occasional dial-up connections with healthcare providers, and in a range of home automation and small device scenarios. It is also ideal for mobile applications because of its small size, low power usage, minimised data packets, and efficient distribution of information to one or many receivers ([http://mqtt.org/faq more...])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718008&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
Implementation notes of building a MQTT 3.1.1 compliant server.&lt;br /&gt;
&lt;br /&gt;
=== CONNECT/CONNACK ===&lt;br /&gt;
Create super basic server that supports a client connection.&lt;br /&gt;
&lt;br /&gt;
Create server application using a TCP/IP Socket listening to port 1883. When a connection is requested open the connection and wait for the first packet of data to be sent from the client. A timeout should be enabled to close the connection if no data is received.&lt;br /&gt;
&lt;br /&gt;
Per the specification the first data received over the new connection must be a &#039;&#039;&#039;CONNECT&#039;&#039;&#039; Control Packet. The following is the simplest possible type of connection, using a new session, and no other connection flags, keep alive, or payload data other than a 0 byte client identifier.&lt;br /&gt;
&lt;br /&gt;
On any data received from a client, read and parse the bytes, it should be structured as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONNECT Control Packet&lt;br /&gt;
&lt;br /&gt;
Byte Bits       Dec  Description&lt;br /&gt;
--------------------------------&lt;br /&gt;
0    00010000   1^   Control Packet Type&lt;br /&gt;
1    00001100   12   Packet Length&lt;br /&gt;
2    00000000   0    Protocol Name Length MSB&lt;br /&gt;
3    00000100   4    Protocol Name Length LSB&lt;br /&gt;
4    01001101   M*   Protocol Name 1st Byte&lt;br /&gt;
5    01010001   Q*   Protocol Name 2nd Byte&lt;br /&gt;
6    01010100   T*   Protocol Name 3rd Byte&lt;br /&gt;
7    01010100   T*   Protocol Name 4th Byte&lt;br /&gt;
8    00000100   4    Protocol Level&lt;br /&gt;
9    00000010   2    Connect Flags&lt;br /&gt;
10   00000000   0    Keep Alive MSB&lt;br /&gt;
11   00000000   0    Keep Alive LSB&lt;br /&gt;
12   00000000   0    Client Id Length MSB&lt;br /&gt;
13   00000000   0    Client Id Length LSB&lt;br /&gt;
&lt;br /&gt;
^First 4-bits only&lt;br /&gt;
*UTF-8 equivalent of decimal value&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first 4-bits of the packet are the Control Packet Type, here it is &amp;quot;0001&amp;quot; (1) for a &#039;&#039;&#039;CONNECT&#039;&#039;&#039;, the following 4-bits are reserved and must be &amp;quot;0000&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The next byte defines the packet length, not including the header, which makes up the first two bytes of the packet. Here it is &amp;quot;00001010&amp;quot; in binary, or (10), which indicates there are 10 more bytes in the packet. The remaining number of bytes received should be checked and equal to this number to insure data was properly received.&lt;br /&gt;
&lt;br /&gt;
The next two bytes indicate the length of the protocol name, in this case (4).&lt;br /&gt;
&lt;br /&gt;
Following that is the Protocol Name as UTF-8 encoded bytes spelling &amp;quot;MQTT&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Next is the Protocol Level which is (4) for MQTT Version 3.1.1.&lt;br /&gt;
&lt;br /&gt;
The next byte consists of six flags specifying in order the use of: Username, Password, Will Retention, Will QoS (as 2-bits) and Clean Session. The 8th and last bit is reserved and must be &amp;quot;0&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The next two bytes specify a keep alive time in seconds, when set to zero this functionality is not used, and this is the end of the variable header.&lt;br /&gt;
&lt;br /&gt;
The last two bytes specify the length of the client identifier and are the beginning and entirety of the payload.&lt;br /&gt;
&lt;br /&gt;
Upon receiving and verifying a well formed &#039;&#039;&#039;CONNECT&#039;&#039;&#039;, the server must respond with a &#039;&#039;&#039;CONNACK&#039;&#039;&#039; Control Packet. If the packet isn&#039;t processed correctly the connection must be closed, otherwise a &#039;&#039;&#039;CONNACK&#039;&#039;&#039; can be returned with a refused error message followed by closing teh connection.&lt;br /&gt;
&lt;br /&gt;
The following packet is sent from the server to the client as a &#039;&#039;&#039;CONNACK&#039;&#039;&#039; acknowledging a successful connection without error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONNACK Control Packet&lt;br /&gt;
&lt;br /&gt;
Byte Bits       Dec  Description&lt;br /&gt;
--------------------------------&lt;br /&gt;
0    00100000   2^   Control Packet Type&lt;br /&gt;
1    00000010   2    Packet Length&lt;br /&gt;
2    00000000   0    Connect Acknowledge Flags&lt;br /&gt;
3    00000000   0    Connect Response Code&lt;br /&gt;
&lt;br /&gt;
^First 4-bits only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first 4-bits of the packet are the Control Packet Type, here it is &amp;quot;0010&amp;quot; (2) for a &#039;&#039;&#039;CONNACK&#039;&#039;&#039;, the following 4-bits are reserved and must be &amp;quot;0000&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The next byte defines the remaining length of the packet &amp;quot;00000010&amp;quot; (2), this will always be the case as there is no payload for this type.&lt;br /&gt;
&lt;br /&gt;
The following byte is for flags, the fist 7-bits are reserved and always &amp;quot;0000000&amp;quot;. The last bit indicates Session Presence, since this is a &amp;quot;clean&amp;quot; session, it will be (0).&lt;br /&gt;
&lt;br /&gt;
The last byte is the response code, (0) indicates connection accepted with no errors. A value of (1-5) means it was refused, and values from (6-255) are reserved.&lt;br /&gt;
&lt;br /&gt;
The client and server have now established a active session and information can be sent to and from client and server.&lt;br /&gt;
&lt;br /&gt;
=== PINGREQ/PINGRESP ===&lt;br /&gt;
&lt;br /&gt;
With an active connection, the client can request a ping with &#039;&#039;&#039;PINGREQ&#039;&#039;&#039;, the server then responds with &#039;&#039;&#039;PINGRESP&#039;&#039;&#039;. This is used to periodically check that the connection is functioning, and can be used to avoid keep alive timeouts if there are extended periods between the sending or receiving of any other type of Control Packet.&lt;br /&gt;
&lt;br /&gt;
Packet sent from client to server initiating &#039;&#039;&#039;PINGREQ&#039;&#039;&#039; &#039;&#039;ping&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PINGREQ Control Packet&lt;br /&gt;
&lt;br /&gt;
Byte Bits       Dec  Description&lt;br /&gt;
--------------------------------&lt;br /&gt;
0    11000000   12^  Control Packet Type&lt;br /&gt;
1    00000000   0    Packet Length&lt;br /&gt;
&lt;br /&gt;
^First 4-bits only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Packet sent back to client from server &#039;&#039;&#039;PINGRESP&#039;&#039;&#039; &#039;&#039;pong&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PINGRESP Control Packet&lt;br /&gt;
&lt;br /&gt;
Byte Bits       Dec  Description&lt;br /&gt;
--------------------------------&lt;br /&gt;
0    11010000   13^  Control Packet Type&lt;br /&gt;
1    00000000   0    Packet Length&lt;br /&gt;
&lt;br /&gt;
^First 4-bits only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These packets are always two bytes, the first 4-bits being the Control Packet Type (12 or 13) and the next byte (0) indicating no additional bytes in the packet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PUBLISH ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PUBLISH&#039;&#039;&#039; can be sent from or to the server, more specifically this gives an example of publishing a Topic &amp;quot;test/message&amp;quot; with QoS (0) and no Payload.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PUBLISH Control Packet&lt;br /&gt;
&lt;br /&gt;
Byte Bits       Dec  Description&lt;br /&gt;
--------------------------------&lt;br /&gt;
0    00110000   3^   Type, DUP, QoS, RETAIN&lt;br /&gt;
1    00001110   14   Packet Length&lt;br /&gt;
2    00000000   0    Topic Length MSB&lt;br /&gt;
3    00001100   12   Topic Length LSB&lt;br /&gt;
4    01110100   t^   Topic 1st Byte&lt;br /&gt;
5    01100101   e^   Topic 2nd Byte&lt;br /&gt;
6    01110011   s^   Topic 3rd Byte&lt;br /&gt;
7    01110100   t^   Topic ...&lt;br /&gt;
8    00101111   /^         ...&lt;br /&gt;
9    01101101   m^         ...&lt;br /&gt;
10   01100101   e^         ...&lt;br /&gt;
11   01110011   s^         ...&lt;br /&gt;
12   01110011   s^         ...&lt;br /&gt;
13   01100001   a^         ...&lt;br /&gt;
14   01100111   g^         ...&lt;br /&gt;
15   01100101   e^         ...&lt;br /&gt;
&lt;br /&gt;
^First 4-bits only&lt;br /&gt;
*UTF-8 equivalent of decimal value&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the first 4-bits are the Control Packet Type &amp;quot;0011&amp;quot; (3), and the remaining 4-bits are now used for a Duplicate Flag, QoS Level (2 bits) and a Retain Flag respectively. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SUBSCRIBE ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SUBSCRIBE&#039;&#039;&#039; packets are sent from the client to the server to enable the receipt of any matching &#039;&#039;&#039;PUBLISH&#039;&#039;&#039; packets. The Filter(s) specify the Topic to match literally or with the use of wildcards. Each Filter additionally defines the maximum QoS level to use.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SUBSCRIBE Control Packet&lt;br /&gt;
&lt;br /&gt;
Byte Bits       Dec  Description&lt;br /&gt;
--------------------------------&lt;br /&gt;
0    10000010   8^   Control Packet Type&lt;br /&gt;
1    00001010   10   Packet Length&lt;br /&gt;
2    00000000   0    Packet Identifier MSB&lt;br /&gt;
3    00000000   0    Packet Identifier LSB&lt;br /&gt;
4    00000000   0    Filter Length MSB&lt;br /&gt;
5    00001100   12   Filter Length LSB&lt;br /&gt;
6    01110100   t^   Filter 1st Byte&lt;br /&gt;
7    01100101   e^   Filter 2nd Byte&lt;br /&gt;
8    01110011   s^   Filter 3rd Byte&lt;br /&gt;
9    01110100   t^   Filter ...&lt;br /&gt;
10   00101111   /^          ...&lt;br /&gt;
11   01101101   m^          ...&lt;br /&gt;
12   01100101   e^          ...&lt;br /&gt;
13   01110011   s^          ...&lt;br /&gt;
14   01110011   s^          ...&lt;br /&gt;
15   01100001   a^          ...&lt;br /&gt;
16   01100111   g^          ...&lt;br /&gt;
17   01100101   e^          ...&lt;br /&gt;
18   00000000   0    Filter QoS &lt;br /&gt;
&lt;br /&gt;
^First 4-bits only&lt;br /&gt;
*UTF-8 equivalent of decimal value&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note the first 4-bits specify the &#039;&#039;&#039;SUBSCRIBE&#039;&#039;&#039; Control Packet &amp;quot;1000&amp;quot; (8), and the following 4-bits are reserved and set to &amp;quot;0010&amp;quot;. This is followed by the Packet Length.&lt;br /&gt;
&lt;br /&gt;
Next is a series of filter(s) in a repeating sequence consisting of the first 2 bytes as a 16-bit word defining the length then the UTF-8 encoded string and a final byte defining the QoS.&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=ESP8266&amp;diff=51536</id>
		<title>ESP8266</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=ESP8266&amp;diff=51536"/>
		<updated>2016-03-22T05:45:46Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: boot&amp;#039;y boot&amp;#039;y #d00&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄ &lt;br /&gt;
▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌&lt;br /&gt;
▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀█░▌ ▀▀▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀▀▀ &lt;br /&gt;
▐░▌          ▐░▌          ▐░▌       ▐░▌▐░▌       ▐░▌          ▐░▌▐░▌          ▐░▌          &lt;br /&gt;
▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄█░▌          ▐░▌▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄▄▄ &lt;br /&gt;
▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌ ▐░░░░░░░░░▌  ▄▄▄▄▄▄▄▄▄█░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌&lt;br /&gt;
▐░█▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀█░▌▐░░░░░░░░░░░▌▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀█░▌&lt;br /&gt;
▐░▌                    ▐░▌▐░▌          ▐░▌       ▐░▌▐░█▀▀▀▀▀▀▀▀▀ ▐░▌       ▐░▌▐░▌       ▐░▌&lt;br /&gt;
▐░█▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄█░▌▐░▌          ▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄█░▌&lt;br /&gt;
▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░▌          ▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌&lt;br /&gt;
 ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀            ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀                                                                                           &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* [[ESP8266/OTA]]&lt;br /&gt;
* [[ESP8266/Blink]]&lt;br /&gt;
* [[ESP8266/WS2812]]&lt;br /&gt;
* [[ESP8266/PIR]]&lt;br /&gt;
* [[ESP8266/Temp]]&lt;br /&gt;
* [[ESP8266/Matrix]]&lt;br /&gt;
&lt;br /&gt;
* https://nurdspace.nl/ESP8266&lt;br /&gt;
* https://github.com/espressif/ESP8266_AT/wiki&lt;br /&gt;
* http://www.esp8266.com/wiki/doku.php?id=esp8266-module-family&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ESP8266 is a small, low-cost wifi-talking board. It&#039;s the new center of the Internet of Things. Originally intended as a &amp;quot;wifi modem&amp;quot;, it exposes the WiFi interface over AT-style commands.&lt;br /&gt;
&lt;br /&gt;
Some hackers immediately noticed there is a general-purpose microcontroller on the box, and made a firmware for it that takes Lua programs. Now you don&#039;t need another microcontroller. Sweet!&lt;br /&gt;
&lt;br /&gt;
Several additional community efforts have also been initiated and are generally discussed at http://esp8266.com one of the newer developmentss is the addition of integrated support in the Arduino IDE, further details follow in the &#039;&#039;Software&#039;&#039; section below.&lt;br /&gt;
&lt;br /&gt;
== Boot Modes ==&lt;br /&gt;
&lt;br /&gt;
To load new firmware, connect GPIO0 to ground, and momentarily connect RESET to ground, or cycle the power. You can then disconnect GPIO0 and program the chip over Serial with 115,200 baud. Then reset or power cycle after the firmware upload completes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reset causes:&lt;br /&gt;
        0: &lt;br /&gt;
        1: normal boot&lt;br /&gt;
        2: reset pin&lt;br /&gt;
        3: software reset&lt;br /&gt;
        4: watchdog reset&lt;br /&gt;
&lt;br /&gt;
    boot device:&lt;br /&gt;
        0:&lt;br /&gt;
        1: ram&lt;br /&gt;
        3: flash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
For full specs, see [https://nurdspace.nl/ESP8266]. Important facts:&lt;br /&gt;
* 3.3v *only* - 5v will let out the majikul smoke&lt;br /&gt;
* Some reports say 1A current draw, others say 250 mA&lt;br /&gt;
* Talks 802.1n, supports most major auth types.&lt;br /&gt;
&lt;br /&gt;
There are a number of ESP8266 hardware versions. The ones of interest are:&lt;br /&gt;
&lt;br /&gt;
* ESP-01: 8 pins (basically one I/O plus power, etc.). Breadboard friendly 2x4 header (2.54mm), but not useful standalone&lt;br /&gt;
* ESP-12: 16 pins (I/O, power, 9 GPIO). Non-breadboard friendly: 2mm pin spacing&lt;br /&gt;
* ESP-12e: 22 pins, same as ESP-12, with an additional 6 pins on the back edge adding 1 I/O and SPI connections&lt;br /&gt;
&lt;br /&gt;
=== Sources ===&lt;br /&gt;
&lt;br /&gt;
Most modules are available from this ebay store http://stores.ebay.com/tomyuen007/ for $3 and up, ships from US, generally less than a week for delivery.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== Arduino IDE ===&lt;br /&gt;
&lt;br /&gt;
Enhancements to the Arduino IDE in versions 1.6.4 and later have enabled support for the esp8266 and the ability to upload new firmware. Version 1.6.5 r5 or later is recommended.&lt;br /&gt;
&lt;br /&gt;
The current version of the IDE can be downloaded from https://www.arduino.cc/en/Main/Software&lt;br /&gt;
&lt;br /&gt;
Two additional steps are required to add esp8266 support to the Arduino IDE&lt;br /&gt;
# Open the preferences menu in the Arduino IDE and add &amp;lt;code&amp;gt;http://arduino.esp8266.com/stable/package_esp8266com_index.json&amp;lt;/code&amp;gt; into &amp;quot;Additional Board Manager URLs&amp;quot; field&lt;br /&gt;
# Open Boards Manager from &amp;quot;Tools &amp;gt; Board: ______ &amp;gt; Boards Manager...&amp;quot; menu, scroll down to esp8266, click to select it and then click the install button.&lt;br /&gt;
&lt;br /&gt;
Details about esp8266 support can be found at https://github.com/esp8266/Arduino&lt;br /&gt;
&lt;br /&gt;
Once it downloads you&#039;ll see &amp;quot;ESP8266 Modules&amp;quot; section added to the list of target boards under &amp;quot;Tools &amp;gt; Board: ______&amp;gt;&amp;quot;. You can use the &amp;quot;Generic ESP8266 Module&amp;quot; option for programming ESP-## modules using a 3.3v USB-Serial connector.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll need a USB to Serial cable/dongle for programming the board, connecting Ground/Rx/Tx. If you&#039;re using the cheap USB dongles, like the AI branded ones using a CH340G chip, you may also need to install the drivers.&lt;br /&gt;
&lt;br /&gt;
* http://www.wch.cn/download/CH341SER_ZIP.html (Windows)&lt;br /&gt;
* http://www.wch.cn/download/CH341SER_MAC_ZIP.html (Mac)&lt;br /&gt;
* http://www.wch.cn/download/CH341SER_LINUX_ZIP.html (Linux)&lt;br /&gt;
&lt;br /&gt;
In order to enable the ESP8266 to accept new firmware, temporarily connect GPIO0 to ground, and cycle the power.&lt;br /&gt;
&lt;br /&gt;
=== LUA ===&lt;br /&gt;
There are a wide variety of firmware builds available for the chip. Of interest is the software [http://nodemcu.com/index_en.html NodeMCU], which turns the serial port in to a Lua REPL. [[User:Yesac|Yesac]] is working on an [https://github.com/squeed/nodemcu-env environment] within NodeMCU for doing TFTP and some other junk.&lt;br /&gt;
&lt;br /&gt;
Uploading firmware is easy with [https://github.com/themadinventor/esptool esptool]&lt;br /&gt;
&lt;br /&gt;
= Projects =&lt;br /&gt;
&lt;br /&gt;
== IoT X&#039;ample ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Breadboarded multi-function device using ESP-12 module, PIR sensor, buzzer, indicator LEDs and light sensor.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
See additional PIR info [[ESP8266/PIR]]&lt;br /&gt;
&lt;br /&gt;
[[File:BoardRoom_bb.png|800px]]&lt;br /&gt;
&lt;br /&gt;
The following code can be used on the above diagrammed hardware. Using a web browser the ESP8266 will respond the following url requests&lt;br /&gt;
* http://xxx.xxx.xxx.xxx/ (Displays current status, motion and light level)&lt;br /&gt;
* http://xxx.xxx.xxx.xxx/buzz (Triggers the buzzer to make a noise)&lt;br /&gt;
* http://xxx.xxx.xxx.xxx/hello (Returns a simple hello message)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
   AS IS NO GUARANTEE NO WARRANTY&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClient.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266mDNS.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const char *ssid = &amp;quot;YourWiFi&amp;quot;;&lt;br /&gt;
const char *password = &amp;quot;WiFiPassword&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
ESP8266WebServer server ( 80 );&lt;br /&gt;
&lt;br /&gt;
const int pir = 4;&lt;br /&gt;
const int led = 14;&lt;br /&gt;
const int buzzer = 12;&lt;br /&gt;
&lt;br /&gt;
void handleRoot() {&lt;br /&gt;
	&lt;br /&gt;
	char temp[400];&lt;br /&gt;
	int sec = millis() / 1000;&lt;br /&gt;
	int min = sec / 60;&lt;br /&gt;
	int hr = min / 60;&lt;br /&gt;
&lt;br /&gt;
	snprintf ( temp, 400,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;html&amp;gt;\&lt;br /&gt;
  &amp;lt;head&amp;gt;\&lt;br /&gt;
    &amp;lt;title&amp;gt;PIR Demo&amp;lt;/title&amp;gt;\&lt;br /&gt;
    &amp;lt;style&amp;gt;\&lt;br /&gt;
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\&lt;br /&gt;
    &amp;lt;/style&amp;gt;\&lt;br /&gt;
  &amp;lt;/head&amp;gt;\&lt;br /&gt;
  &amp;lt;body&amp;gt;\&lt;br /&gt;
    &amp;lt;h1&amp;gt;Hello from ESP8266 PIR!&amp;lt;/h1&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Uptime: %02d:%02d:%02d&amp;lt;/p&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Motion: %s&amp;lt;/p&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Ambient: %d%&amp;lt;/p&amp;gt;\&lt;br /&gt;
  &amp;lt;/body&amp;gt;\&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		hr, min % 60, sec % 60, digitalRead(pir)?&amp;quot;true&amp;quot;:&amp;quot;false&amp;quot;, round(analogRead(A0)/10.24)&lt;br /&gt;
	);&lt;br /&gt;
	server.send ( 200, &amp;quot;text/html&amp;quot;, temp );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handleBuzz() {&lt;br /&gt;
  	&lt;br /&gt;
	char temp[400];&lt;br /&gt;
	int sec = millis() / 1000;&lt;br /&gt;
	int min = sec / 60;&lt;br /&gt;
	int hr = min / 60;&lt;br /&gt;
&lt;br /&gt;
	snprintf ( temp, 400,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;html&amp;gt;\&lt;br /&gt;
  &amp;lt;head&amp;gt;\&lt;br /&gt;
    &amp;lt;title&amp;gt;BUZZ!!!&amp;lt;/title&amp;gt;\&lt;br /&gt;
    &amp;lt;style&amp;gt;\&lt;br /&gt;
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #ff0000; }\&lt;br /&gt;
    &amp;lt;/style&amp;gt;\&lt;br /&gt;
  &amp;lt;/head&amp;gt;\&lt;br /&gt;
  &amp;lt;body&amp;gt;\&lt;br /&gt;
    &amp;lt;h1&amp;gt;BUZZ!!!&amp;lt;/h1&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Uptime: %02d:%02d:%02d&amp;lt;/p&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Motion: %s&amp;lt;/p&amp;gt;\&lt;br /&gt;
  &amp;lt;/body&amp;gt;\&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		hr, min % 60, sec % 60, digitalRead(pir)?&amp;quot;true&amp;quot;:&amp;quot;false&amp;quot;&lt;br /&gt;
	);&lt;br /&gt;
	server.send ( 200, &amp;quot;text/html&amp;quot;, temp );&lt;br /&gt;
&lt;br /&gt;
        digitalWrite(buzzer, HIGH);&lt;br /&gt;
        delay(300);&lt;br /&gt;
        digitalWrite(buzzer, LOW);&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
void handleNotFound() {&lt;br /&gt;
	String message = &amp;quot;File Not Found\n\n&amp;quot;;&lt;br /&gt;
	message += &amp;quot;URI: &amp;quot;;&lt;br /&gt;
	message += server.uri();&lt;br /&gt;
	message += &amp;quot;\nMethod: &amp;quot;;&lt;br /&gt;
	message += ( server.method() == HTTP_GET ) ? &amp;quot;GET&amp;quot; : &amp;quot;POST&amp;quot;;&lt;br /&gt;
	message += &amp;quot;\nArguments: &amp;quot;;&lt;br /&gt;
	message += server.args();&lt;br /&gt;
	message += &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	for ( uint8_t i = 0; i &amp;lt; server.args(); i++ ) {&lt;br /&gt;
		message += &amp;quot; &amp;quot; + server.argName ( i ) + &amp;quot;: &amp;quot; + server.arg ( i ) + &amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	server.send ( 404, &amp;quot;text/plain&amp;quot;, message );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup ( void ) {&lt;br /&gt;
	pinMode ( led, OUTPUT );&lt;br /&gt;
	digitalWrite ( led, 0 );&lt;br /&gt;
         &lt;br /&gt;
        pinMode(buzzer, OUTPUT);&lt;br /&gt;
        digitalWrite(buzzer, 0);&lt;br /&gt;
        &lt;br /&gt;
        pinMode(pir, INPUT);&lt;br /&gt;
&lt;br /&gt;
	Serial.begin ( 115200 );&lt;br /&gt;
	WiFi.begin ( ssid, password );&lt;br /&gt;
	Serial.println ( &amp;quot;&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	// Wait for connection&lt;br /&gt;
	while ( WiFi.status() != WL_CONNECTED ) {&lt;br /&gt;
		delay ( 500 );&lt;br /&gt;
		Serial.print ( &amp;quot;.&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	Serial.println ( &amp;quot;&amp;quot; );&lt;br /&gt;
	Serial.print ( &amp;quot;Connected to &amp;quot; );&lt;br /&gt;
	Serial.println ( ssid );&lt;br /&gt;
	Serial.print ( &amp;quot;IP address: &amp;quot; );&lt;br /&gt;
	Serial.println ( WiFi.localIP() );&lt;br /&gt;
&lt;br /&gt;
	server.on ( &amp;quot;/&amp;quot;, handleRoot );&lt;br /&gt;
        server.on(&amp;quot;/buzz&amp;quot;, handleBuzz);&lt;br /&gt;
	server.on ( &amp;quot;/hello&amp;quot;, []() {&lt;br /&gt;
		server.send ( 200, &amp;quot;text/plain&amp;quot;, &amp;quot;hi, how ya doin?&amp;quot; );&lt;br /&gt;
	} );&lt;br /&gt;
	server.onNotFound ( handleNotFound );&lt;br /&gt;
	server.begin();&lt;br /&gt;
	Serial.println ( &amp;quot;HTTP server started&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop ( void ) {&lt;br /&gt;
        &lt;br /&gt;
        if (digitalRead(pir)) {&lt;br /&gt;
          // Do something interesting on motion&lt;br /&gt;
        } else {&lt;br /&gt;
          // Nothing new here&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // LED on if motion == true&lt;br /&gt;
        digitalWrite(led, digitalRead(pir));&lt;br /&gt;
&lt;br /&gt;
	server.handleClient();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Group order 01/2015 =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prices are from the same store, and are competitive within a few cents.&lt;br /&gt;
&lt;br /&gt;
* ESP-12, Without breakout (Option A): $2.60 [http://www.aliexpress.com/store/product/Free-Shipping-10pcs-lot-ESP8266-remote-serial-Port-WIFI-wireless-module-through-walls-Wang-ESP-12/413752_32243298445.html aliex]&lt;br /&gt;
* ESP-12, with breakout board, battery socket, resistors, and power regulator (2.54mm pitch): $4.50 [http://www.aliexpress.com/item/Free-shipping-10pcs-lot-ESP8266-ESP-12-serial-WIFI-Industrial-stable-version-A-full-test-board/32260087529.html aliex]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Order Participants ===&lt;br /&gt;
Put your name, email, and quantity of With and Without breakout desired.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name&lt;br /&gt;
! Email&lt;br /&gt;
! No Breakout&lt;br /&gt;
! Breakout&lt;br /&gt;
|- &lt;br /&gt;
| Casey&lt;br /&gt;
| c1@caseyc.net&lt;br /&gt;
| 0&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| Adrian&lt;br /&gt;
| adrian@freebsd&lt;br /&gt;
| 0&lt;br /&gt;
| 5&lt;br /&gt;
|-&lt;br /&gt;
| Naomi&lt;br /&gt;
| naomi at nthmost&lt;br /&gt;
| 0&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| Dana&lt;br /&gt;
| dsniezko at sonic net&lt;br /&gt;
| 0&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| Patrick&lt;br /&gt;
| p@trickod.com&lt;br /&gt;
| 0&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| Les Jones&lt;br /&gt;
|&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| Brad&lt;br /&gt;
| brad.schwagler at gmail&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| Torrie&lt;br /&gt;
| tdfischer at hackerbots&lt;br /&gt;
| 10&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| Jake&lt;br /&gt;
| jake at spaz odt org&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| Henner&lt;br /&gt;
| h.zeller at acm.org&lt;br /&gt;
| 10&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| John E.&lt;br /&gt;
| neurofog@gmail.com&lt;br /&gt;
| 2&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| devin&lt;br /&gt;
| &amp;lt;- that at doormouse org&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| Scotty&lt;br /&gt;
| &amp;lt;- that at scottyallen com&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| Tom&lt;br /&gt;
| &amp;lt;- that at tomdee.co.uk&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| mct&lt;br /&gt;
| mct at toren dot net&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| adi&lt;br /&gt;
| adi@hexapodia.org&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| ondine&lt;br /&gt;
| okilker at gmail&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=MQTT&amp;diff=51459</id>
		<title>MQTT</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=MQTT&amp;diff=51459"/>
		<updated>2016-03-16T02:24:11Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: /* Server */ PUBLISH/SUBSCRIBE #cheezeburgers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;MQTT&#039;&#039;&#039; is a machine-to-machine (M2M)/&amp;quot;Internet of Things&amp;quot; connectivity protocol. It was designed as an extremely lightweight publish/subscribe messaging transport. It is useful for connections with remote locations where a small code footprint is required and/or network bandwidth is at a premium. For example, it has been used in sensors communicating to a broker via satellite link, over occasional dial-up connections with healthcare providers, and in a range of home automation and small device scenarios. It is also ideal for mobile applications because of its small size, low power usage, minimised data packets, and efficient distribution of information to one or many receivers ([http://mqtt.org/faq more...])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718008&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
Implementation notes of building a MQTT 3.1.1 compliant server.&lt;br /&gt;
&lt;br /&gt;
=== CONNECT/CONNACK ===&lt;br /&gt;
Create super basic server that supports a client connection.&lt;br /&gt;
&lt;br /&gt;
Create server application using a TCP/IP Socket listening to port 1883. When a connection is requested open the connection and wait for the first packet of data to be sent from the client. A timeout should be enabled to close the connection if no data is received.&lt;br /&gt;
&lt;br /&gt;
Per the specification the first data received over the new connection must be a &#039;&#039;&#039;CONNECT&#039;&#039;&#039; Control Packet. The following is the simplest possible type of connection, using a new session, and no other connection flags, keep alive, or payload.&lt;br /&gt;
&lt;br /&gt;
On any data received from a client, read and parse the bytes, it should be structured as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONNECT Control Packet&lt;br /&gt;
&lt;br /&gt;
Byte Bits       Dec  Description&lt;br /&gt;
--------------------------------&lt;br /&gt;
0    00010000   1^   Control Packet Type&lt;br /&gt;
1    00001010   10   Packet Length&lt;br /&gt;
2    00000000   0    Protocol Name Length MSB&lt;br /&gt;
3    00000100   4    Protocol Name Length LSB&lt;br /&gt;
4    01001101   M*   Protocol Name 1st Byte&lt;br /&gt;
5    01010001   Q*   Protocol Name 2nd Byte&lt;br /&gt;
6    01010100   T*   Protocol Name 3rd Byte&lt;br /&gt;
7    01010100   T*   Protocol Name 4th Byte&lt;br /&gt;
8    00000100   4    Protocol Level&lt;br /&gt;
9    00000010   2    Connect Flags&lt;br /&gt;
10   00000000   0    Keep Alive MSB&lt;br /&gt;
11   00000000   0    Keep Alive LSB&lt;br /&gt;
&lt;br /&gt;
^First 4-bits only&lt;br /&gt;
*UTF-8 equivalent of decimal value&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first 4-bits of the packet are the Control Packet Type, here it is &amp;quot;0001&amp;quot; (1) for a &#039;&#039;&#039;CONNECT&#039;&#039;&#039;, the following 4-bits are reserved and must be &amp;quot;0000&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The next byte defines the packet length, not including the header, which makes up the first two bytes of the packet. Here it is &amp;quot;00001010&amp;quot; in binary, or (10), which indicates there are 10 more bytes in the packet. The remaining number of bytes received should be checked and equal to this number to insure data was properly received.&lt;br /&gt;
&lt;br /&gt;
The next two bytes indicate the length of the protocol name, in this case (4).&lt;br /&gt;
&lt;br /&gt;
Following that is the Protocol Name as UTF-8 encoded bytes spelling &amp;quot;MQTT&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Next is the Protocol Level which is (4) for MQTT Version 3.1.1.&lt;br /&gt;
&lt;br /&gt;
The next byte consists of six flags specifying in order the use of: Username, Password, Will Retention, Will QoS (as 2-bits) and Clean Session. The 8th and last bit is reserved and must be &amp;quot;0&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The last two bytes specify a keep alive time in seconds, when set to zero this functionality is not used.&lt;br /&gt;
&lt;br /&gt;
Upon receiving and verifying a well formed &#039;&#039;&#039;CONNECT&#039;&#039;&#039;, the server must respond with a &#039;&#039;&#039;CONNACK&#039;&#039;&#039; Control Packet. If the packet isn&#039;t processed correctly the connection must be closed, otherwise a &#039;&#039;&#039;CONNACK&#039;&#039;&#039; can be returned with a refused error message followed by closing teh connection.&lt;br /&gt;
&lt;br /&gt;
The following packet is sent from the server to the client as a &#039;&#039;&#039;CONNACK&#039;&#039;&#039; acknowledging a successful connection without error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONNACK Control Packet&lt;br /&gt;
&lt;br /&gt;
Byte Bits       Dec  Description&lt;br /&gt;
--------------------------------&lt;br /&gt;
0    00100000   2^   Control Packet Type&lt;br /&gt;
1    00000010   2    Packet Length&lt;br /&gt;
2    00000000   0    Connect Acknowledge Flags&lt;br /&gt;
3    00000000   0    Connect Response Code&lt;br /&gt;
&lt;br /&gt;
^First 4-bits only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first 4-bits of the packet are the Control Packet Type, here it is &amp;quot;0010&amp;quot; (2) for a &#039;&#039;&#039;CONNACK&#039;&#039;&#039;, the following 4-bits are reserved and must be &amp;quot;0000&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The next byte defines the remaining length of the packet &amp;quot;00000010&amp;quot; (2), this will always be the case as there is no payload for this type.&lt;br /&gt;
&lt;br /&gt;
The following byte is for flags, the fist 7-bits are reserved and always &amp;quot;0000000&amp;quot;. The last bit indicates Session Presence, since this is a &amp;quot;clean&amp;quot; session, it will be (0).&lt;br /&gt;
&lt;br /&gt;
The last byte is the response code, (0) indicates connection accepted with no errors. A value of (1-5) means it was refused, and values from (6-255) are reserved.&lt;br /&gt;
&lt;br /&gt;
The client and server have now established a active session and information can be sent to and from client and server.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PINGREQ/PINGRESP ===&lt;br /&gt;
&lt;br /&gt;
With an active connection, the client can request a ping with &#039;&#039;&#039;PINGREQ&#039;&#039;&#039;, the server then responds with &#039;&#039;&#039;PINGRESP&#039;&#039;&#039;. This is used to periodically check that the connection is functioning, and can be used to avoid keep alive timeouts if there are extended periods between the sending or receiving of any other type of Control Packet.&lt;br /&gt;
&lt;br /&gt;
Packet sent from client to server initiating &#039;&#039;&#039;PINGREQ&#039;&#039;&#039; &#039;&#039;ping&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PINGREQ Control Packet&lt;br /&gt;
&lt;br /&gt;
Byte Bits       Dec  Description&lt;br /&gt;
--------------------------------&lt;br /&gt;
0    11000000   12^  Control Packet Type&lt;br /&gt;
1    00000000   0    Packet Length&lt;br /&gt;
&lt;br /&gt;
^First 4-bits only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Packet sent back to client from server &#039;&#039;&#039;PINGRESP&#039;&#039;&#039; &#039;&#039;pong&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PINGRESP Control Packet&lt;br /&gt;
&lt;br /&gt;
Byte Bits       Dec  Description&lt;br /&gt;
--------------------------------&lt;br /&gt;
0    11010000   13^  Control Packet Type&lt;br /&gt;
1    00000000   0    Packet Length&lt;br /&gt;
&lt;br /&gt;
^First 4-bits only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These packets are always two bytes, the first 4-bits being the Control Packet Type (12 or 13) and the next byte (0) indicating no additional bytes in the packet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PUBLISH ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PUBLISH&#039;&#039;&#039; can be sent from or to the server, more specifically this gives an example of publishing a Topic &amp;quot;test/message&amp;quot; with QoS (0) and no Payload.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PUBLISH Control Packet&lt;br /&gt;
&lt;br /&gt;
Byte Bits       Dec  Description&lt;br /&gt;
--------------------------------&lt;br /&gt;
0    00110000   3^   Type, DUP, QoS, RETAIN&lt;br /&gt;
1    00001110   14   Packet Length&lt;br /&gt;
2    00000000   0    Topic Length MSB&lt;br /&gt;
3    00001100   12   Topic Length LSB&lt;br /&gt;
4    01110100   t^   Topic 1st Byte&lt;br /&gt;
5    01100101   e^   Topic 2nd Byte&lt;br /&gt;
6    01110011   s^   Topic 3rd Byte&lt;br /&gt;
7    01110100   t^   Topic ...&lt;br /&gt;
8    00101111   /^         ...&lt;br /&gt;
9    01101101   m^         ...&lt;br /&gt;
10   01100101   e^         ...&lt;br /&gt;
11   01110011   s^         ...&lt;br /&gt;
12   01110011   s^         ...&lt;br /&gt;
13   01100001   a^         ...&lt;br /&gt;
14   01100111   g^         ...&lt;br /&gt;
15   01100101   e^         ...&lt;br /&gt;
&lt;br /&gt;
^First 4-bits only&lt;br /&gt;
*UTF-8 equivalent of decimal value&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the first 4-bits are the Control Packet Type &amp;quot;0011&amp;quot; (3), and the remaining 4-bits are now used for a Duplicate Flag, QoS Level (2 bits) and a Retain Flag respectively. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SUBSCRIBE ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SUBSCRIBE&#039;&#039;&#039; packets are sent from the client to the server to enable the receipt of any matching &#039;&#039;&#039;PUBLISH&#039;&#039;&#039; packets. The Filter(s) specify the Topic to match literally or with the use of wildcards. Each Filter additionally defines the maximum QoS level to use.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SUBSCRIBE Control Packet&lt;br /&gt;
&lt;br /&gt;
Byte Bits       Dec  Description&lt;br /&gt;
--------------------------------&lt;br /&gt;
0    10000010   8^   Control Packet Type&lt;br /&gt;
1    00001010   10   Packet Length&lt;br /&gt;
2    00000000   0    Packet Identifier MSB&lt;br /&gt;
3    00000000   0    Packet Identifier LSB&lt;br /&gt;
4    00000000   0    Filter Length MSB&lt;br /&gt;
5    00001100   12   Filter Length LSB&lt;br /&gt;
6    01110100   t^   Filter 1st Byte&lt;br /&gt;
7    01100101   e^   Filter 2nd Byte&lt;br /&gt;
8    01110011   s^   Filter 3rd Byte&lt;br /&gt;
9    01110100   t^   Filter ...&lt;br /&gt;
10   00101111   /^          ...&lt;br /&gt;
11   01101101   m^          ...&lt;br /&gt;
12   01100101   e^          ...&lt;br /&gt;
13   01110011   s^          ...&lt;br /&gt;
14   01110011   s^          ...&lt;br /&gt;
15   01100001   a^          ...&lt;br /&gt;
16   01100111   g^          ...&lt;br /&gt;
17   01100101   e^          ...&lt;br /&gt;
18   00000000   0    Filter QoS &lt;br /&gt;
&lt;br /&gt;
^First 4-bits only&lt;br /&gt;
*UTF-8 equivalent of decimal value&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note the first 4-bits specify the &#039;&#039;&#039;SUBSCRIBE&#039;&#039;&#039; Control Packet &amp;quot;1000&amp;quot; (8), and the following 4-bits are reserved and set to &amp;quot;0010&amp;quot;. This is followed by the Packet Length.&lt;br /&gt;
&lt;br /&gt;
Next is a series of filter(s) in a repeating sequence consisting of the first 2 bytes as a 16-bit word defining the length then the UTF-8 encoded string and a final byte defining the QoS.&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=MQTT&amp;diff=51457</id>
		<title>MQTT</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=MQTT&amp;diff=51457"/>
		<updated>2016-03-15T22:38:51Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: /* Server */ Packets now with ping/pong #f90&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;MQTT&#039;&#039;&#039; is a machine-to-machine (M2M)/&amp;quot;Internet of Things&amp;quot; connectivity protocol. It was designed as an extremely lightweight publish/subscribe messaging transport. It is useful for connections with remote locations where a small code footprint is required and/or network bandwidth is at a premium. For example, it has been used in sensors communicating to a broker via satellite link, over occasional dial-up connections with healthcare providers, and in a range of home automation and small device scenarios. It is also ideal for mobile applications because of its small size, low power usage, minimised data packets, and efficient distribution of information to one or many receivers ([http://mqtt.org/faq more...])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718008&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
Implementation notes of building a MQTT 3.1.1 compliant server.&lt;br /&gt;
&lt;br /&gt;
=== CONNECT/CONNACK ===&lt;br /&gt;
Create super basic server that supports a client connection.&lt;br /&gt;
&lt;br /&gt;
Create server application using a TCP/IP Socket listening to port 1883. When a connection is requested open the connection and wait for the first packet of data to be sent from the client. A timeout should be enabled to close the connection if no data is received.&lt;br /&gt;
&lt;br /&gt;
Per the specification the first data received over the new connection must be a &#039;&#039;&#039;CONNECT&#039;&#039;&#039; Control Packet. The following is the simplest possible type of connection, using a new session, and no other connection flags, keep alive, or payload.&lt;br /&gt;
&lt;br /&gt;
On any data received from a client, read and parse the bytes, it should be structured as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONNECT Control Packet&lt;br /&gt;
&lt;br /&gt;
Byte Bits       Dec  Description&lt;br /&gt;
--------------------------------&lt;br /&gt;
0    00010000   1^   Control Packet Type&lt;br /&gt;
1    00001010   10   Packet Length&lt;br /&gt;
2    00000000   0    Protocol Name Length MSB&lt;br /&gt;
3    00000100   4    Protocol Name Length LSB&lt;br /&gt;
4    01001101   M*   Protocol Name 1st Byte&lt;br /&gt;
5    01010001   Q*   Protocol Name 2nd Byte&lt;br /&gt;
6    01010100   T*   Protocol Name 3rd Byte&lt;br /&gt;
7    01010100   T*   Protocol Name 4th Byte&lt;br /&gt;
8    00000100   4    Protocol Level&lt;br /&gt;
9    00000010   2    Connect Flags&lt;br /&gt;
10   00000000   0    Keep Alive MSB&lt;br /&gt;
11   00000000   0    Keep Alive LSB&lt;br /&gt;
&lt;br /&gt;
^First 4-bits only&lt;br /&gt;
*UTF-8 equivalent of decimal value&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first 4-bits of the packet are the Control Packet Type, here it is &amp;quot;0001&amp;quot; (1) for a &#039;&#039;&#039;CONNECT&#039;&#039;&#039;, the following 4-bits are reserved and must be &amp;quot;0000&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The next byte defines the packet length, not including the header, which makes up the first two bytes of the packet. Here it is &amp;quot;00001010&amp;quot; in binary, or (10), which indicates there are 10 more bytes in the packet. The remaining number of bytes received should be checked and equal to this number to insure data was properly received.&lt;br /&gt;
&lt;br /&gt;
The next two bytes indicate the length of the protocol name, in this case (4).&lt;br /&gt;
&lt;br /&gt;
Following that is the Protocol Name as UTF-8 encoded bytes spelling &amp;quot;MQTT&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Next is the Protocol Level which is (4) for MQTT Version 3.1.1.&lt;br /&gt;
&lt;br /&gt;
The next byte consists of six flags specifying in order the use of: Username, Password, Will Retention, Will QoS (as 2-bits) and Clean Session. The 8th and last bit is reserved and must be &amp;quot;0&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The last two bytes specify a keep alive time in seconds, when set to zero this functionality is not used.&lt;br /&gt;
&lt;br /&gt;
Upon receiving and verifying a well formed &#039;&#039;&#039;CONNECT&#039;&#039;&#039;, the server must respond with a &#039;&#039;&#039;CONNACK&#039;&#039;&#039; Control Packet. If the packet isn&#039;t processed correctly the connection must be closed, otherwise a &#039;&#039;&#039;CONNACK&#039;&#039;&#039; can be returned with a refused error message followed by closing teh connection.&lt;br /&gt;
&lt;br /&gt;
The following packet is sent from the server to the client as a &#039;&#039;&#039;CONNACK&#039;&#039;&#039; acknowledging a successful connection without error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONNACK Control Packet&lt;br /&gt;
&lt;br /&gt;
Byte Bits       Dec  Description&lt;br /&gt;
--------------------------------&lt;br /&gt;
0    00100000   2^   Control Packet Type&lt;br /&gt;
1    00000010   2    Packet Length&lt;br /&gt;
2    00000000   0    Connect Acknowledge Flags&lt;br /&gt;
3    00000000   0    Connect Response Code&lt;br /&gt;
&lt;br /&gt;
^First 4-bits only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first 4-bits of the packet are the Control Packet Type, here it is &amp;quot;0010&amp;quot; (2) for a &#039;&#039;&#039;CONNACK&#039;&#039;&#039;, the following 4-bits are reserved and must be &amp;quot;0000&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The next byte defines the remaining length of the packet &amp;quot;00000010&amp;quot; (2), this will always be the case as there is no payload for this type.&lt;br /&gt;
&lt;br /&gt;
The following byte is for flags, the fist 7-bits are reserved and always &amp;quot;0000000&amp;quot;. The last bit indicates Session Presence, since this is a &amp;quot;clean&amp;quot; session, it will be (0).&lt;br /&gt;
&lt;br /&gt;
The last byte is the response code, (0) indicates connection accepted with no errors. A value of (1-5) means it was refused, and values from (6-255) are reserved.&lt;br /&gt;
&lt;br /&gt;
The client and server have now established a active session and information can be sent to and from client and server.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PINGREQ/PINGRESP ===&lt;br /&gt;
&lt;br /&gt;
With an active connection, the client can request a ping with &#039;&#039;&#039;PINGREQ&#039;&#039;&#039;, the server then responds with &#039;&#039;&#039;PINGRESP&#039;&#039;&#039;. This is used to periodically check that the connection is functioning, and can be used to avoid keep alive timeouts if there are extended periods between the sending or receiving of any other type of Control Packet.&lt;br /&gt;
&lt;br /&gt;
Packet sent from client to server initiating &#039;&#039;&#039;PINGREQ&#039;&#039;&#039; &#039;&#039;ping&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PINGREQ Control Packet&lt;br /&gt;
&lt;br /&gt;
Byte Bits       Dec  Description&lt;br /&gt;
--------------------------------&lt;br /&gt;
0    11000000   12^  Control Packet Type&lt;br /&gt;
1    00000000   0    Packet Length&lt;br /&gt;
&lt;br /&gt;
^First 4-bits only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Packet sent back to client from server &#039;&#039;&#039;PINGRESP&#039;&#039;&#039; &#039;&#039;pong&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PINGRESP Control Packet&lt;br /&gt;
&lt;br /&gt;
Byte Bits       Dec  Description&lt;br /&gt;
--------------------------------&lt;br /&gt;
0    11010000   13^  Control Packet Type&lt;br /&gt;
1    00000000   0    Packet Length&lt;br /&gt;
&lt;br /&gt;
^First 4-bits only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These packets are always two bytes, the first 4-bits being the Control Packet Type (12 or 13) and the next byte (0) indicating no additional bytes in the packet.&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=MQTT&amp;diff=51456</id>
		<title>MQTT</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=MQTT&amp;diff=51456"/>
		<updated>2016-03-15T22:27:06Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: /* CONNECT/CONNACK */ #f90&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;MQTT&#039;&#039;&#039; is a machine-to-machine (M2M)/&amp;quot;Internet of Things&amp;quot; connectivity protocol. It was designed as an extremely lightweight publish/subscribe messaging transport. It is useful for connections with remote locations where a small code footprint is required and/or network bandwidth is at a premium. For example, it has been used in sensors communicating to a broker via satellite link, over occasional dial-up connections with healthcare providers, and in a range of home automation and small device scenarios. It is also ideal for mobile applications because of its small size, low power usage, minimised data packets, and efficient distribution of information to one or many receivers ([http://mqtt.org/faq more...])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718008&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
Implementation notes of building a MQTT 3.1.1 compliant server.&lt;br /&gt;
&lt;br /&gt;
=== CONNECT/CONNACK ===&lt;br /&gt;
Create super basic server that supports a client connection.&lt;br /&gt;
&lt;br /&gt;
Create server application using a TCP/IP Socket listening to port 1883. When a connection is requested open the connection and wait for the first packet of data to be sent from the client. A timeout should be enabled to close the connection if no data is received.&lt;br /&gt;
&lt;br /&gt;
Per the specification the first data received over the new connection must be a &#039;&#039;&#039;CONNECT&#039;&#039;&#039; Control Packet. The following is the simplest possible type of connection, using a new session, and no other connection flags, keep alive, or payload.&lt;br /&gt;
&lt;br /&gt;
On any data received from a client, read and parse the bytes, it should be structured as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONNECT Control Packet&lt;br /&gt;
&lt;br /&gt;
Byte Bits       Dec  Description&lt;br /&gt;
--------------------------------&lt;br /&gt;
0    00010000   16   Control Packet Type&lt;br /&gt;
1    00001010   10   Packet Length&lt;br /&gt;
2    00000000   0    Protocol Name Length MSB&lt;br /&gt;
3    00000100   4    Protocol Name Length LSB&lt;br /&gt;
4    01001101   M*   Protocol Name 1st Byte&lt;br /&gt;
5    01010001   Q*   Protocol Name 2nd Byte&lt;br /&gt;
6    01010100   T*   Protocol Name 3rd Byte&lt;br /&gt;
7    01010100   T*   Protocol Name 4th Byte&lt;br /&gt;
8    00000100   4    Protocol Level&lt;br /&gt;
9    00000010   2    Connect Flags&lt;br /&gt;
10   00000000   0    Keep Alive MSB&lt;br /&gt;
11   00000000   0    Keep Alive LSB&lt;br /&gt;
&lt;br /&gt;
*UTF-8 equivalent of decimal value&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first 4-bits of the packet are the Control Packet Type, here it is &amp;quot;0001&amp;quot; (1) for a &#039;&#039;&#039;CONNECT&#039;&#039;&#039;, the following 4-bits are reserved and must be &amp;quot;0000&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The next byte defines the packet length, not including the header, which makes up the first two bytes of the packet. Here it is &amp;quot;00001010&amp;quot; in binary, or (10), which indicates there are 10 more bytes in the packet. The remaining number of bytes received should be checked and equal to this number to insure data was properly received.&lt;br /&gt;
&lt;br /&gt;
The next two bytes indicate the length of the protocol name, in this case (4).&lt;br /&gt;
&lt;br /&gt;
Following that is the Protocol Name as UTF-8 encoded bytes spelling &amp;quot;MQTT&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Next is the Protocol Level which is (4) for MQTT Version 3.1.1.&lt;br /&gt;
&lt;br /&gt;
The next byte consists of six flags specifying in order the use of: Username, Password, Will Retention, Will QoS (as 2-bits) and Clean Session. The 8th and last bit is reserved and must be &amp;quot;0&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The last two bytes specify a keep alive time in seconds, when set to zero this functionality is not used.&lt;br /&gt;
&lt;br /&gt;
Upon receiving and verifying a well formed &#039;&#039;&#039;CONNECT&#039;&#039;&#039;, the server must respond with a &#039;&#039;&#039;CONNACK&#039;&#039;&#039; Control Packet. If the packet isn&#039;t processed correctly the connection must be closed, otherwise a &#039;&#039;&#039;CONNACK&#039;&#039;&#039; can be returned with a refused error message followed by closing teh connection.&lt;br /&gt;
&lt;br /&gt;
The following packet is sent from the server to the client as a &#039;&#039;&#039;CONNACK&#039;&#039;&#039; acknowledging a successful connection without error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONNACK Control Packet&lt;br /&gt;
&lt;br /&gt;
Byte Bits       Dec  Description&lt;br /&gt;
--------------------------------&lt;br /&gt;
0    00100000   32   Control Packet Type&lt;br /&gt;
1    00000010   2    Packet Length&lt;br /&gt;
2    00000000   0    Connect Acknowledge Flags&lt;br /&gt;
3    00000000   0    Connect Response Code&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first 4-bits of the packet are the Control Packet Type, here it is &amp;quot;0010&amp;quot; (2) for a &#039;&#039;&#039;CONNACK&#039;&#039;&#039;, the following 4-bits are reserved and must be &amp;quot;0000&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The next byte defines the remaining length of the packet &amp;quot;00000010&amp;quot; (2), this will always be the case as there is no payload for this type.&lt;br /&gt;
&lt;br /&gt;
The following byte is for flags, the fist 7-bits are reserved and always &amp;quot;0000000&amp;quot;. The last bit indicates Session Presence, since this is a &amp;quot;clean&amp;quot; session, it will be (0).&lt;br /&gt;
&lt;br /&gt;
The last byte is the response code, (0) indicates connection accepted with no errors. A value of (1-5) means it was refused, and values from (6-255) are reserved.&lt;br /&gt;
&lt;br /&gt;
The client and server have now established a active session and information can be sent to and from client and server.&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=Embedevelworkshop&amp;diff=51455</id>
		<title>Embedevelworkshop</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=Embedevelworkshop&amp;diff=51455"/>
		<updated>2016-03-15T21:45:33Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: /* Bluetooth Smart and Embedded Development */ date typo #ff0&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Bluetooth Smart and Embedded Development =&lt;br /&gt;
A certified cool workshop with hot topics.&amp;lt;br /&amp;gt;&lt;br /&gt;
Place: Noisebridge &#039;&#039;&#039;Turing&#039;&#039;&#039; classroom&amp;lt;br /&amp;gt;&lt;br /&gt;
Instructor: David Edwin&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;WEDNESDAY, March 16, 18:00&#039;&#039;&#039;&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
This workshop is timed to coincide with the [http://www.bluetoothworldevent.com/ Bluetooth World Event]&lt;br /&gt;
&lt;br /&gt;
== Part 1: Bluetooth Smart basics ==&lt;br /&gt;
==== Manufacturers and offerings ====&lt;br /&gt;
# Dual versus single stack&lt;br /&gt;
# Market sizes, product classes&lt;br /&gt;
# ST, NXP, Nordic Semiconductor&lt;br /&gt;
# nRF51822 detailed study&lt;br /&gt;
==== SDKs and development workflow ====&lt;br /&gt;
# Nordic Semiconductor SDK&lt;br /&gt;
# NodeJS and Arduino BSPs?&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Break time! ==&lt;br /&gt;
Let your brain rest.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Part 2: Proximity applications ==&lt;br /&gt;
==== Beacon profiles ====&lt;br /&gt;
# iBeacon&lt;br /&gt;
## Retail&lt;br /&gt;
# Eddystone (URL)&lt;br /&gt;
## Rich interfaces&lt;br /&gt;
## Energy intensive&lt;br /&gt;
# Extra sensors&lt;br /&gt;
## Temperature&lt;br /&gt;
## Acceleration&lt;br /&gt;
## Telemetry packets&lt;br /&gt;
==== The physical web ====&lt;br /&gt;
# Walk up and use anything&lt;br /&gt;
# Bluetooth Smart focus&lt;br /&gt;
# Applications and integration&lt;br /&gt;
# Source code glance&lt;br /&gt;
==== Make your own beacon ====&lt;br /&gt;
# nRF-51XXX with ARM mbed&lt;br /&gt;
# Cut and paste cloud C++&lt;br /&gt;
# Deployment and testing&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
To benefit the most, bring a battery powered computer and telephone. Without these things, you&#039;re welcome to form a group of two or more with a person who has the requirements.&lt;br /&gt;
&lt;br /&gt;
== Reading material ==&lt;br /&gt;
A good excuse to consume free time is reading these topics:&lt;br /&gt;
&lt;br /&gt;
https://www.bluetooth.com/what-is-bluetooth-technology/&amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.bluetooth.com/what-is-bluetooth-technology/bluetooth-technology-basics/&amp;lt;br /&amp;gt;&lt;br /&gt;
https://google.github.io/physical-web/&amp;lt;br /&amp;gt;&lt;br /&gt;
https://play.google.com/store/apps/details?id=physical_web.org.physicalweb&lt;br /&gt;
&lt;br /&gt;
== Frequently Asked Questions ==&lt;br /&gt;
==== Q: Is there an entrance fee or other fees? ====&lt;br /&gt;
A: There is nothing to pay, even optionally.&amp;lt;br /&amp;gt;If you have too much money, [[donate|give some to the Noisebridge.]]&lt;br /&gt;
&lt;br /&gt;
==== Q: What is the time of this workshop? ====&lt;br /&gt;
A: The workshop begins in the evening at 18:00 and might have a duration of 2-4 hours, depending on factors like attendence, enthusiasm (who wants to stay) and others.&lt;br /&gt;
&lt;br /&gt;
==== Q: Why is this held at the Noisebridge? ====&lt;br /&gt;
A: Because the Noisebridge is quite &#039;&#039;&#039;bodacious&#039;&#039;&#039; and has very nice Mexican restaurants near by.&lt;br /&gt;
&lt;br /&gt;
==== Q: Are morons welcome even? ====&lt;br /&gt;
A: Yes, and we&#039;ll have wicked tricky device things to do for all levels of expertise.&lt;br /&gt;
&lt;br /&gt;
==== Q: I have a question, who can I reach? ====&lt;br /&gt;
A: Add it to this FAQ where it probably will be answered.&lt;br /&gt;
&lt;br /&gt;
==== Q: Wasn&#039;t Michael going to teach this, what happened? ====&lt;br /&gt;
A: Michael can&#039;t be on site due to lack of travel sponsorship, instead David has offered to take is place and is a much nicer guy (smarter too) anyway.&lt;br /&gt;
&lt;br /&gt;
==== Q: Why was this moved to the 16th of Mar, what happened? ====&lt;br /&gt;
A: David will be at Noisebridge on the 16th of Mar but the material will be quite a bit different. However all questions can be answered.&lt;br /&gt;
&lt;br /&gt;
[[Category:Events]]&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=SSDP&amp;diff=51447</id>
		<title>SSDP</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=SSDP&amp;diff=51447"/>
		<updated>2016-03-15T02:53:17Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: go go auto find net thing #f00&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&#039;&#039;&#039;Simple Service Discovery Protocol&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*https://tools.ietf.org/html/draft-cai-ssdp-v1-03&lt;br /&gt;
*https://tools.ietf.org/html/rfc6970&lt;br /&gt;
*http://upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v1.1.pdf&lt;br /&gt;
*https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=MQTT&amp;diff=51441</id>
		<title>MQTT</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=MQTT&amp;diff=51441"/>
		<updated>2016-03-14T21:54:58Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: /* CONNECT/CONNACK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;MQTT&#039;&#039;&#039; is a machine-to-machine (M2M)/&amp;quot;Internet of Things&amp;quot; connectivity protocol. It was designed as an extremely lightweight publish/subscribe messaging transport. It is useful for connections with remote locations where a small code footprint is required and/or network bandwidth is at a premium. For example, it has been used in sensors communicating to a broker via satellite link, over occasional dial-up connections with healthcare providers, and in a range of home automation and small device scenarios. It is also ideal for mobile applications because of its small size, low power usage, minimised data packets, and efficient distribution of information to one or many receivers ([http://mqtt.org/faq more...])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718008&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
Implementation notes of building a MQTT 3.1.1 compliant server.&lt;br /&gt;
&lt;br /&gt;
=== CONNECT/CONNACK ===&lt;br /&gt;
Create super basic server that supports a client connection.&lt;br /&gt;
&lt;br /&gt;
Create server application using a TCP/IP Socket listening to port 1883&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=MQTT&amp;diff=51440</id>
		<title>MQTT</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=MQTT&amp;diff=51440"/>
		<updated>2016-03-14T21:54:08Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: start of server #f00&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;MQTT&#039;&#039;&#039; is a machine-to-machine (M2M)/&amp;quot;Internet of Things&amp;quot; connectivity protocol. It was designed as an extremely lightweight publish/subscribe messaging transport. It is useful for connections with remote locations where a small code footprint is required and/or network bandwidth is at a premium. For example, it has been used in sensors communicating to a broker via satellite link, over occasional dial-up connections with healthcare providers, and in a range of home automation and small device scenarios. It is also ideal for mobile applications because of its small size, low power usage, minimised data packets, and efficient distribution of information to one or many receivers ([http://mqtt.org/faq more...])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718008&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
Implementation notes of building a MQTT 3.1.1 compliant server.&lt;br /&gt;
&lt;br /&gt;
=== CONNECT/CONNACK ===&lt;br /&gt;
Create super basic server that supports a client connection.&lt;br /&gt;
&lt;br /&gt;
Create server application using a TCP/IP Socket listening to port 1803&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=IoT&amp;diff=51426</id>
		<title>IoT</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=IoT&amp;diff=51426"/>
		<updated>2016-03-13T20:11:47Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: /* Protocols */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Internet of Things&lt;br /&gt;
&lt;br /&gt;
Add projects, links, notes of interest and such here...&lt;br /&gt;
&lt;br /&gt;
[[ESP8266]]&lt;br /&gt;
&lt;br /&gt;
== Protocols ==&lt;br /&gt;
&lt;br /&gt;
*https://eclipse.org/community/eclipse_newsletter/2014/february/article2.php&lt;br /&gt;
*https://www.sparkfun.com/news/1705&lt;br /&gt;
*http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718008&lt;br /&gt;
*https://tools.ietf.org/html/rfc7252&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
*eBay&#039;s http://www.ebay.com/sch/i.html?_from=R40&amp;amp;_sacat=0&amp;amp;_nkw=esp8266&amp;amp;rt=nc&amp;amp;LH_PrefLoc=1&lt;br /&gt;
*Starter Kit from Odd Wires http://www.oddwires.com/esp8266-internet-of-things-iot-kit-v1-1-by-oddwires/&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=IoT&amp;diff=51425</id>
		<title>IoT</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=IoT&amp;diff=51425"/>
		<updated>2016-03-13T20:00:19Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: doc&amp;#039;s #777&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Internet of Things&lt;br /&gt;
&lt;br /&gt;
Add projects, links, notes of interest and such here...&lt;br /&gt;
&lt;br /&gt;
[[ESP8266]]&lt;br /&gt;
&lt;br /&gt;
== Protocols ==&lt;br /&gt;
&lt;br /&gt;
*https://eclipse.org/community/eclipse_newsletter/2014/february/article2.php&lt;br /&gt;
*https://www.sparkfun.com/news/1705&lt;br /&gt;
*http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718008&lt;br /&gt;
*https://tools.ietf.org/html/draft-ietf-core-coap-03#section-3.1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
*eBay&#039;s http://www.ebay.com/sch/i.html?_from=R40&amp;amp;_sacat=0&amp;amp;_nkw=esp8266&amp;amp;rt=nc&amp;amp;LH_PrefLoc=1&lt;br /&gt;
*Starter Kit from Odd Wires http://www.oddwires.com/esp8266-internet-of-things-iot-kit-v1-1-by-oddwires/&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=Embedevelworkshop&amp;diff=51398</id>
		<title>Embedevelworkshop</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=Embedevelworkshop&amp;diff=51398"/>
		<updated>2016-03-11T19:42:45Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: Added chronological info #00f&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Bluetooth Smart and Embedded Development =&lt;br /&gt;
A certified cool workshop with hot topics.&amp;lt;br /&amp;gt;&lt;br /&gt;
Place: Noisebridge &#039;&#039;&#039;Turing&#039;&#039;&#039; classroom&amp;lt;br /&amp;gt;&lt;br /&gt;
Instructor: [[User:daviddedwin|David Edwin]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Tuesday, March 15, 18:00&#039;&#039;&#039;&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
This workshop is timed to coincide with the [http://www.bluetoothworldevent.com/ Bluetooth World Event]&lt;br /&gt;
&lt;br /&gt;
== Part 1: Bluetooth Smart basics ==&lt;br /&gt;
==== Manufacturers and offerings ====&lt;br /&gt;
# Dual versus single stack&lt;br /&gt;
# Market sizes, product classes&lt;br /&gt;
# ST, NXP, Nordic Semiconductor&lt;br /&gt;
# nRF51822 detailed study&lt;br /&gt;
==== SDKs and development workflow ====&lt;br /&gt;
# Nordic Semiconductor SDK&lt;br /&gt;
# NodeJS and Arduino BSPs?&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Break time! ==&lt;br /&gt;
Let your brain rest.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Part 2: Proximity applications ==&lt;br /&gt;
==== Beacon profiles ====&lt;br /&gt;
# iBeacon&lt;br /&gt;
## Retail&lt;br /&gt;
# Eddystone (URL)&lt;br /&gt;
## Rich interfaces&lt;br /&gt;
## Energy intensive&lt;br /&gt;
# Extra sensors&lt;br /&gt;
## Temperature&lt;br /&gt;
## Acceleration&lt;br /&gt;
## Telemetry packets&lt;br /&gt;
==== The physical web ====&lt;br /&gt;
# Walk up and use anything&lt;br /&gt;
# Bluetooth Smart focus&lt;br /&gt;
# Applications and integration&lt;br /&gt;
# Source code glance&lt;br /&gt;
==== Make your own beacon ====&lt;br /&gt;
# nRF-51XXX with ARM mbed&lt;br /&gt;
# Cut and paste cloud C++&lt;br /&gt;
# Deployment and testing&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
To benefit the most, bring a battery powered computer and telephone. Without these things, you&#039;re welcome to form a group of two or more with a person who has the requirements.&lt;br /&gt;
&lt;br /&gt;
== Reading material ==&lt;br /&gt;
A good excuse to consume free time is reading these topics:&lt;br /&gt;
&lt;br /&gt;
https://www.bluetooth.com/what-is-bluetooth-technology/&amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.bluetooth.com/what-is-bluetooth-technology/bluetooth-technology-basics/&amp;lt;br /&amp;gt;&lt;br /&gt;
https://google.github.io/physical-web/&amp;lt;br /&amp;gt;&lt;br /&gt;
https://play.google.com/store/apps/details?id=physical_web.org.physicalweb&lt;br /&gt;
&lt;br /&gt;
== Frequently Asked Questions ==&lt;br /&gt;
==== Q: Is there an entrance fee or other fees? ====&lt;br /&gt;
A: There is nothing to pay, even optionally.&amp;lt;br /&amp;gt;If you have too much money, [[donate|give some to the Noisebridge.]]&lt;br /&gt;
&lt;br /&gt;
==== Q: What is the time of this workshop? ====&lt;br /&gt;
A: The workshop begins in the evening at 18:00 and might have a duration of 2-4 hours, depending on factors like attendence, enthusiasm (who wants to stay) and others.&lt;br /&gt;
&lt;br /&gt;
==== Q: Why is this held at the Noisebridge? ====&lt;br /&gt;
A: Because the Noisebridge is quite &#039;&#039;&#039;bodacious&#039;&#039;&#039; and has very nice Mexican restaurants near by.&lt;br /&gt;
&lt;br /&gt;
==== Q: Are morons welcome even? ====&lt;br /&gt;
A: Yes, and we&#039;ll have wicked tricky device things to do for all levels of expertise.&lt;br /&gt;
&lt;br /&gt;
==== Q: I have a question, who can I reach? ====&lt;br /&gt;
A: Add it to this FAQ where it probably will be answered.&lt;br /&gt;
&lt;br /&gt;
==== Q: Wasn&#039;t Michael going to teach this, what happened? ====&lt;br /&gt;
A: Michael can&#039;t be on site due to lack of travel sponsorship, instead David has offered to take is place and is a much nicer guy (smarter too) anyway.&lt;br /&gt;
&lt;br /&gt;
[[Category:Events]]&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=Category:Events&amp;diff=51397</id>
		<title>Category:Events</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=Category:Events&amp;diff=51397"/>
		<updated>2016-03-11T19:39:17Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: Format fix &amp;amp; waffle de-duplication #00f&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- Note that this page uses transclusion. Content between the &amp;quot;onlyinclude&amp;quot; tags below will be pushed to the main page --&amp;gt;&lt;br /&gt;
Official, Semi-Official, one-off and other events at the Noisebridge space.&lt;br /&gt;
&lt;br /&gt;
=Event Calendar=&lt;br /&gt;
&amp;lt;onlyinclude&amp;gt;&lt;br /&gt;
Not all events make it onto this calendar. Many events only make it to the [https://www.noisebridge.net/pipermail/noisebridge-discuss/ Discussion] or [https://www.noisebridge.net/pipermail/noisebridge-announce/ Announcements] mailing lists, [[IRC]] or in person at [[Meetings | Tuesday meetings]]. Best of all, Noisebridge is about people getting together at the space in San Francisco to do stuff.  DO pay attention, as some events just arise organically from the bottom up!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Want to host your event at Noisebridge?&#039;&#039;&#039; We like seeing classes and talks on interesting things pertaining to various subjects of hacking. Most of all, we like seeing familiar faces. Please participate in the space and our [[Meetings|weekly Tuesday meetings]] to see if we&#039;re the right audience for what you want to share before announcing a new event. Additionally, please see our [[Hosting an Event|events hosting page]] for suggestions on how to use Noisebridge for your event/class/workshop.&lt;br /&gt;
&amp;lt;!-- Items inside this &amp;quot;onlyinclude&amp;quot; tag will be pushed to the main page --&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=== Upcoming Events &amp;lt;small&amp;gt;[https://www.noisebridge.net/index.php?title=Category:Events&amp;amp;action=edit&amp;amp;section=2 edit]&amp;lt;/small&amp;gt; ===&lt;br /&gt;
&amp;lt;!-- Please read our &amp;quot;Hosting an Event&amp;quot; page and possibly follow some of the guidelines there before posting your event here https://www.noisebridge.net/wiki/Hosting_an_Event&lt;br /&gt;
It&#039;s smart (read this as highly RECOMMENDED!) to add in a link to a wiki page with more information about your event, and a way to contact the event organizer(s). Thanks!&lt;br /&gt;
&lt;br /&gt;
Please see the current postings at our [https://www.noisebridge.net/mailman/listinfo/noisebridge-discuss Discuss list] for events that are in the active process of being formed and may not yet have made it here.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &#039;&#039;None listed at present.&#039;&#039; --&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
{{event&lt;br /&gt;
|time         = Saturday, March 12th, 2016, 12pm&lt;br /&gt;
|title        = GODWAFFLE NOISE PANCAKES&lt;br /&gt;
|description  = [[Godwaffle_12_Mar_2016|The 12-Mar GODWAFFLE NOISE PANCAKES]] has Noisebands and gourmet vegan pancakes!&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;Bands:  Dyemark, Eurostache, Music For Hard Times, Failure Cock, Mas Coad&#039;&#039;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{{event&lt;br /&gt;
|time         = Tuesday, March 15th, 2016, 6pm&lt;br /&gt;
|title        = Embedevelworkshop&lt;br /&gt;
|description  = [[Embedevelworkshop|The Bluetooth Smart and Embedded Development workshop]] offers unique &#039;&#039;&#039;embedded development training&#039;&#039;&#039; free of cost (but [https://donate.noisebridge.net/ donations for the host] greatly appreciated.) Students learn the ropes of Internet of Things (IoT) applied science, and come away convinced of it&#039;s &#039;&#039;relevance&#039;&#039; and &#039;&#039;ease of implementation&#039;&#039;. This workshop runs in parallel with the Bluetooth World Event and focuses on &#039;&#039;&#039;Bluetooth Smart&#039;&#039;&#039; technology including GATT specifications, next generation mesh technology, proximity applications (Bluetooth Smart beacons), and the &#039;&#039;&#039;physical web&#039;&#039;&#039;. It is held in the &#039;&#039;&#039;Turing classroom&#039;&#039;&#039; and finishes after about four hours with one break.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UPDATE!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Michael is unable to be on site and therefore David becomes the sole instructor and organizer of the event.&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{{event&lt;br /&gt;
|time         = Thursday, March 17th, 2016, 9PM&lt;br /&gt;
|title        = Noisebridge Gamerspace at Game Developer&#039;s Conference&lt;br /&gt;
|description  = ***DATE TENTATIVE*** Noisebridge &amp;lt;3&#039;s Games Art Makerfest @ GDC&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- &#039;&#039;None listed at present.&#039;&#039; --&amp;gt;&lt;br /&gt;
{{event&lt;br /&gt;
|time         = Sunday, March 20th, 2016, 1pm&lt;br /&gt;
|title        = TOOOL Monthly Meeting&lt;br /&gt;
|description  = TOOOL (The Open Organisation of Lockpickers) will be hosting it&#039;s regular monthly meeting at Noisebridge this month.&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- &#039;&#039;None listed at present.&#039;&#039; --&amp;gt;&lt;br /&gt;
{{event&lt;br /&gt;
|time         = Saturday, April 16th, 2016, 12pm&lt;br /&gt;
|title        = GODWAFFLE NOISE PANCAKES&lt;br /&gt;
|description  = [[Godwaffle_16_Apr_2016|The 16-Apr GODWAFFLE NOISE PANCAKES]] has Noisebands and gourmet vegan pancakes!&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;Bands:  TBD&#039;&#039;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div class=&amp;quot;recurring-events&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Recurring Events &amp;lt;small&amp;gt;[https://www.noisebridge.net/index.php?title=Category:Events&amp;amp;action=edit&amp;amp;section=3 edit]&amp;lt;/small&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
{{Template:Recurring}} - Every week.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Template:RecurringNumbered|1st}} - Certain weeks, e.g. 1st week only.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Template:RecurringException|-2nd}} - Except certain weeks, or other schedule exceptions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Please check the [https://www.noisebridge.net/mailman/listinfo/noisebridge-announce Announce list] and the [https://www.noisebridge.net/mailman/listinfo/noisebridge-discuss Discuss list] for alternate locations arranged by event organizers &amp;amp; participants.&lt;br /&gt;
Please refrain from deleting others&#039; classes without first getting agreement.&amp;lt;br&amp;gt; You may do this by using a valid [https://www.noisebridge.net/mailman/listinfo/noisebridge-discuss Discuss list] email address, or else by going anonymous if you really must.&lt;br /&gt;
Please read our &amp;quot;Hosting an Event&amp;quot; page and possibly follow some of the guidelines there before posting your event herehttps://www.noisebridge.net/wiki/Hosting_an_Event&lt;br /&gt;
It&#039;s smart (read this as highly RECOMMENDED!) to add in a link to a wiki page with more information about your event, and a way to contact the event organizer(s)Thanks!&lt;br /&gt;
Large turnout events should be written in &#039;&#039;&#039;bold&#039;&#039;&#039;--&amp;gt;&lt;br /&gt;
==== Mondays ====&lt;br /&gt;
* {{Template:Recurring}} &#039;&#039;&#039;7:30 pm to 10:00 pm [[Circuit Hacking Mondays]]&#039;&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;color:black&amp;quot;&amp;gt;&amp;lt;!-- (Early start of 3:00pm on Monday holidays.)--&amp;gt;&#039;&#039;&amp;lt;/span&amp;gt;&amp;lt;div style=&amp;quot;padding-left: 30px; max-width: 725px;&amp;quot;&amp;gt;- Learn to solder! And make cool things with electronics. [[User:maltman23|Mitch]], [[User:Tman66|J]], Rolf, [[User:Miloh|Miloh]], [[User:Cedric|Cedric]], Cheng, Greg, and/or a host of others will bring kits-for-purchase to make cool, hackable things for all skill levels that you can bring home after you make them! Many designed for &#039;&#039;&#039;absolute beginners&#039;&#039;&#039;! Bring your own projects to hack! Bring things to fix! All ages. All are welcome! See the [https://www.noisebridge.net/mailman/listinfo/noisebridge-discuss Discuss list] and the [https://www.noisebridge.net/mailman/listinfo/noisebridge-announce Announce list] for weekly updates.&amp;lt;/div&amp;gt;&lt;br /&gt;
* {{Template:Recurring}} &#039;&#039;&#039;8:00 pm to 10:00 pm [[Front-end Web Development]]&#039;&#039;&#039; - Learn HTML/CSS/JS. A series of talks on different topics every week, taught in the Church classroom. Recap of last week&#039;s material starts at &#039;&#039;&#039;7:30 pm&#039;&#039;&#039;. Join the [https://www.noisebridge.net/mailman/listinfo/webdev WebDev list] or the [https://www.noisebridge.net/mailman/listinfo/noisebridge-announce Announce list] for updates.&lt;br /&gt;
* {{Template:Recurring}} [[House_Keeping#Trash_and_Recycling|Take Out the Trash Night -- Round One]] Be sure to put bins out by midnight as the trash truck comes between 1:30 to 2:30am.&lt;br /&gt;
* {{Template:Recurring}} 7:00 pm to 9:00 pm &#039;&#039;&#039;[[PyClass|Intermediate Python with PyClass]]&#039;&#039;&#039; - Crash course in the Python standard library. Monday session is held in Turing Classroom.&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;Super&#039;&#039; Tuesdays! ====&lt;br /&gt;
* {{Template:Recurring}} &#039;&#039;&#039;5:00 pm to 7:30 pm [[Songbridge|Songbridge Music Making Tuesdays]]&#039;&#039;&#039; - Beginner-friendly music making and mentoring meetup with Ableton/GarageBand/Logic tutorials for beginners and peer collabs. ([[Noise Square Table]]).&lt;br /&gt;
* {{Template:RecurringNumbered|1st}} {{Template:RecurringNumbered|3rd}}  &#039;&#039;&#039;6:30 pm to 8:30 pm [[SCoT|Sewing and Crafting]]&#039;&#039;&#039; - Come learn how to use the sewing machines or just work on a craft (e.g. knitting, crocheting, felt working, embroidery, leatherworking, beading, etc.). All skill levels are welcome. &lt;br /&gt;
* {{Template:Recurring}} &#039;&#039;&#039;7:00 pm to 9:00 pm [http://www.railsschool.org Ruby and Rails class]&#039;&#039;&#039; - Seminar and workshop for learning everything about Ruby, Rails, and web application development (Church classroom). See the [https://www.noisebridge.net/mailman/listinfo/noisebridge-announce Announce list] for weekly updates.&lt;br /&gt;
* {{Template:Recurring}} &#039;&#039;&#039;8:30 pm to 11:30 pm [[Gamebridge|Gamebridge Unityversity Game Dev Tuesdays]]&#039;&#039;&#039; - Beginner-friendly game development class and meetup, learn and share C# Unity coding, 2D/3D art, design, writing and audio. Learn how to mentor and help teach game dev. ([[Noise Square Table]]).&lt;br /&gt;
* {{Template:Recurring}} &#039;&#039;&#039;8:00 pm [[Meetings|Noisebridge Weekly Meeting]]&#039;&#039;&#039; - Introducing new people and events to the space, general discussion, and decision-making on key issues. &#039;&#039;&#039;This is your space, folks. Come on out here in person to express what you think about what&#039;s going on with it!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Wednesdays ====&lt;br /&gt;
* {{Template:RecurringException|alternating monthly}} 6:30 pm to 9:30 pm - &#039;&#039;&#039;[[Cyberspectrum|Cyberspectrum: Software Defined Radio Meetup]]&#039;&#039;&#039; in the Hackatorium(&#039;&#039;new&#039;&#039;): A place to learn and exchange ideas about SDR. Presentations on concepts, mystery signals, hardware/software and cool applications. Event alternates monthly between SF and the South Bay.&lt;br /&gt;
* {{Template:RecurringNumbered|1st}} 7:30pm to 10pm &#039;&#039;&#039;Art with Software&#039;&#039;&#039; in Church room. Present your personal and expressive art made with software/hardware of your making and get feedback and critical dialogue from fellow artist/technologists. Find collaborators and find better ways to make such work. Event info and registration is specifically on the group&#039;s Meetup webpage [http://www.meetup.com/with-software-art here].  Meeting monthly (first Wednesday of each month) in 2016.&lt;br /&gt;
* {{Template:Recurring}} 8:00 pm to 10:00 pm [[DreamTeam| Dream Team Neuro Hackery]] - EEG research &amp;amp; development project with general interest in sleep, dreaming, creative intelligence, and many loosely related topics such as: neurophysiology, signal processing, cognitive neuroscience, and (especially) hacking code and devices for data acquisition and analysis.  Join us at the [[CollaborationStation]] (near the Hackatorium).  Expect general discussion around 8 PM - usually moving along by 9 PM to focus on more technical aspects of current project.&lt;br /&gt;
* {{Template:Recurring}} 8:00 pm to 9:30 pm &#039;&#039;&#039;[[PiBridge|Raspberry Pi]]&#039;&#039;&#039; - &#039;&#039;NEW&#039;&#039; PiBridge Raspberry Pi Hacking Group is a meetup to explore on Raspberry Pi-based projects. Gain momentum and achiving successes! &#039;&#039;(2/05/16)&#039;&#039;. Meeting lateral to the Pi Student Learning Station in the Hackatorium, opportunity to move to classroom depending on events this Wednesday.&lt;br /&gt;
&lt;br /&gt;
==== Thursdays ====&lt;br /&gt;
* {{Template:Recurring}} [[House_Keeping#Trash_and_Recycling|Trash Night -- Round Two]]  - Take out the trash for Friday morning! Do it by midnight as truck comes ~1:30am to 2:30am.&lt;br /&gt;
* {{Template:Recurring}} 7:00 pm to 9:00 pm [[Front-end_Web_Development#Lab|Front-end Web Development Lab]] - Understand by doing! A recap of Monday&#039;s lecture in workshop form - and a good time for one-on-one help with the material. Meets in Turing.&lt;br /&gt;
* {{template:RecurringNumbered|2nd}} 7:00pm to 9:00pm [[Cryptopal_wg|Cryptopal working group]] - Learn cryptography through coding challenges that demonstrate attacks on real-world cryptography. A different way to learn than taking a class or reading a book!&lt;br /&gt;
* {{Template:RecurringNumbered|3rd}} &#039;&#039;&#039;7:00 pm [[Five Minutes of Fame]]&#039;&#039;&#039; a.k.a. 5MoF - lightning 5min talks every 3rd Thursday of the month&lt;br /&gt;
&lt;br /&gt;
==== Fridays ====&lt;br /&gt;
* {{Template:RecurringNumbered|1st}} {{Template:RecurringNumbered|3rd}} {{Template:RecurringNumbered|5th}}  6:00 pm to 8:00 pm [[Computerology]] in Turing or  [[CollaborationStation]], understanding and using computers&lt;br /&gt;
* {{Template:RecurringNumbered|1st}} {{Template:RecurringNumbered|3rd}} {{Template:RecurringNumbered|5th}}  8:00 pm to 10:00 pm [[FUN Tutoring]] @ [[CollaborationStation]]&lt;br /&gt;
* {{Template:RecurringNumbered|3rd}} [[Noisebridge Gaming Archivists]] Meetup 6:00 pm to 10:00 pm -- Come play, fix, mod retro consoles. Create and play is our motto! If you like video games, this is the place for you.&lt;br /&gt;
&lt;br /&gt;
==== Saturdays ====&lt;br /&gt;
* {{Template:Recurring}} 1:00 pm to 2:00 pm [[CPP Class]] discussion in Hackitorum/Fox Lounge/Church. Currently looking for folks wanting to help plan out lessons.&lt;br /&gt;
* {{Template:Recurring}} 1:00 pm  [[Zine Hacking]] Hacking on the good ol&#039; fashioned analog Zine with Torrie, Mari and anyone who wants to come and be excellent and make excellent art.&lt;br /&gt;
* {{Template:RecurringException|alternating monthly}} 3:00 pm  [[Goths &amp;amp; Crafts]] Spooky people making spooky things in the sewing area. All kinds of crafts welcome and things don&#039;t necessarily have to be goth. But if you have an eye towards the darker side of the color spectrum, this may be for you!&lt;br /&gt;
&lt;br /&gt;
==== Sundays ====&lt;br /&gt;
* {{Template:Recurring}} 12:30 pm to 7:30 pm [[Dungeons and Dragons]] in Church, currently looking for new players.&lt;br /&gt;
* {{Template:RecurringException|alternating monthly}} 1:00 pm Monthly Lock Sport Collaboration: Come learn how to pick locks and learn more about them with the [http://www.tooolsf.org/ SF Bay Area chapter] of [http://toool.us/ TOOOL]. The group meets on alternating  months at Noisebridge and in San Jose. Check the [https://groups.google.com/forum/#!forum/tooolsf-announce TOOOL SF announcement list] for details. &lt;br /&gt;
&amp;lt;!--* (defunct?) {{Template:Recurring}} 2pm to 4pm [[(affiliated_with)_Women_Who_Code_Algorithms_Study_Group|Algorithms Study Group]] in Church or Turing classroom - Whiteboarding + looking at really fun computer science topics. We want to make interviewing for code interviews fun and even continue our algorithm skills when we are not interviewing! Affiliated with Women Who Code, but Men welcome too.--&amp;gt;&lt;br /&gt;
&amp;lt;!--* {{Template:RecurringNumbered|2nd}} 2:00 pm [[BAHA]] - [http://baha.bitrot.info Bay Area Hacker&#039;s Association] - security meeting (This group has been inactive.)--&amp;gt;&lt;br /&gt;
* {{Template:Recurring}} 3:00 pm [[Go]] - Playing of the Go board game. On nice days we often take the boards to Dolores Park and play there.&lt;br /&gt;
* {{Template:Recurring}} 6:00 pm [[Plan 9]] class (if not Noisebridge check Sycamore)&lt;br /&gt;
* {{Template:Recurring}} 12:00 pm to 4:00 pm .impact Workathons in Turing classrom. Work on projects that will help humanity &amp;amp; beyond.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you&#039;d like to contact somebody at Noisebridge regarding these Events or even the Noisebridge Wiki itself, then please send an email message to one of the Board members listed in the [[Contacts]] list, e.g., &amp;lt;secretary@noisebridge.net&amp;gt; or &amp;lt;treasurer@noisebridge.net&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Orphaned Events ===&lt;br /&gt;
These events appear to be dormant or extinct.&lt;br /&gt;
&lt;br /&gt;
* SAT 10:15 - 12:10 [[Juggling with Judy!]] Note: next class is scheduled for Saturday June 29th.  Attention juggling fans!  Judy will be at the 2013 World Juggling Day celebration Saturday June 15th at Ripley&#039;s Believe It Or Not Odditorium in San Francisco Fisherman&#039;s Warf - free event begins at 1.  Come check it out!  &lt;br /&gt;
* THU 18:00 - 21:00 &#039;&#039;&#039;[[Privacy Bay]]&#039;&#039;&#039; - A monthly meetup for Bay Area folks interested in privacy. Meets in Church on the last Thursday of the month.&lt;br /&gt;
* FRI 19:00 - 21:00 [[Anarchy_101|Anarchy 101]] - a class/seminar on what anarchy is and is not, and how it impacts us as individuals and as discrete groups.&lt;br /&gt;
* 20:00 - 22:00 [[Noise~_Wednesday | Noise~ Wed]] - Graphical media programming with Max/MSP/Jitter&lt;br /&gt;
* 19:00 [[Tahoe-LAFS]] - Occasional meetup of users and/or developers of the Least Authority File System.&lt;br /&gt;
* 14:00 - 16:00 Android Developer Support Group - Meet up with other app developers in the library for a lightly structured knowledge-share.&lt;br /&gt;
&lt;br /&gt;
=== Proposed Future Events and Classes === &lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[Sound Science]] A potential monthly lecture/demonstration series on the little known science behind sound reproductionTopics to include: Transducer Physics(speakers and mics), Room Acoustics, Signal Path and Cabling,Loudspeaker design 101, Music Production Tips for Big Sound, and How to make a small system sound HUGEEach session to include hands on projects like making speakers from stuff lying around, Non-Newtonian bass monsters, and ez speaker mods for anyoneIf interested contact the new guy-&amp;gt; MattLong8 at gmail dot com, 805 four five three - six zero nine seven &lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[Modular Synthesis]] a bi-weekly (or monthly) group devoted to modular synthesizers&amp;gt; workshop will include modular sound synthesis styles and techniques, a study of different modules and their functions, ie voltage controlled oscillator, voltage controlled filter, low frequency oscillator, envelope generator ect and how these modules interact with each other, what control voltage and triggers are..... as well as one on one time for each student with the modular, which is a 60 space large format Moog style modular synthesizer with big knobs and 1/4 jacks   including performance and other awesomeness by Douglas. contact Douglas at greenshoos at gmail dotcom&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[VideoHacking]] a weekly video/video art devoted hacker group, including experiments in the 3D vr realm...if interested contact julialc4@gmail.com&lt;br /&gt;
:Wednesdays at 21:00 [[Brewing Bridge]] - Malakkar Proposal: Learn how to make your drinks fun AND antibacterial, using yeastThis will be recurring if enough interest or need is presentAssociated items - what to do with brewing leftovers, and brewers sample hour, etc.&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[Probability]] - Weekly probability study group based on [http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-041-probabilistic-systems-analysis-and-applied-probability-spring-2006/related-resources/ Fundamentals of Applied Probability Theory] by Al Drake&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[Mandarin Corner|Mandarin]] - Learn or practice Mandarin, all levels. Also currently on hiatus. Get on the mailing list.&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[Movie Night!]] - [[User:ThOMG|Thom]] wants to build community through nerdy sci-fi! (+Bill+Ted+Excellence++) (how about a Friday hacker movie night? -[[User:Carl|Carl]])&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[Introduction to the AVR Microcontroller]] - [[User:Mightyohm|Jeff]] and [[User:Maltman23|Mitch]] are planning an introductory class for people wanting to make cool projects with AVRs.&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[Basic Chemistry Lab Techniques]]&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[Cuddle Puddle for the Economy]] - Stress-hacking with informal massage exchange.&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[Milk and Cookies]] - Come read your favorite selections out loud With Milk and Cookies (and yeah, probably beer too).&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[Processing Workshop 2]] - [[User:Scmurray|Scott]] is interested in teaching this, and is busy thinking about what, where, when, why, and how.&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;:  [[Hack your Hardware]] -- We call BS on &amp;quot;no user-serviceable parts inside&amp;quot;&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[Homebrew Instruction Class]] - The Wort (pt 1/3)&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[Trip to Shooting Range]] - Field trip to a shooting range, to shoot guns Express interest at [[Trip to Shooting Range]]&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[Surface Mount Soldering Workshop]] - Learn how to solder cicuits with small surface mount parts [[User:maltman23|Mitch Altman]] and Martin Bogomolni and others will show their tricks [[User:maltman23|Mitch]] will bring hackable kits that uses surface mounts for you to solder&amp;lt;-YES! (mattlong8 at gmail dot com)&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039; - [[Locksport and Lockpicking]]&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039; - [[Version control tutorial]]&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039; - [[Foreign language learning for rocket scientists]] - I&#039;m near-native (fool people when I try) in (French and) Japanese, and a pro trans/terpreter and will share my shortcuts (skill-order, vocab, speed/articulation, translation≅grammar) No expertise on tonal languages yet..so if you know how to remember tones or how tone-sandhi interacts with speed and/or how nuances of speaker attitude are expressed in them (what we do with rythm/inflection/sentence-intonation and stress in Eng., and with particles and ??? in e.g. Cantonese) please chime in or call me (415-608-0564) so I can convey your wisdom [also looking for a from-scratch Arabic partner]&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[Getting started with Arduino]]&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[Distributed Databases]]&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[Node.js Beginners Session]] - Interested in learning about Node.js? I amMaybe these guys want to teach it: http://www.meetup.com/Joyent-Cloud-User-Group/events/81311542/&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[Scrum Club]] - I though I&#039;d test the waters and see if anyone was interested in a noisebridge scrum club details are here http://scrumclub.org/scrum-clubs/ if inturested hit me up twitter: @theabcasian, facebook: http://www.facebook.com/theabcasian&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[CNC Mill Workshop]] - Who wants to make stuff on the [[MaxNCMill]]?&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[Math &amp;amp; Science Help]] - If you would like some math, science or engineering help, I&#039;m down to lend a hand.&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[Cyborg Group|Cyborg Group / Sensebridge]] - Work on projects like artificial senses Someone needs to lead this!&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[OpenEEG]] - Brain techHas historically met on Sundays, at the behest of interested parties.&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[Programming_for_Poets | Programming for Poets]] -  Gentle intro to programming using Processing&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[World Builders &amp;amp; Simgineers]] -  Work together to create a beautiful &amp;amp; open virtual world &amp;amp; platform.&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[PlunderBridge]] -  Metal detecting, detector technology &amp;amp; treasure hunting expeditions.&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[Ruby Mining]] -  Ruby on Rails basics, interactive working group&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[MoinMoin Wiki]] -  MoinMoin Wiki (details see there)&lt;br /&gt;
:&#039;&#039;&#039;(TBD)&#039;&#039;&#039;: [[Noisebridge Fundraiser 2013]]&lt;br /&gt;
&lt;br /&gt;
= Past Events =&lt;br /&gt;
&lt;br /&gt;
===2016===&lt;br /&gt;
{{event&lt;br /&gt;
|time         = Thursday, February 25th, 2016, 7pm&lt;br /&gt;
|title        = SF Amateur Mathematicians&lt;br /&gt;
|description  = Differential Geometry and Wide-Angle Photography with Chad Fong. In Church Room. See [http://www.meetup.com/SF-Amateur-Mathematicians/events/228761849/ Meetup page]. SF Amateur Mathematicians is a math club open to everyone interested in learning more about math. Topics and talks generally assume some collegiate mathematical background.&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{{event&lt;br /&gt;
|time         = Sunday, February 7th, 2016, 11:00am&lt;br /&gt;
|title        = HackTheLeft&lt;br /&gt;
|description  = &amp;lt;br&amp;gt;[[HackTheLeft|Hack the Left]] is an &#039;&#039;anticapitalist&#039;&#039; hackathon, going on for the entire long weekend of February 5th-7th at Noisebridge.  This is an experiment to see what happens when you get a bunch of leftists in a room for a weekend with the intention to advance liberatory and &#039;&#039;anticapitalist&#039;&#039; projects using technology. This includes software projects like Tor and Signal, art projects like the Anti-Eviction Mapping Project and Men in Grey, hardware projects like mesh networks and signal jammers, and tools for rad organizations like Anti Police-Crimethink Project and Food Not Bombs. It&#039;s clear that there&#039;s a huge amount of opportunity for liberatory technology. It&#039;s up to us to build it.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Hackathon participants should be able to get into Noisebridge by [[Hours | its 11:00 AM opening hour]], if not earlier, for both weekend days.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===2014===&lt;br /&gt;
*{{event&lt;br /&gt;
|time         = Sunday, September 23, 5:00pm&lt;br /&gt;
|title        = How to Start a Startup MOOC Lecture Viewings&lt;br /&gt;
|description  = We would get together to watch the lectures together and conduct discussion and networking afterwards. http://startupclass.samaltman.com/&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
===2013===&lt;br /&gt;
*{{event&lt;br /&gt;
|time         = Friday, August 9, 5:00pm&lt;br /&gt;
|title        = Noisebridge Party Setup&lt;br /&gt;
|description  = Volunteers will be preparing the space for Saturday&#039;s show.  There are no scheduled conflicts; you might be asked to move multiple times by someone pushing a broom and assembling a raised stage simultaneously.&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
*{{event&lt;br /&gt;
|time         = Saturday, August 10, 4:00pm&lt;br /&gt;
|title        = Noisebridge &amp;quot;______ the Bridge&amp;quot; Party&lt;br /&gt;
|description  =  &amp;lt;span style=&amp;quot;color:#ff00ff; background:##ff00ff&amp;quot;&amp;gt; a summer fundraising party for Noisebridge, which YOU are invited to!&amp;lt;/span&amp;gt;&lt;br /&gt;
|suggested donation = $10, but no one turned away for lack of funds&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
*{{event&lt;br /&gt;
|time         = Sunday, August 11, 2:00pm&lt;br /&gt;
|title        = Bay Area Hackers&#039; Association Meeting&lt;br /&gt;
|description  = Jon Callas presenting on [[BAHA/2013-08-11|Secure Communications, Privacy, Counter-Surveillance]].&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Wednesday, May 22, 7.00 pm: Instructables Build Night&#039;&#039;&#039; - Bare Conductive, Instructables will supply Bare Conductive paint pens and pizza. Come experiment with the paint and post some Instructables. This is a FREE event.&lt;br /&gt;
&lt;br /&gt;
===2012===&lt;br /&gt;
* &#039;&#039;&#039;December 20, Thursday, 20:00 - 22:00 - [[5MoF|5 Minutes of Fame]]&#039;&#039;&#039; - Following up on its triumphant return in November, 5MoF is back with another showcase of lightning talks &amp;amp; other good stuff, with your host Sir Danny O&#039;Brien! Details TBA&lt;br /&gt;
*&#039;&#039;&#039;Tuesday Feb14th, 18:00 to 20:00&#039;&#039;&#039; ZiP MegaZine releases its inaugural issue with &#039;&#039;&#039;My Noisy Valentine&#039;&#039;&#039; Zine Release Microparty in the Noisebridge cafeFor more info follow [[zine | this]] link.&lt;br /&gt;
* &#039;&#039;&#039;Wednesday, Jan30, 20:00-22:00&#039;&#039;&#039; [[zine|ZiP]] meeting for zine-makers &amp;amp; others with an interest in printing &amp;amp; self-publishingThe meeting 1/30/13 is our first since mid-2012We plan to hold them regularly from now on at this time (Wednesday 8pm)This meeting will be informal &amp;amp; will probably take place in the printing/lasercutter area of the hackerspace.&lt;br /&gt;
&lt;br /&gt;
===2011===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;September 11th 14:00 to 17:00&#039;&#039;&#039; - The San Francisco Chapter of the Open Organisation Of Lockpickers and Bay Area Hacker&#039;s Association present a joint meeting on [https://secure.wikimedia.org/wikipedia/en/wiki/Locksport locksport]&lt;br /&gt;
*&#039;&#039;&#039;August 4, 7PM, Thursday&#039;&#039;&#039; - [http://zeidman.net Bob Zeidman] will be giving a talk on video games and intellectual property, hosted by TheMADEHe will also speak about IP infringement cases.&lt;br /&gt;
*&#039;&#039;&#039;August 9, 6:30PM, Tuesday&#039;&#039;&#039; - [http://www.meetup.com/makesf/events/26413241/ Make:SF] - Chris Jefferies will speak about the wireless sensor kit he is developing and we are bringing back our all star soldering kits.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;April 13th, 19:00&#039;&#039;&#039; - Kombucha fermentation class with [[BioBridge]] &lt;br /&gt;
*&#039;&#039;&#039;April 7th, 20:00&#039;&#039;&#039; - [[In-Depth|Noisebridge: In-Depth]] Our monthly lecture and round tableThis month&#039;s speaker will be Aragorn! his lecture will be &amp;quot;Anarchism &amp;amp; technology: An unbridgeable chasm&amp;quot;&lt;br /&gt;
*&#039;&#039;&#039;April 4th, 20:00&#039;&#039;&#039; - Camp KDE PartyCome and meet part of the KDE North America community and get a quick overview of this year&#039;s [http://camp.kde.org/ Camp KDE] conferenceThere will be beer&lt;br /&gt;
*&#039;&#039;&#039;April 3rd, 16:00&#039;&#039;&#039; - NoiseCaching: Meet-up to build some geocaches, and talk about making geocoinsThen we&#039;ll head out to find some local caches and place caches we made[http://www.geocaching.com More info about Geocaching here]&lt;br /&gt;
* &#039;&#039;&#039;March 20th, 19:00&#039;&#039;&#039; [[Hack Politics]] meetup -- the first meetup to figure out how we in the hacker community can effectively mobilize and create meaningful change in these interesting times&lt;br /&gt;
* &#039;&#039;&#039;March 12th, 12:00-18:00 - Noisebridge Hackathon!&#039;&#039;&#039; Second Saturday Hackathon is a casual monthly event dedicated to working on the space or relevant projects and building community This is a great time to get feedback or help on any projects you have been considering that center around the space, culture, and infrastructure of Noisebridge You can also help with existing projects and find out ways to get involved.&lt;br /&gt;
* &#039;&#039;&#039;March 10, Thursday, 19:00 - Group Grammar Clinic&#039;&#039;&#039; - Church Classroom - Donations gladly accepted - A clinic for grammar and writing evaluationPlease bring your web/social or technical writing for us to evaluateBring your laptop as well Collaboration groupware possibly provided(Please suggest groupware software to use if you wish)Constructive feedback from other group members is encouraged so that this clinic is a group process- Facilitator: [[User:Owen|Owen]] (opietro@yahoo.com)&lt;br /&gt;
* &#039;&#039;&#039;March 9th, 20:00&#039;&#039;&#039; - Ferment and filter a mash! [[fermentation logs]]&lt;br /&gt;
&lt;br /&gt;
===2010===&lt;br /&gt;
* &#039;&#039;&#039;Sunday, August 22, 19:00 CLUB-MATE DROPOFF AND TASTING PARTY&#039;&#039;&#039; Nick Farr will be in town to drop off Club-Mate ordered by San Franciscans!&lt;br /&gt;
* &#039;&#039;&#039;June 5th, 12:00-19:00 - [[NoiseBridgeRehab]]&#039;&#039;&#039; - Help make the space more usable and accessible! Noisebridge needs your help!&lt;br /&gt;
* &#039;&#039;&#039;June 5th, 16:00-20:00 - [[Science For Juggalos]]&#039;&#039;&#039; - Science Fair in front of the Warfield Theater teaching magnetism to Juggalos&lt;br /&gt;
* &#039;&#039;&#039;June 6th, 15:00 - [[AVC Meetup]]&#039;&#039;&#039; - Entrepreneurial bonding &amp;amp; matchmaking&lt;br /&gt;
* &#039;&#039;&#039;June 9th, 21:00 - Your liver supports Noisebridge&#039;&#039;&#039; - Come to Elixir @ 16th &amp;amp; Guerrero anytime after 21:00 and drink, drink, drink! 50% of tips go to Noisebridge&lt;br /&gt;
* &#039;&#039;&#039;February 27th, 20:00 - [[Hacker EPROM]]&#039;&#039;&#039; - Noisebridge&#039;s first prom! Nice tie and a (robot) date requiredWe will have a DJ and punch.&lt;br /&gt;
* &#039;&#039;&#039;February 24th, 19:00, Wednesday - Joris Peels, of [http://www.shapeways.com Shapeways]&#039;&#039;&#039;, and expert on 3D printing, will give a [[ShaperwaysPresentation | talk and demonstration]] at Noisebridge!.&lt;br /&gt;
* &#039;&#039;&#039;February 23rd, 18:00 - Cleaning day&#039;&#039;&#039; - Come and help clean Noisebridge, because everyone loves a clean hack space.&lt;br /&gt;
* &#039;&#039;&#039;February 12th, 21:00 - visit from Steve Jackson&#039;&#039;&#039;Game designer [http://en.wikipedia.org/wiki/Steve_Jackson_%28US_game_designer%29 Steve Jackson], founder of Steve Jackson Games, will visit Noisebridge.&lt;br /&gt;
* &#039;&#039;&#039;January 27th, 18:00-20:00 - [[beatrixjar event|Circuit Bending Workshop]]&#039;&#039;&#039; - [http://www.beatrixjar.com/ Beatrix*JAR] (contact [[User:Gpvillamil|Gian Pablo]] for more info)&lt;br /&gt;
* &#039;&#039;&#039;January 27th, 20:00-22:00 - [[beatrixjar event|Circuit Bending Performance]]&#039;&#039;&#039; - [http://www.beatrixjar.com/ Beatrix*JAR] - &amp;quot;Celebrate a night of new sound that will change your idea of music forever!&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;January 25th, 19:30 - [[Bag Porn]]&#039;&#039;&#039; - What&#039;s in your bag?&lt;br /&gt;
* &#039;&#039;&#039;January 20th, 19:00-21:00 - [http://groups.google.com/group/bacat/about Bay Categories &amp;amp; Types]&#039;&#039;&#039; - Categories, monoids, monads, functors and more! Held in the Alonzo Church classroom.&lt;br /&gt;
* &#039;&#039;&#039;January 20th, 19:00 - [[User Experience Book Club SF]]&#039;&#039;&#039; - Our book this month is &amp;quot;A Theory of Fun for Game Design&amp;quot; by Raph Koster - http://is.gd/6sEqw (meets in Turing)&lt;br /&gt;
* &#039;&#039;&#039;January 21st, 20:00 - [[Five Minutes of Fame]]&#039;&#039;&#039; - Monthly set of lightning talks on diverse topics&lt;br /&gt;
* &#039;&#039;&#039;January 22nd, 17:00 - [[CleaningParty| Cleaning Party]]&#039;&#039;&#039; - Come help clean up Noisebridge! Awsum fun!&lt;br /&gt;
* ...January 14th,16th, and 17th 1:00- ??? Build Out day for kitchen/bathroom/laundry bring yourself and a good attitude, learn a few things as well&lt;br /&gt;
* &#039;&#039;&#039;January 15th, 18:00 - [[CNC_Mill_Workshop]]&#039;&#039;&#039; - Learn to use the CNC mill for 2D engraving and circuit board routing&lt;br /&gt;
* Thursdays 17:00 [[ASL Group|American Sign Language]] - Learn how to talk without using your voice (or just come chat in ASL)&amp;lt;small&amp;gt;[http://whenisgood.net/noisebridge/asl/generic click to reschedule]&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===2009===&lt;br /&gt;
* &#039;&#039;&#039;November 18th, 19:30&#039;&#039;&#039; - [[Dorkbot_2009_11_18|Dorkbot]]&lt;br /&gt;
* &#039;&#039;&#039;November 19th, 18:00&#039;&#039;&#039; - [[Mesh meetup]]&lt;br /&gt;
* &#039;&#039;&#039;November 19th, 20:00&#039;&#039;&#039; - [[Five Minutes of Fame]]&lt;br /&gt;
* &#039;&#039;&#039;November 20th, 18:00&#039;&#039;&#039; - Loud Objects [http://www.flickr.com/photos/createdigitalmedia/3428249036/ Noise Toy workshop].&lt;br /&gt;
* &#039;&#039;&#039;November 20th, 20:00&#039;&#039;&#039; - Performance by [http://www.loudobjects.com/ Loud Objects], (featuring Tristan Perich and Lesley Flanigan) and [http://www.myspace.com/jibkidder Jib Kidder].&lt;br /&gt;
:&#039;&#039;&#039;2009-11-05&#039;&#039;&#039; - [http://www.server-sky.com/ Server Sky presentation: Internet and Computation in Orbit] by Keith Lofstrom&lt;br /&gt;
:&#039;&#039;&#039;2009-11-05&#039;&#039;&#039; - [[Mesh meetup]]&lt;br /&gt;
:&#039;&#039;&#039;2009-11-02&#039;&#039;&#039; - [[French]] book club meeting to discuss  [http://www.amazon.com/exec/obidos/tg/detail/-/2842612892/ref=ord_cart_shr?_encoding=UTF8&amp;amp;m=ATVPDKIKX0DER&amp;amp;v=glance Une Si Longue Lettre]&lt;br /&gt;
: &#039;&#039;&#039; October 1st, 18:00&#039;&#039;&#039; - [[Wireless_Mesh_Network_Meetup | Mesh wireless meetup]]&lt;br /&gt;
: &#039;&#039;&#039; October 1st, 19:00&#039;&#039;&#039; - [http://groups.google.com/group/bacat Bay Area Categories and Types]&lt;br /&gt;
: &#039;&#039;&#039;2009-10-03&#039;&#039;&#039; [[Year 1 Open Hacker House]]&lt;br /&gt;
:&#039;&#039;&#039;Friday&#039;&#039;&#039;: [[CrazyCryptoNight]] - Discussion of cryptography for beginners through experts6-???&lt;br /&gt;
:&#039;&#039;&#039;Sunday&#039;&#039;&#039; : [[OpenEEG | OpenEEG Hacking]] Sundays, at 3-5pm.&lt;br /&gt;
:&#039;&#039;&#039;Monday&#039;&#039;&#039;: [[German]] - Learn German, all levels7pm beginners, 8pm advancedRSVP 24 hours in advance for the benefit of the instructorEvents ran May-November 2009Currently on Thursdays at 8Get on the mailing list.&lt;br /&gt;
:&#039;&#039;&#039;Tuesday&#039;&#039;&#039;: [[Haskell/Haschool]] - Learn Haskell with Jason Dusek 6PM - 7:30PM, from May until we&#039;re all experts.&lt;br /&gt;
:&#039;&#039;&#039;Wednesday&#039;&#039;&#039;: [[Adobe_Lightroom|Adobe Lightroom]] - Become a more organized photographerWeekly class (mostly held off site).&lt;br /&gt;
:&#039;&#039;&#039;Thursday&#039;&#039;&#039;: [[Professional VFX Compositing With Adobe After Effects]] - Taught by [[User:SFSlim|Aaron Muszalski]]7:30PM - 10PM, most Thursdays in May &amp;amp; June &amp;amp; ? (click through dammit)&lt;br /&gt;
:&#039;&#039;&#039;2009-09-17&#039;&#039;&#039;: [[Five Minutes of Fame]] 3D Edition&lt;br /&gt;
:&#039;&#039;&#039;2009-09-17&#039;&#039;&#039;: [[Wireless Mesh Network Meetup | Mesh wireless meetup]]&lt;br /&gt;
:&#039;&#039;&#039;2009-08-20&#039;&#039;&#039;: [[Five Minutes of Fame]] One Dee Edition&lt;br /&gt;
:&#039;&#039;&#039;2009-07-16&#039;&#039;&#039;: [[Five Minutes of Fame]] Zero Dee&lt;br /&gt;
:&#039;&#039;&#039;2009-07-02 - 2009-07-05&#039;&#039;&#039;: [http://toorcamp.org Toorcamp]&lt;br /&gt;
:&#039;&#039;&#039;2009-07-01&#039;&#039;&#039;: Noisedroid meeting to discuss location logging on Android platform (and other stuff too, I&#039;m sure)&lt;br /&gt;
:&#039;&#039;&#039;2009-06-30&#039;&#039;&#039;: [[Powerbocking Class|Powerbocking class]]&lt;br /&gt;
:&#039;&#039;&#039;2009-06-30&#039;&#039;&#039;: &amp;quot;Suing Telemarketers for Fun and Profit&amp;quot; (Toorcamp talk preview)&lt;br /&gt;
:&#039;&#039;&#039;2009-06-28&#039;&#039;&#039;: &amp;quot;Meditation for Hackers&amp;quot; (Toorcamp workshop preview)&lt;br /&gt;
:&#039;&#039;&#039;2009-06-18&#039;&#039;&#039;: [[Five Minutes of Fame]]&lt;br /&gt;
:&#039;&#039;&#039;2009-06-15&#039;&#039;&#039;: [[Eagle Workshop]]  Session two of the Eagle CAD workshop.&lt;br /&gt;
:&#039;&#039;&#039;2009-06-13&#039;&#039;&#039;: [[RoboGames 2009]] Noisebridge had a booth staffed by vounteers, great fun!&lt;br /&gt;
:&#039;&#039;&#039;2009-05-21&#039;&#039;&#039;: [[Five Minutes of Fame]]&lt;br /&gt;
:&#039;&#039;&#039;2009-04-27&#039;&#039;&#039;: [[EagleCAD workshop]] -- learn to use this CAD tool for printed circuit board design&lt;br /&gt;
:&#039;&#039;&#039;2009-04-16&#039;&#039;&#039;: [[Five Minutes of Fame]] April showers &amp;amp; flowers edition&lt;br /&gt;
:&#039;&#039;&#039;2009-04-11&#039;&#039;&#039;: [[RFID Hacking]] weekend workshop  (this event moved from the original March date)&lt;br /&gt;
:&#039;&#039;&#039;2009-04-05&#039;&#039;&#039;: [[First aid and CPR class]] Learning how to not only not die, but also reduce scarring!&lt;br /&gt;
:&#039;&#039;&#039;2009-04-03&#039;&#039;&#039;: [[Sudo pop]] 2PM and onMaking the first batch of a Noisebridge label yerba mate-niated rootbrew, gratis and DIY&lt;br /&gt;
:&#039;&#039;&#039;2009-03-26&#039;&#039;&#039;: [[OpenEEG | OpenEEG Hacking]] first meet up for this new group: 8 pm&lt;br /&gt;
:&#039;&#039;&#039;2009-03-19&#039;&#039;&#039;: [[Five Minutes of Fame]]&lt;br /&gt;
:&#039;&#039;&#039;2009-03-12&#039;&#039;&#039;: [[OpenBTS and GSM]] talk by David Burgess&lt;br /&gt;
:&#039;&#039;&#039;2009-02-14&#039;&#039;&#039;: [[Open Heart Workshop]] Valentine&#039;s Day blinkyheart soldering party! &lt;br /&gt;
:&#039;&#039;&#039;2009-02-13&#039;&#039;&#039;: [[Time-t_Party|&amp;lt;tt&amp;gt;time_t&amp;lt;/tt&amp;gt; Party]] to celebrate 1,234,567,890 since the Unix epoch.&lt;br /&gt;
:&#039;&#039;&#039;2009-02-09&#039;&#039;&#039;: [[Spanish learning at 8:30]]&lt;br /&gt;
:&#039;&#039;&#039;2009-02-05&#039;&#039;&#039;: [[PGP Key Workshop]]&lt;br /&gt;
:&#039;&#039;&#039;2009-01-31&#039;&#039;&#039;: [[Locksport and Lockpicking]]&lt;br /&gt;
&lt;br /&gt;
===2008===&lt;br /&gt;
:&#039;&#039;&#039;2008-12-27&#039;&#039;&#039;: [[25C3]] Chaos Computer Congress in Berlin&lt;br /&gt;
:&#039;&#039;&#039;2008-12-20 &amp;amp; 21&#039;&#039;&#039;: [[Creme Brulee]] Workshop on creating a french dessert, with bonus propane torch.&lt;br /&gt;
:&#039;&#039;&#039;2008-12-17 20:00&#039;&#039;&#039;: [[Machine Learning]] Birds-of-a-feather&lt;br /&gt;
:&#039;&#039;&#039;2008-11-24&#039;&#039;&#039;: [[Circuit Hacking Monday]] circuit design workshop&lt;br /&gt;
:&#039;&#039;&#039;2008-11-21, 7pm&#039;&#039;&#039;:[[Milk and Cookies]] -- [[User:Dmolnar|David Molnar]] hosts Milk and Cookies at 83CBring a short 5-7minute thing to read to othersBring a potluck cookie/snack/drink if you likeDavid will bring milk and cookies.&lt;br /&gt;
:&#039;&#039;&#039;2008-11-17, 7:30pm&#039;&#039;&#039;: [[Basic Bicycle Maintain]] - [[User:rubin110|Rubin]] and [[User:rigel|rigel]] hate it when we see a bike that isn&#039;t maintainedScreechy chains and clacking derailleur can go to hellBasic bike tune up, sharing the smarts on simple things you can do at home to make your ride suck a whole lot less.&lt;br /&gt;
:&#039;&#039;&#039;2008-11-16, 5:00pm&#039;&#039;&#039;: [[RepRap Soldering Party]] - help assemble RepRap!  RSVPs required on wiki! [[User:Adi|adi]]&lt;br /&gt;
:&#039;&#039;&#039;2008-11-16, 3:00pm&#039;&#039;&#039;: [[Oscilloscopes]] - Learn how to use this versatile tool to test electronic circuits Maximum 6 slots, please sign up ahead of time! [[User:dstaff|dstaff]]&lt;br /&gt;
:&#039;&#039;&#039;2008-10-31&#039;&#039;&#039;: [[Halloween Open House]] - NoiseBridge&#039;s own [[PPPC]] threw an awesome open house/halloween galaPost pictures if you got &#039;em!&lt;br /&gt;
:&#039;&#039;&#039;2008-10-25&#039;&#039;&#039;: [[Soldering Workshop]] and Pumpkin Hackin&#039; - Learn to solder for total newbies (or learn to solder better!), including surface mountAdditionally, carve your halloween pumpkins and enjoy some experimental pumpkin pie and/or soup.&lt;br /&gt;
:&#039;&#039;&#039;2008-10-07&#039;&#039;&#039;: (tuesday before meeting) - Etch a circuit boardI&#039;ll be trying a photo resist etching and a basic printed mask etchingThis is step 1/3 for a project called &amp;quot;annoying USB thingie&amp;quot; which will execute pre-defined keystrokes by sneaking a tiny USB dongle onto a victim^h^h^h^h^h buddy&#039;s computer.&lt;br /&gt;
:&#039;&#039;&#039;2008-09-13&#039;&#039;&#039;: [[Processing Workshop]] — Learn this very easy-to-use programming language! - [[Processing Workshop Report]]&lt;br /&gt;
:&#039;&#039;&#039;2008-02-16&#039;&#039;&#039;: [[Brain Machine Workshop|Brain Machine Making Workshop]]: Our first hardware sprint!&lt;br /&gt;
&lt;br /&gt;
[[Category:Top level]]&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=MQTT&amp;diff=51396</id>
		<title>MQTT</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=MQTT&amp;diff=51396"/>
		<updated>2016-03-11T18:40:57Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: get ur transport on #00f&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;MQTT&#039;&#039;&#039; is a machine-to-machine (M2M)/&amp;quot;Internet of Things&amp;quot; connectivity protocol. It was designed as an extremely lightweight publish/subscribe messaging transport. It is useful for connections with remote locations where a small code footprint is required and/or network bandwidth is at a premium. For example, it has been used in sensors communicating to a broker via satellite link, over occasional dial-up connections with healthcare providers, and in a range of home automation and small device scenarios. It is also ideal for mobile applications because of its small size, low power usage, minimised data packets, and efficient distribution of information to one or many receivers ([http://mqtt.org/faq more...])&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718008&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=ESP8266/Temp&amp;diff=50226</id>
		<title>ESP8266/Temp</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=ESP8266/Temp&amp;diff=50226"/>
		<updated>2015-11-24T03:30:05Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: #990000 yankee doodle hack to F from float&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Temperature Sensing with Dallas DS18B20&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)&lt;br /&gt;
  // Pass the GPIO pin number sensor(s) is connected to&lt;br /&gt;
  OneWire oneWire(13);&lt;br /&gt;
  // Pass our oneWire reference to Dallas Temperature.&lt;br /&gt;
  DallasTemperature sensors(&amp;amp;oneWire);&lt;br /&gt;
&lt;br /&gt;
  // Put this in setup()&lt;br /&gt;
  sensors.begin();&lt;br /&gt;
&lt;br /&gt;
  // Put this where you want to read temp&lt;br /&gt;
  sensors.requestTemperatures();&lt;br /&gt;
  sensors.getTempCByIndex(0);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hack for Fahrenheit and float conversion&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  sensors.requestTemperatures();&lt;br /&gt;
  float tempFloat = sensors.getTempCByIndex(0) * 1.8 + 32; // convert to F&lt;br /&gt;
  int tempReading = int(tempFloat);&lt;br /&gt;
  int tempReadingTenth = int((tempFloat - tempReading) * 10); // Hack around %f&lt;br /&gt;
&lt;br /&gt;
  // For use with sprintf()&lt;br /&gt;
  // sprintf(buff, 100, &amp;quot;Temperature: %d.%d&amp;quot;, tempReadig, tempReadingTenth);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dallas Library ==&lt;br /&gt;
&lt;br /&gt;
http://www.milesburton.com/?title=Dallas_Temperature_Control_Library&lt;br /&gt;
&lt;br /&gt;
Library Download:&lt;br /&gt;
* http://download.milesburton.com/Arduino/MaximTemperature/DallasTemperature_372Beta.zip&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
* Sensor Data Sheet&lt;br /&gt;
** http://www.mouser.com/ds/2/256/DS18B20-370043.pdf&lt;br /&gt;
* Arduino Reference Project&lt;br /&gt;
** http://www.hobbytronics.co.uk/ds18b20-arduino&lt;br /&gt;
* ESP8266 Reference Project&lt;br /&gt;
** http://iot-playground.com/2-uncategorised/41-esp8266-ds18b20-temperature-sensor-arduino-ide&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=ESP8266/Temp&amp;diff=50225</id>
		<title>ESP8266/Temp</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=ESP8266/Temp&amp;diff=50225"/>
		<updated>2015-11-24T02:34:05Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: sudo coded&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Temperature Sensing with Dallas DS18B20&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)&lt;br /&gt;
// Pass the GPIO pin number sensor(s) is connected to&lt;br /&gt;
OneWire oneWire(13);&lt;br /&gt;
// Pass our oneWire reference to Dallas Temperature.&lt;br /&gt;
DallasTemperature sensors(&amp;amp;oneWire);&lt;br /&gt;
&lt;br /&gt;
// Put this in setup()&lt;br /&gt;
sensors.begin();&lt;br /&gt;
&lt;br /&gt;
// Put this where you want to read temp&lt;br /&gt;
sensors.requestTemperatures();&lt;br /&gt;
sensors.getTempCByIndex(0);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dallas Library ==&lt;br /&gt;
&lt;br /&gt;
http://www.milesburton.com/?title=Dallas_Temperature_Control_Library&lt;br /&gt;
&lt;br /&gt;
Library Download:&lt;br /&gt;
* http://download.milesburton.com/Arduino/MaximTemperature/DallasTemperature_372Beta.zip&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
* Sensor Data Sheet&lt;br /&gt;
** http://www.mouser.com/ds/2/256/DS18B20-370043.pdf&lt;br /&gt;
* Arduino Reference Project&lt;br /&gt;
** http://www.hobbytronics.co.uk/ds18b20-arduino&lt;br /&gt;
* ESP8266 Reference Project&lt;br /&gt;
** http://iot-playground.com/2-uncategorised/41-esp8266-ds18b20-temperature-sensor-arduino-ide&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=ESP8266/Temp&amp;diff=50224</id>
		<title>ESP8266/Temp</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=ESP8266/Temp&amp;diff=50224"/>
		<updated>2015-11-24T02:13:07Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: #990000 go go what teh temp?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Temperature Sensing with Dallas DS18B20&lt;br /&gt;
&lt;br /&gt;
== Dallas Library ==&lt;br /&gt;
&lt;br /&gt;
http://www.milesburton.com/?title=Dallas_Temperature_Control_Library&lt;br /&gt;
&lt;br /&gt;
Library Download:&lt;br /&gt;
* http://download.milesburton.com/Arduino/MaximTemperature/DallasTemperature_372Beta.zip&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
* Sensor Data Sheet&lt;br /&gt;
** http://www.mouser.com/ds/2/256/DS18B20-370043.pdf&lt;br /&gt;
* Arduino Reference Project&lt;br /&gt;
** http://www.hobbytronics.co.uk/ds18b20-arduino&lt;br /&gt;
* ESP8266 Reference Project&lt;br /&gt;
** http://iot-playground.com/2-uncategorised/41-esp8266-ds18b20-temperature-sensor-arduino-ide&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=ESP8266&amp;diff=50223</id>
		<title>ESP8266</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=ESP8266&amp;diff=50223"/>
		<updated>2015-11-24T02:07:23Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄ &lt;br /&gt;
▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌&lt;br /&gt;
▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀█░▌ ▀▀▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀▀▀ &lt;br /&gt;
▐░▌          ▐░▌          ▐░▌       ▐░▌▐░▌       ▐░▌          ▐░▌▐░▌          ▐░▌          &lt;br /&gt;
▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄█░▌          ▐░▌▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄▄▄ &lt;br /&gt;
▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌ ▐░░░░░░░░░▌  ▄▄▄▄▄▄▄▄▄█░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌&lt;br /&gt;
▐░█▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀█░▌▐░░░░░░░░░░░▌▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀█░▌&lt;br /&gt;
▐░▌                    ▐░▌▐░▌          ▐░▌       ▐░▌▐░█▀▀▀▀▀▀▀▀▀ ▐░▌       ▐░▌▐░▌       ▐░▌&lt;br /&gt;
▐░█▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄█░▌▐░▌          ▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄█░▌&lt;br /&gt;
▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░▌          ▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌&lt;br /&gt;
 ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀            ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀                                                                                           &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* [[ESP8266/OTA]]&lt;br /&gt;
* [[ESP8266/Blink]]&lt;br /&gt;
* [[ESP8266/WS2812]]&lt;br /&gt;
* [[ESP8266/PIR]]&lt;br /&gt;
* [[ESP8266/Temp]]&lt;br /&gt;
&lt;br /&gt;
* https://nurdspace.nl/ESP8266&lt;br /&gt;
* https://github.com/espressif/ESP8266_AT/wiki&lt;br /&gt;
* http://www.esp8266.com/wiki/doku.php?id=esp8266-module-family&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ESP8266 is a small, low-cost wifi-talking board. It&#039;s the new center of the Internet of Things. Originally intended as a &amp;quot;wifi modem&amp;quot;, it exposes the WiFi interface over AT-style commands.&lt;br /&gt;
&lt;br /&gt;
Some hackers immediately noticed there is a general-purpose microcontroller on the box, and made a firmware for it that takes Lua programs. Now you don&#039;t need another microcontroller. Sweet!&lt;br /&gt;
&lt;br /&gt;
Several additional community efforts have also been initiated and are generally discussed at http://esp8266.com one of the newer developmentss is the addition of integrated support in the Arduino IDE, further details follow in the &#039;&#039;Software&#039;&#039; section below.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
For full specs, see [https://nurdspace.nl/ESP8266]. Important facts:&lt;br /&gt;
* 3.3v *only* - 5v will let out the majikul smoke&lt;br /&gt;
* Some reports say 1A current draw, others say 250 mA&lt;br /&gt;
* Talks 802.1n, supports most major auth types.&lt;br /&gt;
&lt;br /&gt;
There are a number of ESP8266 hardware versions. The ones of interest are:&lt;br /&gt;
&lt;br /&gt;
* ESP-01: 8 pins (basically one I/O plus power, etc.). Breadboard friendly 2x4 header (2.54mm), but not useful standalone&lt;br /&gt;
* ESP-12: 16 pins (I/O, power, 9 GPIO). Non-breadboard friendly: 2mm pin spacing&lt;br /&gt;
* ESP-12e: 22 pins, same as ESP-12, with an additional 6 pins on the back edge adding 1 I/O and SPI connections&lt;br /&gt;
&lt;br /&gt;
=== Sources ===&lt;br /&gt;
&lt;br /&gt;
Most modules are available from this ebay store http://stores.ebay.com/tomyuen007/ for $3 and up, ships from US, generally less than a week for delivery.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== Arduino IDE ===&lt;br /&gt;
&lt;br /&gt;
Enhancements to the Arduino IDE in versions 1.6.4 and later have enabled support for the esp8266 and the ability to upload new firmware. Version 1.6.5 r5 or later is recommended.&lt;br /&gt;
&lt;br /&gt;
The current version of the IDE can be downloaded from https://www.arduino.cc/en/Main/Software&lt;br /&gt;
&lt;br /&gt;
Two additional steps are required to add esp8266 support to the Arduino IDE&lt;br /&gt;
# Open the preferences menu in the Arduino IDE and add &amp;lt;code&amp;gt;http://arduino.esp8266.com/stable/package_esp8266com_index.json&amp;lt;/code&amp;gt; into &amp;quot;Additional Board Manager URLs&amp;quot; field&lt;br /&gt;
# Open Boards Manager from &amp;quot;Tools &amp;gt; Board: ______ &amp;gt; Boards Manager...&amp;quot; menu, scroll down to esp8266, click to select it and then click the install button.&lt;br /&gt;
&lt;br /&gt;
Details about esp8266 support can be found at https://github.com/esp8266/Arduino&lt;br /&gt;
&lt;br /&gt;
Once it downloads you&#039;ll see &amp;quot;ESP8266 Modules&amp;quot; section added to the list of target boards under &amp;quot;Tools &amp;gt; Board: ______&amp;gt;&amp;quot;. You can use the &amp;quot;Generic ESP8266 Module&amp;quot; option for programming ESP-## modules using a 3.3v USB-Serial connector.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll need a USB to Serial cable/dongle for programming the board, connecting Ground/Rx/Tx. If you&#039;re using the cheap USB dongles, like the AI branded ones using a CH340G chip, you may also need to install the drivers.&lt;br /&gt;
&lt;br /&gt;
* http://www.wch.cn/download/CH341SER_ZIP.html (Windows)&lt;br /&gt;
* http://www.wch.cn/download/CH341SER_MAC_ZIP.html (Mac)&lt;br /&gt;
* http://www.wch.cn/download/CH341SER_LINUX_ZIP.html (Linux)&lt;br /&gt;
&lt;br /&gt;
In order to enable the ESP8266 to accept new firmware, temporarily connect GPIO0 to ground, and cycle the power.&lt;br /&gt;
&lt;br /&gt;
=== LUA ===&lt;br /&gt;
There are a wide variety of firmware builds available for the chip. Of interest is the software [http://nodemcu.com/index_en.html NodeMCU], which turns the serial port in to a Lua REPL. [[User:Yesac|Yesac]] is working on an [https://github.com/squeed/nodemcu-env environment] within NodeMCU for doing TFTP and some other junk.&lt;br /&gt;
&lt;br /&gt;
Uploading firmware is easy with [https://github.com/themadinventor/esptool esptool]&lt;br /&gt;
&lt;br /&gt;
= Projects =&lt;br /&gt;
&lt;br /&gt;
== IoT X&#039;ample ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Breadboarded multi-function device using ESP-12 module, PIR sensor, buzzer, indicator LEDs and light sensor.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
See additional PIR info [[ESP8266/PIR]]&lt;br /&gt;
&lt;br /&gt;
[[File:BoardRoom_bb.png|800px]]&lt;br /&gt;
&lt;br /&gt;
The following code can be used on the above diagrammed hardware. Using a web browser the ESP8266 will respond the following url requests&lt;br /&gt;
* http://xxx.xxx.xxx.xxx/ (Displays current status, motion and light level)&lt;br /&gt;
* http://xxx.xxx.xxx.xxx/buzz (Triggers the buzzer to make a noise)&lt;br /&gt;
* http://xxx.xxx.xxx.xxx/hello (Returns a simple hello message)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
   AS IS NO GUARANTEE NO WARRANTY&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClient.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266mDNS.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const char *ssid = &amp;quot;YourWiFi&amp;quot;;&lt;br /&gt;
const char *password = &amp;quot;WiFiPassword&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
ESP8266WebServer server ( 80 );&lt;br /&gt;
&lt;br /&gt;
const int pir = 4;&lt;br /&gt;
const int led = 14;&lt;br /&gt;
const int buzzer = 12;&lt;br /&gt;
&lt;br /&gt;
void handleRoot() {&lt;br /&gt;
	&lt;br /&gt;
	char temp[400];&lt;br /&gt;
	int sec = millis() / 1000;&lt;br /&gt;
	int min = sec / 60;&lt;br /&gt;
	int hr = min / 60;&lt;br /&gt;
&lt;br /&gt;
	snprintf ( temp, 400,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;html&amp;gt;\&lt;br /&gt;
  &amp;lt;head&amp;gt;\&lt;br /&gt;
    &amp;lt;title&amp;gt;PIR Demo&amp;lt;/title&amp;gt;\&lt;br /&gt;
    &amp;lt;style&amp;gt;\&lt;br /&gt;
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\&lt;br /&gt;
    &amp;lt;/style&amp;gt;\&lt;br /&gt;
  &amp;lt;/head&amp;gt;\&lt;br /&gt;
  &amp;lt;body&amp;gt;\&lt;br /&gt;
    &amp;lt;h1&amp;gt;Hello from ESP8266 PIR!&amp;lt;/h1&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Uptime: %02d:%02d:%02d&amp;lt;/p&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Motion: %s&amp;lt;/p&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Ambient: %d%&amp;lt;/p&amp;gt;\&lt;br /&gt;
  &amp;lt;/body&amp;gt;\&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		hr, min % 60, sec % 60, digitalRead(pir)?&amp;quot;true&amp;quot;:&amp;quot;false&amp;quot;, round(analogRead(A0)/10.24)&lt;br /&gt;
	);&lt;br /&gt;
	server.send ( 200, &amp;quot;text/html&amp;quot;, temp );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handleBuzz() {&lt;br /&gt;
  	&lt;br /&gt;
	char temp[400];&lt;br /&gt;
	int sec = millis() / 1000;&lt;br /&gt;
	int min = sec / 60;&lt;br /&gt;
	int hr = min / 60;&lt;br /&gt;
&lt;br /&gt;
	snprintf ( temp, 400,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;html&amp;gt;\&lt;br /&gt;
  &amp;lt;head&amp;gt;\&lt;br /&gt;
    &amp;lt;title&amp;gt;BUZZ!!!&amp;lt;/title&amp;gt;\&lt;br /&gt;
    &amp;lt;style&amp;gt;\&lt;br /&gt;
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #ff0000; }\&lt;br /&gt;
    &amp;lt;/style&amp;gt;\&lt;br /&gt;
  &amp;lt;/head&amp;gt;\&lt;br /&gt;
  &amp;lt;body&amp;gt;\&lt;br /&gt;
    &amp;lt;h1&amp;gt;BUZZ!!!&amp;lt;/h1&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Uptime: %02d:%02d:%02d&amp;lt;/p&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Motion: %s&amp;lt;/p&amp;gt;\&lt;br /&gt;
  &amp;lt;/body&amp;gt;\&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		hr, min % 60, sec % 60, digitalRead(pir)?&amp;quot;true&amp;quot;:&amp;quot;false&amp;quot;&lt;br /&gt;
	);&lt;br /&gt;
	server.send ( 200, &amp;quot;text/html&amp;quot;, temp );&lt;br /&gt;
&lt;br /&gt;
        digitalWrite(buzzer, HIGH);&lt;br /&gt;
        delay(300);&lt;br /&gt;
        digitalWrite(buzzer, LOW);&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
void handleNotFound() {&lt;br /&gt;
	String message = &amp;quot;File Not Found\n\n&amp;quot;;&lt;br /&gt;
	message += &amp;quot;URI: &amp;quot;;&lt;br /&gt;
	message += server.uri();&lt;br /&gt;
	message += &amp;quot;\nMethod: &amp;quot;;&lt;br /&gt;
	message += ( server.method() == HTTP_GET ) ? &amp;quot;GET&amp;quot; : &amp;quot;POST&amp;quot;;&lt;br /&gt;
	message += &amp;quot;\nArguments: &amp;quot;;&lt;br /&gt;
	message += server.args();&lt;br /&gt;
	message += &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	for ( uint8_t i = 0; i &amp;lt; server.args(); i++ ) {&lt;br /&gt;
		message += &amp;quot; &amp;quot; + server.argName ( i ) + &amp;quot;: &amp;quot; + server.arg ( i ) + &amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	server.send ( 404, &amp;quot;text/plain&amp;quot;, message );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup ( void ) {&lt;br /&gt;
	pinMode ( led, OUTPUT );&lt;br /&gt;
	digitalWrite ( led, 0 );&lt;br /&gt;
         &lt;br /&gt;
        pinMode(buzzer, OUTPUT);&lt;br /&gt;
        digitalWrite(buzzer, 0);&lt;br /&gt;
        &lt;br /&gt;
        pinMode(pir, INPUT);&lt;br /&gt;
&lt;br /&gt;
	Serial.begin ( 115200 );&lt;br /&gt;
	WiFi.begin ( ssid, password );&lt;br /&gt;
	Serial.println ( &amp;quot;&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	// Wait for connection&lt;br /&gt;
	while ( WiFi.status() != WL_CONNECTED ) {&lt;br /&gt;
		delay ( 500 );&lt;br /&gt;
		Serial.print ( &amp;quot;.&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	Serial.println ( &amp;quot;&amp;quot; );&lt;br /&gt;
	Serial.print ( &amp;quot;Connected to &amp;quot; );&lt;br /&gt;
	Serial.println ( ssid );&lt;br /&gt;
	Serial.print ( &amp;quot;IP address: &amp;quot; );&lt;br /&gt;
	Serial.println ( WiFi.localIP() );&lt;br /&gt;
&lt;br /&gt;
	server.on ( &amp;quot;/&amp;quot;, handleRoot );&lt;br /&gt;
        server.on(&amp;quot;/buzz&amp;quot;, handleBuzz);&lt;br /&gt;
	server.on ( &amp;quot;/hello&amp;quot;, []() {&lt;br /&gt;
		server.send ( 200, &amp;quot;text/plain&amp;quot;, &amp;quot;hi, how ya doin?&amp;quot; );&lt;br /&gt;
	} );&lt;br /&gt;
	server.onNotFound ( handleNotFound );&lt;br /&gt;
	server.begin();&lt;br /&gt;
	Serial.println ( &amp;quot;HTTP server started&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop ( void ) {&lt;br /&gt;
        &lt;br /&gt;
        if (digitalRead(pir)) {&lt;br /&gt;
          // Do something interesting on motion&lt;br /&gt;
        } else {&lt;br /&gt;
          // Nothing new here&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // LED on if motion == true&lt;br /&gt;
        digitalWrite(led, digitalRead(pir));&lt;br /&gt;
&lt;br /&gt;
	server.handleClient();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Group order 01/2015 =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prices are from the same store, and are competitive within a few cents.&lt;br /&gt;
&lt;br /&gt;
* ESP-12, Without breakout (Option A): $2.60 [http://www.aliexpress.com/store/product/Free-Shipping-10pcs-lot-ESP8266-remote-serial-Port-WIFI-wireless-module-through-walls-Wang-ESP-12/413752_32243298445.html aliex]&lt;br /&gt;
* ESP-12, with breakout board, battery socket, resistors, and power regulator (2.54mm pitch): $4.50 [http://www.aliexpress.com/item/Free-shipping-10pcs-lot-ESP8266-ESP-12-serial-WIFI-Industrial-stable-version-A-full-test-board/32260087529.html aliex]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Order Participants ===&lt;br /&gt;
Put your name, email, and quantity of With and Without breakout desired.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name&lt;br /&gt;
! Email&lt;br /&gt;
! No Breakout&lt;br /&gt;
! Breakout&lt;br /&gt;
|- &lt;br /&gt;
| Casey&lt;br /&gt;
| c1@caseyc.net&lt;br /&gt;
| 0&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| Adrian&lt;br /&gt;
| adrian@freebsd&lt;br /&gt;
| 0&lt;br /&gt;
| 5&lt;br /&gt;
|-&lt;br /&gt;
| Naomi&lt;br /&gt;
| naomi at nthmost&lt;br /&gt;
| 0&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| Dana&lt;br /&gt;
| dsniezko at sonic net&lt;br /&gt;
| 0&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| Patrick&lt;br /&gt;
| p@trickod.com&lt;br /&gt;
| 0&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| Les Jones&lt;br /&gt;
|&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| Brad&lt;br /&gt;
| brad.schwagler at gmail&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| Torrie&lt;br /&gt;
| tdfischer at hackerbots&lt;br /&gt;
| 10&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| Jake&lt;br /&gt;
| jake at spaz odt org&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| Henner&lt;br /&gt;
| h.zeller at acm.org&lt;br /&gt;
| 10&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| John E.&lt;br /&gt;
| neurofog@gmail.com&lt;br /&gt;
| 2&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| devin&lt;br /&gt;
| &amp;lt;- that at doormouse org&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| Scotty&lt;br /&gt;
| &amp;lt;- that at scottyallen com&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| Tom&lt;br /&gt;
| &amp;lt;- that at tomdee.co.uk&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| mct&lt;br /&gt;
| mct at toren dot net&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| adi&lt;br /&gt;
| adi@hexapodia.org&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| ondine&lt;br /&gt;
| okilker at gmail&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=ESP8266/OTA&amp;diff=50064</id>
		<title>ESP8266/OTA</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=ESP8266/OTA&amp;diff=50064"/>
		<updated>2015-11-11T01:51:36Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Exploring Over The Air (OTA) updates.&lt;br /&gt;
&lt;br /&gt;
* https://harizanov.com/2015/06/firmware-over-the-air-fota-for-esp8266-soc/&lt;br /&gt;
&lt;br /&gt;
There is an OTA option in the Arduino IDE.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff6600;font-family:courier;font-size:24pt&amp;quot;&amp;gt;&#039;&#039;&#039;UPDATED&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This now actually works with Arduino IDE 1.6.5 r5&lt;br /&gt;
&lt;br /&gt;
Freshly updated documentation&lt;br /&gt;
&lt;br /&gt;
* https://github.com/esp8266/Arduino/blob/master/doc/ota_updates.md&lt;br /&gt;
&lt;br /&gt;
Verified this working with DNS_SD_Arduino_OTA Example sketch using ESP-01 &amp;amp; ESP-12e with 1MB memory.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Network ports&amp;quot; option seemed to require restarting the IDE after uploading the initial firmware via serial.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It&#039;s also important to know the flash memory size, ESP.getFreeSketchSpace() may be useful, free space must be greater than sketch size.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Serial.println(&amp;quot;Flash Memory Stuff&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;ESP ID: &amp;quot;);&lt;br /&gt;
  Serial.println(ESP.getChipId(), HEX);&lt;br /&gt;
 &lt;br /&gt;
  Serial.println(&amp;quot;Flash ID: &amp;quot;);&lt;br /&gt;
  Serial.println(ESP.getFlashChipId(), HEX);&lt;br /&gt;
  Serial.println(&amp;quot;Flash Size: &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.printf(&amp;quot;Sketch size: %u\n&amp;quot;, ESP.getSketchSize());&lt;br /&gt;
  Serial.printf(&amp;quot;Free size: %u\n&amp;quot;, ESP.getFreeSketchSpace());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Serial output from an ESP-01&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ESP ID: &lt;br /&gt;
DCED75&lt;br /&gt;
Flash ID: &lt;br /&gt;
1440E0&lt;br /&gt;
Sketch size: 304716&lt;br /&gt;
Free size: 655360&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;Note: Updated to HEX formatting of Flash ID.&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=ESP8266/OTA&amp;diff=50061</id>
		<title>ESP8266/OTA</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=ESP8266/OTA&amp;diff=50061"/>
		<updated>2015-11-11T01:14:58Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: iT w0rX! #ff9900&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Exploring Over The Air (OTA) updates.&lt;br /&gt;
&lt;br /&gt;
* https://harizanov.com/2015/06/firmware-over-the-air-fota-for-esp8266-soc/&lt;br /&gt;
&lt;br /&gt;
There is an OTA option in the Arduino IDE.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff6600;font-family:courier;font-size:24pt&amp;quot;&amp;gt;&#039;&#039;&#039;UPDATED&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This now actually works with Arduino IDE 1.6.5 r5&lt;br /&gt;
&lt;br /&gt;
Freshly updated documentation&lt;br /&gt;
&lt;br /&gt;
* https://github.com/esp8266/Arduino/blob/master/doc/ota_updates.md&lt;br /&gt;
&lt;br /&gt;
Verified this working with DNS_SD_Arduino_OTA Example sketch using ESP-12e with 1MB memory. DOES NOT work with ESP-01 with 512KB memory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It&#039;s also important to know the flash memory size, ESP.getFreeSketchSpace() may be useful, free space must be greater than sketch size.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Serial.println(&amp;quot;Flash Memory Stuff&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;ESP ID: &amp;quot;);&lt;br /&gt;
  Serial.println(ESP.getChipId(), HEX);&lt;br /&gt;
 &lt;br /&gt;
  Serial.println(&amp;quot;Flash ID: &amp;quot;);&lt;br /&gt;
  Serial.println(ESP.getFlashChipId(), HEX);&lt;br /&gt;
  Serial.println(&amp;quot;Flash Size: &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.printf(&amp;quot;Sketch size: %u\n&amp;quot;, ESP.getSketchSize());&lt;br /&gt;
  Serial.printf(&amp;quot;Free size: %u\n&amp;quot;, ESP.getFreeSketchSpace());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Serial output from an ESP-01&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ESP ID: &lt;br /&gt;
DCED75&lt;br /&gt;
Flash ID: &lt;br /&gt;
1440E0&lt;br /&gt;
Sketch size: 304716&lt;br /&gt;
Free size: 655360&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;Note: Updated to HEX formatting of Flash ID.&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=ESP8266&amp;diff=50060</id>
		<title>ESP8266</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=ESP8266&amp;diff=50060"/>
		<updated>2015-11-11T01:08:31Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: #FF9900&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄ &lt;br /&gt;
▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌&lt;br /&gt;
▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀█░▌ ▀▀▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀▀▀ &lt;br /&gt;
▐░▌          ▐░▌          ▐░▌       ▐░▌▐░▌       ▐░▌          ▐░▌▐░▌          ▐░▌          &lt;br /&gt;
▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄█░▌          ▐░▌▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄▄▄ &lt;br /&gt;
▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌ ▐░░░░░░░░░▌  ▄▄▄▄▄▄▄▄▄█░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌&lt;br /&gt;
▐░█▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀█░▌▐░░░░░░░░░░░▌▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀█░▌&lt;br /&gt;
▐░▌                    ▐░▌▐░▌          ▐░▌       ▐░▌▐░█▀▀▀▀▀▀▀▀▀ ▐░▌       ▐░▌▐░▌       ▐░▌&lt;br /&gt;
▐░█▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄█░▌▐░▌          ▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄█░▌&lt;br /&gt;
▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░▌          ▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌&lt;br /&gt;
 ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀            ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀                                                                                           &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* [[ESP8266/OTA]]&lt;br /&gt;
* [[ESP8266/Blink]]&lt;br /&gt;
* [[ESP8266/WS2812]]&lt;br /&gt;
* [[ESP8266/PIR]]&lt;br /&gt;
&lt;br /&gt;
* https://nurdspace.nl/ESP8266&lt;br /&gt;
* https://github.com/espressif/ESP8266_AT/wiki&lt;br /&gt;
* http://www.esp8266.com/wiki/doku.php?id=esp8266-module-family&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ESP8266 is a small, low-cost wifi-talking board. It&#039;s the new center of the Internet of Things. Originally intended as a &amp;quot;wifi modem&amp;quot;, it exposes the WiFi interface over AT-style commands.&lt;br /&gt;
&lt;br /&gt;
Some hackers immediately noticed there is a general-purpose microcontroller on the box, and made a firmware for it that takes Lua programs. Now you don&#039;t need another microcontroller. Sweet!&lt;br /&gt;
&lt;br /&gt;
Several additional community efforts have also been initiated and are generally discussed at http://esp8266.com one of the newer developmentss is the addition of integrated support in the Arduino IDE, further details follow in the &#039;&#039;Software&#039;&#039; section below.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
For full specs, see [https://nurdspace.nl/ESP8266]. Important facts:&lt;br /&gt;
* 3.3v *only* - 5v will let out the majikul smoke&lt;br /&gt;
* Some reports say 1A current draw, others say 250 mA&lt;br /&gt;
* Talks 802.1n, supports most major auth types.&lt;br /&gt;
&lt;br /&gt;
There are a number of ESP8266 hardware versions. The ones of interest are:&lt;br /&gt;
&lt;br /&gt;
* ESP-01: 8 pins (basically one I/O plus power, etc.). Breadboard friendly 2x4 header (2.54mm), but not useful standalone&lt;br /&gt;
* ESP-12: 16 pins (I/O, power, 9 GPIO). Non-breadboard friendly: 2mm pin spacing&lt;br /&gt;
* ESP-12e: 22 pins, same as ESP-12, with an additional 6 pins on the back edge adding 1 I/O and SPI connections&lt;br /&gt;
&lt;br /&gt;
=== Sources ===&lt;br /&gt;
&lt;br /&gt;
Most modules are available from this ebay store http://stores.ebay.com/tomyuen007/ for $3 and up, ships from US, generally less than a week for delivery.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== Arduino IDE ===&lt;br /&gt;
&lt;br /&gt;
Enhancements to the Arduino IDE in versions 1.6.4 and later have enabled support for the esp8266 and the ability to upload new firmware. Version 1.6.5 r5 or later is recommended.&lt;br /&gt;
&lt;br /&gt;
The current version of the IDE can be downloaded from https://www.arduino.cc/en/Main/Software&lt;br /&gt;
&lt;br /&gt;
Two additional steps are required to add esp8266 support to the Arduino IDE&lt;br /&gt;
# Open the preferences menu in the Arduino IDE and add &amp;lt;code&amp;gt;http://arduino.esp8266.com/stable/package_esp8266com_index.json&amp;lt;/code&amp;gt; into &amp;quot;Additional Board Manager URLs&amp;quot; field&lt;br /&gt;
# Open Boards Manager from &amp;quot;Tools &amp;gt; Board: ______ &amp;gt; Boards Manager...&amp;quot; menu, scroll down to esp8266, click to select it and then click the install button.&lt;br /&gt;
&lt;br /&gt;
Details about esp8266 support can be found at https://github.com/esp8266/Arduino&lt;br /&gt;
&lt;br /&gt;
Once it downloads you&#039;ll see &amp;quot;ESP8266 Modules&amp;quot; section added to the list of target boards under &amp;quot;Tools &amp;gt; Board: ______&amp;gt;&amp;quot;. You can use the &amp;quot;Generic ESP8266 Module&amp;quot; option for programming ESP-## modules using a 3.3v USB-Serial connector.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll need a USB to Serial cable/dongle for programming the board, connecting Ground/Rx/Tx. If you&#039;re using the cheap USB dongles, like the AI branded ones using a CH340G chip, you may also need to install the drivers.&lt;br /&gt;
&lt;br /&gt;
* http://www.wch.cn/download/CH341SER_ZIP.html (Windows)&lt;br /&gt;
* http://www.wch.cn/download/CH341SER_MAC_ZIP.html (Mac)&lt;br /&gt;
* http://www.wch.cn/download/CH341SER_LINUX_ZIP.html (Linux)&lt;br /&gt;
&lt;br /&gt;
In order to enable the ESP8266 to accept new firmware, temporarily connect GPIO0 to ground, and cycle the power.&lt;br /&gt;
&lt;br /&gt;
=== LUA ===&lt;br /&gt;
There are a wide variety of firmware builds available for the chip. Of interest is the software [http://nodemcu.com/index_en.html NodeMCU], which turns the serial port in to a Lua REPL. [[User:Yesac|Yesac]] is working on an [https://github.com/squeed/nodemcu-env environment] within NodeMCU for doing TFTP and some other junk.&lt;br /&gt;
&lt;br /&gt;
Uploading firmware is easy with [https://github.com/themadinventor/esptool esptool]&lt;br /&gt;
&lt;br /&gt;
= Projects =&lt;br /&gt;
&lt;br /&gt;
== IoT X&#039;ample ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Breadboarded multi-function device using ESP-12 module, PIR sensor, buzzer, indicator LEDs and light sensor.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
See additional PIR info [[ESP8266/PIR]]&lt;br /&gt;
&lt;br /&gt;
[[File:BoardRoom_bb.png|800px]]&lt;br /&gt;
&lt;br /&gt;
The following code can be used on the above diagrammed hardware. Using a web browser the ESP8266 will respond the following url requests&lt;br /&gt;
* http://xxx.xxx.xxx.xxx/ (Displays current status, motion and light level)&lt;br /&gt;
* http://xxx.xxx.xxx.xxx/buzz (Triggers the buzzer to make a noise)&lt;br /&gt;
* http://xxx.xxx.xxx.xxx/hello (Returns a simple hello message)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
   AS IS NO GUARANTEE NO WARRANTY&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClient.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266mDNS.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const char *ssid = &amp;quot;YourWiFi&amp;quot;;&lt;br /&gt;
const char *password = &amp;quot;WiFiPassword&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
ESP8266WebServer server ( 80 );&lt;br /&gt;
&lt;br /&gt;
const int pir = 4;&lt;br /&gt;
const int led = 14;&lt;br /&gt;
const int buzzer = 12;&lt;br /&gt;
&lt;br /&gt;
void handleRoot() {&lt;br /&gt;
	&lt;br /&gt;
	char temp[400];&lt;br /&gt;
	int sec = millis() / 1000;&lt;br /&gt;
	int min = sec / 60;&lt;br /&gt;
	int hr = min / 60;&lt;br /&gt;
&lt;br /&gt;
	snprintf ( temp, 400,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;html&amp;gt;\&lt;br /&gt;
  &amp;lt;head&amp;gt;\&lt;br /&gt;
    &amp;lt;title&amp;gt;PIR Demo&amp;lt;/title&amp;gt;\&lt;br /&gt;
    &amp;lt;style&amp;gt;\&lt;br /&gt;
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\&lt;br /&gt;
    &amp;lt;/style&amp;gt;\&lt;br /&gt;
  &amp;lt;/head&amp;gt;\&lt;br /&gt;
  &amp;lt;body&amp;gt;\&lt;br /&gt;
    &amp;lt;h1&amp;gt;Hello from ESP8266 PIR!&amp;lt;/h1&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Uptime: %02d:%02d:%02d&amp;lt;/p&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Motion: %s&amp;lt;/p&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Ambient: %d%&amp;lt;/p&amp;gt;\&lt;br /&gt;
  &amp;lt;/body&amp;gt;\&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		hr, min % 60, sec % 60, digitalRead(pir)?&amp;quot;true&amp;quot;:&amp;quot;false&amp;quot;, round(analogRead(A0)/10.24)&lt;br /&gt;
	);&lt;br /&gt;
	server.send ( 200, &amp;quot;text/html&amp;quot;, temp );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handleBuzz() {&lt;br /&gt;
  	&lt;br /&gt;
	char temp[400];&lt;br /&gt;
	int sec = millis() / 1000;&lt;br /&gt;
	int min = sec / 60;&lt;br /&gt;
	int hr = min / 60;&lt;br /&gt;
&lt;br /&gt;
	snprintf ( temp, 400,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;html&amp;gt;\&lt;br /&gt;
  &amp;lt;head&amp;gt;\&lt;br /&gt;
    &amp;lt;title&amp;gt;BUZZ!!!&amp;lt;/title&amp;gt;\&lt;br /&gt;
    &amp;lt;style&amp;gt;\&lt;br /&gt;
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #ff0000; }\&lt;br /&gt;
    &amp;lt;/style&amp;gt;\&lt;br /&gt;
  &amp;lt;/head&amp;gt;\&lt;br /&gt;
  &amp;lt;body&amp;gt;\&lt;br /&gt;
    &amp;lt;h1&amp;gt;BUZZ!!!&amp;lt;/h1&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Uptime: %02d:%02d:%02d&amp;lt;/p&amp;gt;\&lt;br /&gt;
    &amp;lt;p&amp;gt;Motion: %s&amp;lt;/p&amp;gt;\&lt;br /&gt;
  &amp;lt;/body&amp;gt;\&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		hr, min % 60, sec % 60, digitalRead(pir)?&amp;quot;true&amp;quot;:&amp;quot;false&amp;quot;&lt;br /&gt;
	);&lt;br /&gt;
	server.send ( 200, &amp;quot;text/html&amp;quot;, temp );&lt;br /&gt;
&lt;br /&gt;
        digitalWrite(buzzer, HIGH);&lt;br /&gt;
        delay(300);&lt;br /&gt;
        digitalWrite(buzzer, LOW);&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
void handleNotFound() {&lt;br /&gt;
	String message = &amp;quot;File Not Found\n\n&amp;quot;;&lt;br /&gt;
	message += &amp;quot;URI: &amp;quot;;&lt;br /&gt;
	message += server.uri();&lt;br /&gt;
	message += &amp;quot;\nMethod: &amp;quot;;&lt;br /&gt;
	message += ( server.method() == HTTP_GET ) ? &amp;quot;GET&amp;quot; : &amp;quot;POST&amp;quot;;&lt;br /&gt;
	message += &amp;quot;\nArguments: &amp;quot;;&lt;br /&gt;
	message += server.args();&lt;br /&gt;
	message += &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	for ( uint8_t i = 0; i &amp;lt; server.args(); i++ ) {&lt;br /&gt;
		message += &amp;quot; &amp;quot; + server.argName ( i ) + &amp;quot;: &amp;quot; + server.arg ( i ) + &amp;quot;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	server.send ( 404, &amp;quot;text/plain&amp;quot;, message );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup ( void ) {&lt;br /&gt;
	pinMode ( led, OUTPUT );&lt;br /&gt;
	digitalWrite ( led, 0 );&lt;br /&gt;
         &lt;br /&gt;
        pinMode(buzzer, OUTPUT);&lt;br /&gt;
        digitalWrite(buzzer, 0);&lt;br /&gt;
        &lt;br /&gt;
        pinMode(pir, INPUT);&lt;br /&gt;
&lt;br /&gt;
	Serial.begin ( 115200 );&lt;br /&gt;
	WiFi.begin ( ssid, password );&lt;br /&gt;
	Serial.println ( &amp;quot;&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	// Wait for connection&lt;br /&gt;
	while ( WiFi.status() != WL_CONNECTED ) {&lt;br /&gt;
		delay ( 500 );&lt;br /&gt;
		Serial.print ( &amp;quot;.&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	Serial.println ( &amp;quot;&amp;quot; );&lt;br /&gt;
	Serial.print ( &amp;quot;Connected to &amp;quot; );&lt;br /&gt;
	Serial.println ( ssid );&lt;br /&gt;
	Serial.print ( &amp;quot;IP address: &amp;quot; );&lt;br /&gt;
	Serial.println ( WiFi.localIP() );&lt;br /&gt;
&lt;br /&gt;
	server.on ( &amp;quot;/&amp;quot;, handleRoot );&lt;br /&gt;
        server.on(&amp;quot;/buzz&amp;quot;, handleBuzz);&lt;br /&gt;
	server.on ( &amp;quot;/hello&amp;quot;, []() {&lt;br /&gt;
		server.send ( 200, &amp;quot;text/plain&amp;quot;, &amp;quot;hi, how ya doin?&amp;quot; );&lt;br /&gt;
	} );&lt;br /&gt;
	server.onNotFound ( handleNotFound );&lt;br /&gt;
	server.begin();&lt;br /&gt;
	Serial.println ( &amp;quot;HTTP server started&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop ( void ) {&lt;br /&gt;
        &lt;br /&gt;
        if (digitalRead(pir)) {&lt;br /&gt;
          // Do something interesting on motion&lt;br /&gt;
        } else {&lt;br /&gt;
          // Nothing new here&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // LED on if motion == true&lt;br /&gt;
        digitalWrite(led, digitalRead(pir));&lt;br /&gt;
&lt;br /&gt;
	server.handleClient();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Group order 01/2015 =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prices are from the same store, and are competitive within a few cents.&lt;br /&gt;
&lt;br /&gt;
* ESP-12, Without breakout (Option A): $2.60 [http://www.aliexpress.com/store/product/Free-Shipping-10pcs-lot-ESP8266-remote-serial-Port-WIFI-wireless-module-through-walls-Wang-ESP-12/413752_32243298445.html aliex]&lt;br /&gt;
* ESP-12, with breakout board, battery socket, resistors, and power regulator (2.54mm pitch): $4.50 [http://www.aliexpress.com/item/Free-shipping-10pcs-lot-ESP8266-ESP-12-serial-WIFI-Industrial-stable-version-A-full-test-board/32260087529.html aliex]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Order Participants ===&lt;br /&gt;
Put your name, email, and quantity of With and Without breakout desired.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name&lt;br /&gt;
! Email&lt;br /&gt;
! No Breakout&lt;br /&gt;
! Breakout&lt;br /&gt;
|- &lt;br /&gt;
| Casey&lt;br /&gt;
| c1@caseyc.net&lt;br /&gt;
| 0&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| Adrian&lt;br /&gt;
| adrian@freebsd&lt;br /&gt;
| 0&lt;br /&gt;
| 5&lt;br /&gt;
|-&lt;br /&gt;
| Naomi&lt;br /&gt;
| naomi at nthmost&lt;br /&gt;
| 0&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| Dana&lt;br /&gt;
| dsniezko at sonic net&lt;br /&gt;
| 0&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| Patrick&lt;br /&gt;
| p@trickod.com&lt;br /&gt;
| 0&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| Les Jones&lt;br /&gt;
|&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| Brad&lt;br /&gt;
| brad.schwagler at gmail&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| Torrie&lt;br /&gt;
| tdfischer at hackerbots&lt;br /&gt;
| 10&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| Jake&lt;br /&gt;
| jake at spaz odt org&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| Henner&lt;br /&gt;
| h.zeller at acm.org&lt;br /&gt;
| 10&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| John E.&lt;br /&gt;
| neurofog@gmail.com&lt;br /&gt;
| 2&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| devin&lt;br /&gt;
| &amp;lt;- that at doormouse org&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| Scotty&lt;br /&gt;
| &amp;lt;- that at scottyallen com&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| Tom&lt;br /&gt;
| &amp;lt;- that at tomdee.co.uk&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| mct&lt;br /&gt;
| mct at toren dot net&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| adi&lt;br /&gt;
| adi@hexapodia.org&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| ondine&lt;br /&gt;
| okilker at gmail&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=ESP8266/OTA&amp;diff=50059</id>
		<title>ESP8266/OTA</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=ESP8266/OTA&amp;diff=50059"/>
		<updated>2015-11-10T22:59:45Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Exploring Over The Air (OTA) updates.&lt;br /&gt;
&lt;br /&gt;
* https://harizanov.com/2015/06/firmware-over-the-air-fota-for-esp8266-soc/&lt;br /&gt;
&lt;br /&gt;
There is an OTA option in the Arduino IDE, however there doesn&#039;t seem to be much on how to use it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff6600;font-family:courier;font-size:24pt&amp;quot;&amp;gt;&#039;&#039;&#039;UPDATED&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This now potentially actually works with Arduino IDE 1.6.5 r5&lt;br /&gt;
&lt;br /&gt;
In processes documentation&lt;br /&gt;
&lt;br /&gt;
* https://github.com/esp8266/Arduino/blob/master/doc/ota_updates.md&lt;br /&gt;
&lt;br /&gt;
* https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266mDNS/examples/OTA-mDNS-SPIFFS/OTA-mDNS-SPIFFS.ino&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It&#039;s also important to know the flash memory size, ESP.getFlashChipSize() may be useful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Serial.println(&amp;quot;Flash Memory Stuff&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;ESP ID: &amp;quot;);&lt;br /&gt;
  Serial.println(ESP.getChipId(), HEX);&lt;br /&gt;
 &lt;br /&gt;
  Serial.println(&amp;quot;Flash ID: &amp;quot;);&lt;br /&gt;
  Serial.println(ESP.getFlashChipId(), HEX);&lt;br /&gt;
  Serial.println(&amp;quot;Flash Size: &amp;quot;);&lt;br /&gt;
  Serial.println(ESP.getFlashChipSize());&lt;br /&gt;
  Serial.println(&amp;quot;Flash Speed: &amp;quot;);&lt;br /&gt;
  Serial.println(ESP.getFlashChipSpeed());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Serial output from an ESP-01&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ESP ID: &lt;br /&gt;
DCED75&lt;br /&gt;
Flash ID: &lt;br /&gt;
1440E0&lt;br /&gt;
Flash Size: &lt;br /&gt;
4194304&lt;br /&gt;
Flash Speed: &lt;br /&gt;
40000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;Note: Updated to HEX formatting of numbers. Flash Size returned seems to be whatever option you have set in the IDE, and may not reference the actual hardware size.&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=ESP8266/OTA&amp;diff=50058</id>
		<title>ESP8266/OTA</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=ESP8266/OTA&amp;diff=50058"/>
		<updated>2015-11-10T22:49:26Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Exploring Over The Air (OTA) updates.&lt;br /&gt;
&lt;br /&gt;
* https://harizanov.com/2015/06/firmware-over-the-air-fota-for-esp8266-soc/&lt;br /&gt;
&lt;br /&gt;
There is an OTA option in the Arduino IDE, however there doesn&#039;t seem to be much on how to use it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff6600;font-family:courier;font-size:24pt&amp;quot;&amp;gt;&#039;&#039;&#039;UPDATED&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This now potentially actually works with Arduino IDE 1.6.5 r5&lt;br /&gt;
&lt;br /&gt;
* https://github.com/esp8266/Arduino/tree/master/libraries/ArduinoOTA&lt;br /&gt;
&lt;br /&gt;
In processes documentation&lt;br /&gt;
&lt;br /&gt;
* https://github.com/esp8266/Arduino/blob/master/doc/ota_updates.md&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It&#039;s also important to know the flash memory size, ESP.getFlashChipSize() may be useful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Serial.println(&amp;quot;Flash Memory Stuff&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;ESP ID: &amp;quot;);&lt;br /&gt;
  Serial.println(ESP.getChipId(), HEX);&lt;br /&gt;
 &lt;br /&gt;
  Serial.println(&amp;quot;Flash ID: &amp;quot;);&lt;br /&gt;
  Serial.println(ESP.getFlashChipId(), HEX);&lt;br /&gt;
  Serial.println(&amp;quot;Flash Size: &amp;quot;);&lt;br /&gt;
  Serial.println(ESP.getFlashChipSize());&lt;br /&gt;
  Serial.println(&amp;quot;Flash Speed: &amp;quot;);&lt;br /&gt;
  Serial.println(ESP.getFlashChipSpeed());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Serial output from an ESP-01&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ESP ID: &lt;br /&gt;
DCED75&lt;br /&gt;
Flash ID: &lt;br /&gt;
1440E0&lt;br /&gt;
Flash Size: &lt;br /&gt;
4194304&lt;br /&gt;
Flash Speed: &lt;br /&gt;
40000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;Note: Updated to HEX formatting of numbers. Flash Size returned seems to be whatever option you have set in the IDE, and may not reference the actual hardware size.&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=ESP8266/OTA&amp;diff=50028</id>
		<title>ESP8266/OTA</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=ESP8266/OTA&amp;diff=50028"/>
		<updated>2015-11-08T19:23:14Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Exploring Over The Air (OTA) updates.&lt;br /&gt;
&lt;br /&gt;
* https://harizanov.com/2015/06/firmware-over-the-air-fota-for-esp8266-soc/&lt;br /&gt;
&lt;br /&gt;
There is an OTA option in the Arduino IDE, however there doesn&#039;t seem to be much on how to use it.&lt;br /&gt;
&lt;br /&gt;
* https://github.com/esp8266/Arduino/tree/master/libraries/ArduinoOTA&lt;br /&gt;
&lt;br /&gt;
In processes documentation&lt;br /&gt;
&lt;br /&gt;
* https://github.com/esp8266/Arduino/blob/master/doc/ota_updates.md&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It&#039;s also important to know the flash memory size, ESP.getFlashChipSize() may be useful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Serial.println(&amp;quot;Flash Memory Stuff&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;ESP ID: &amp;quot;);&lt;br /&gt;
  Serial.println(ESP.getChipId(), HEX);&lt;br /&gt;
 &lt;br /&gt;
  Serial.println(&amp;quot;Flash ID: &amp;quot;);&lt;br /&gt;
  Serial.println(ESP.getFlashChipId(), HEX);&lt;br /&gt;
  Serial.println(&amp;quot;Flash Size: &amp;quot;);&lt;br /&gt;
  Serial.println(ESP.getFlashChipSize());&lt;br /&gt;
  Serial.println(&amp;quot;Flash Speed: &amp;quot;);&lt;br /&gt;
  Serial.println(ESP.getFlashChipSpeed());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Serial output from an ESP-01&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ESP ID: &lt;br /&gt;
DCED75&lt;br /&gt;
Flash ID: &lt;br /&gt;
1440E0&lt;br /&gt;
Flash Size: &lt;br /&gt;
4194304&lt;br /&gt;
Flash Speed: &lt;br /&gt;
40000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;Note: Updated to HEX formatting of numbers. Flash Size returned seems to be whatever option you have set in the IDE, and may not reference the actual hardware size.&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=ESP8266/OTA&amp;diff=49907</id>
		<title>ESP8266/OTA</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=ESP8266/OTA&amp;diff=49907"/>
		<updated>2015-11-04T01:57:48Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Exploring Over The Air (OTA) updates.&lt;br /&gt;
&lt;br /&gt;
* https://harizanov.com/2015/06/firmware-over-the-air-fota-for-esp8266-soc/&lt;br /&gt;
&lt;br /&gt;
There is an OTA option in the Arduino IDE, however there doesn&#039;t seem to be much on how to use it.&lt;br /&gt;
&lt;br /&gt;
* https://github.com/esp8266/Arduino/tree/master/libraries/ArduinoOTA&lt;br /&gt;
&lt;br /&gt;
It&#039;s also important to know the flash memory size, ESP.getFlashChipSize() may be useful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Serial.println(&amp;quot;Flash Memory Stuff&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;ESP ID: &amp;quot;);&lt;br /&gt;
  Serial.println(ESP.getChipId(), HEX);&lt;br /&gt;
 &lt;br /&gt;
  Serial.println(&amp;quot;Flash ID: &amp;quot;);&lt;br /&gt;
  Serial.println(ESP.getFlashChipId(), HEX);&lt;br /&gt;
  Serial.println(&amp;quot;Flash Size: &amp;quot;);&lt;br /&gt;
  Serial.println(ESP.getFlashChipSize());&lt;br /&gt;
  Serial.println(&amp;quot;Flash Speed: &amp;quot;);&lt;br /&gt;
  Serial.println(ESP.getFlashChipSpeed());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Serial output from an ESP-01&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ESP ID: &lt;br /&gt;
DCED75&lt;br /&gt;
Flash ID: &lt;br /&gt;
1440E0&lt;br /&gt;
Flash Size: &lt;br /&gt;
4194304&lt;br /&gt;
Flash Speed: &lt;br /&gt;
40000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;Note: Updated to HEX formatting of numbers. Flash Size returned seems to be whatever option you have set in the IDE, and may not reference the actual hardware size.&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=ESP8266/OTA&amp;diff=49905</id>
		<title>ESP8266/OTA</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=ESP8266/OTA&amp;diff=49905"/>
		<updated>2015-11-04T01:22:55Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: Memory probe #ff6600&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Exploring Over The Air (OTA) updates.&lt;br /&gt;
&lt;br /&gt;
There is an OTA option in the Arduino IDE, however there doesn&#039;t seem to be much on how to use it.&lt;br /&gt;
&lt;br /&gt;
It&#039;s also important to know the flash memory size, ESP.getFlashChipSize() may be useful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Serial.println(&amp;quot;Flash Memory Stuff&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;ESP ID: &amp;quot;);&lt;br /&gt;
  Serial.println(ESP.getChipId());&lt;br /&gt;
 &lt;br /&gt;
  Serial.println(&amp;quot;Flash ID: &amp;quot;);&lt;br /&gt;
  Serial.println(ESP.getFlashChipId());&lt;br /&gt;
  Serial.println(&amp;quot;Flash Size: &amp;quot;);&lt;br /&gt;
  Serial.println(ESP.getFlashChipSize());&lt;br /&gt;
  Serial.println(&amp;quot;Flash Speed: &amp;quot;);&lt;br /&gt;
  Serial.println(ESP.getFlashChipSpeed());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Serial output from an ESP-01&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Flash Memory Stuff&lt;br /&gt;
ESP ID: &lt;br /&gt;
14478709&lt;br /&gt;
Flash ID: &lt;br /&gt;
1327328&lt;br /&gt;
Flash Size: &lt;br /&gt;
524288&lt;br /&gt;
Flash Speed: &lt;br /&gt;
40000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* https://harizanov.com/2015/06/firmware-over-the-air-fota-for-esp8266-soc/&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
	<entry>
		<id>https://replica.wiki.extremist.software/index.php?title=ESP8266/OTA&amp;diff=49904</id>
		<title>ESP8266/OTA</title>
		<link rel="alternate" type="text/html" href="https://replica.wiki.extremist.software/index.php?title=ESP8266/OTA&amp;diff=49904"/>
		<updated>2015-11-04T01:01:56Z</updated>

		<summary type="html">&lt;p&gt;ESP8266: do it Over Teh Air $ff6600&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Exploring Over The Air (OTA) updates.&lt;br /&gt;
&lt;br /&gt;
There is an OTA option in the Arduino IDE, however there doesn&#039;t seem to be much on how to use it.&lt;br /&gt;
&lt;br /&gt;
It&#039;s also important to know the flash memory size, ESP.getFlashChipSize() may be useful.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* https://harizanov.com/2015/06/firmware-over-the-air-fota-for-esp8266-soc/&lt;/div&gt;</summary>
		<author><name>ESP8266</name></author>
	</entry>
</feed>