%===============================================================================
% Zweck:    KTR-Präsentation-Vorlage
% Erstellt: 15.04.2013
% Update:   04.07.2016
% Autor:    M.G.
%===============================================================================

\newcommand\ratio{169}
\documentclass[10pt,aspectratio=\ratio,
%draft,
%handout,
compress
]{beamer}

\newcommand\meta{./meta}
\input{\meta/config/commands}


\def\signed #1{{\leavevmode\unskip\nobreak\hfil\penalty50\hskip2em
  \hbox{}\nobreak\hfil(#1)%
  \parfillskip=0pt \finalhyphendemerits=0 \endgraf}}

\newsavebox\mybox
\newenvironment{aquote}[1]
  {\savebox\mybox{#1}\begin{fancyquotes}}
  {\signed{\usebox\mybox}\end{fancyquotes}}


\input{\meta/config/hyphenation}

\setbeamertemplate{caption}[numbered]
%\numberwithin{figure}{section}

\begin{document}
  %===============================================================================
  % Zum Kompilieren latexmk ausführen.
  %	Konfiguration in texmaker: Options -> Configure Texmaker -> Quick Build -> Select Latexmk + ViewPD
  %	Entsprechende Informationen in den config/metainfo verändern
  % Zur Auswahl der Sprache im folgenden Befehl
  % ngerman für deutsch eintragen, english für Englisch.
  %===============================================================================
\selectlanguage{ngerman}
\ifnum\ratio<169
\frame{\titlepage}
\else
\frame[plain]{\titlepage}
\fi

\AtBeginSection[]
{
  \frame<handout:0>
  {
    \frametitle{Outline}
    \tableofcontents[currentsection,hideallsubsections]
  }
}

%\AtBeginSubsection[]
%{
%  \frame<handout:0>
%  {
%    \frametitle{Outline}
%    \tableofcontents[sectionstyle=show/hide,subsectionstyle=show/shaded/hide,subsubsectionstyle=hide]
%  }
%}
%
%\AtBeginSubsubsection[]
%{
%  \frame<handout:0>
%  {
%    \frametitle{Outline}
%    \tableofcontents[sectionstyle=show/hide,subsectionstyle=show/shaded/hide,subsubsectionstyle=show/shaded/hide]
%  }
%}

\newcommand<>{\highlighton}[1]{%
  \alt#2{\structure{#1}}{{#1}}
}

\newcommand{\icon}[1]{\pgfimage[height=1em]{#1}}

\section*{}
\phantomsection
\begin{frame}{First things first}\framesubtitle{Hardwareausgabe}
\begin{itemize}
	\item Verfügbare Sets: 20
	\item Reserviert: ~15
	\item Kosten: \EUR{8} pro Set
\end{itemize}
\end{frame}
\begin{frame}{Content}
\tableofcontents
\end{frame}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%% Content starts here %%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{ESP8266}
\subsection{Hardware}
\begin{frame}{ESP8266}
\begin{itemize}
	\item 80 MHz, 64 kB RAM (Code), 96 kB RAM (Daten)
	\item 4 MB Flashspeicher
	\item Ardunio-kompatibel
	\item Open Source Hardware
	\item Billige China-Klone :)
\end{itemize}
\image{.6\textwidth}{esp8266}{ESP8266 + NodeMCU v3 \cite{esp8266}}{img:esp}
\end{frame}
\begin{frame}{ESP8266 - Pins}
\image{.6\textwidth}{pinmap}{ESP8266 Pins \cite{pinmap}}{img:pins}
\end{frame}

\subsection{Software}
\begin{frame}{ESP8266}
\href{http://nodemcu.com/index_en.html}{NodeMCU}
\begin{itemize}
	\item Open Source Firmware
	\item Lua-Skriptbare Umgebung
	\item Doku: \url{https://nodemcu.readthedocs.io/en/master/} 
\end{itemize}
Cooler: \href{https://micropython.org/}{MicroPython}
\begin{itemize}
	\item Basiert auf Python 3
	\item Frei \& Open Source
	\item Einige Funktionalität eingeschränkt (z.B. Multithreading)
	\item Verscheidene Boards/Controller unterstützt: PyBoard, ESP32, \dots
	\item Doku: \url{http://docs.micropython.org/en/latest/esp8266/index.html} (\url{http://iot.wiai/doc})
\end{itemize}
Lowlevel: C, Arduino Studio
\end{frame}

\section{Setup}
\subsection{Tools}
\begin{frame}{Tools}\framesubtitle{Alle Downloads unter \url{http://iot.wiai/}}
Linux
\begin{itemize}
	\item Debian, Gentoo (testing): \texttt{\{apt install,emerge\} esptool picocom}
	\item \texttt{adduser \$USER dialout}
	\item Alternative: Docker (bin/docker): \textit{docker-compose run esp esptool}
\end{itemize}
Windows
\begin{itemize}
	\item \url{https://www.python.org}, z.B. 3.6.2
		\begin{itemize}
		\item Option \textit{Add Python to PATH} aktivieren
		\end{itemize}
	\item \texttt{pip install esptool}
	\item \url{https://www.chiark.greenend.org.uk/~sgtatham/putty/download.html}
	\item CH340G Treiber: \url{http://www.wch.cn/download/CH341SER\_ZIP.html}
\end{itemize}
Mac
\begin{itemize}
	\item Irgendwie so ähnlich\dots
\end{itemize}
Offline pip: \textit{pip install -f http://iot.wiai/webrepl/}%TODO: --no-index?
\end{frame}

\subsection{Firmware}
\begin{frame}{Firmware}\framesubtitle{Alle Downloads unter \url{http://iot.wiai/}}
Windows-Spezial:
\begin{itemize}
	\item Portbezeichner: Gerätemanager $\rightarrow$ Serielle Geräte (COM+LPT) $\rightarrow$ COM$X$
	\item python -m esptool
\end{itemize}
Flashen:
\begin{itemize}
	\item \url{https://micropython.org/download\#esp8266} %TODO: WIAI-link
	\item \texttt{esptool.py --port /dev/ttyUSB0 erase\_flash}
	\item \texttt{esptool.py --port /dev/ttyUSB0 --baud 460800 write\_flash --flash\_size=detect 0 esp8266-20170823-v1.9.2.bin}
	\item reset
\end{itemize}
\end{frame}

\subsection{REPL}
\begin{frame}{Serielle Konsole}
*nixe:
\begin{itemize}
	\item \texttt{picocom -b 115200 /dev/ttyUSB0}
	\item $n$ beherzte \textit{<ENTER>}-Drücke
	\item Docker: \texttt{docker-compose run esp} (evtl. TTY anpassen)
	\item[exit] Ctrl-a Ctrl-x
\end{itemize}
Windows:
\begin{itemize}
	\item PuTTY
	\item Serielle Verbindung
	\item 115200 Baud
	\item $n$ beherzte \textit{<ENTER>}-Drücke
\end{itemize}
\end{frame}

\lstset{language=Python,captionpos=b}

\begin{frame}{REPL}
\framesubtitle{Hello World!}
\image{.7\textwidth}{repl}{REPL}{img:repl}
\end{frame}


\subsection{WLAN}
\begin{frame}[fragile]{WLAN}\framesubtitle{Put the I in IoT}
\begin{lstlisting}[caption={Descriptive Caption Text},label=DescriptiveLabel]
import network
sta_if = network.WLAN(network.STA_IF)
ap_if = network.WLAN(network.AP_IF)

ap_if.active(False)
sta_if.active(True)

sta_if.connect('SSID', 'SECRET') # TODO: setup
sta_if.isconnected()
sta_if.ifconfig()
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]{WebREPL}
\begin{lstlisting}[caption={Setup für WebREPL},label=webrepl]
import webrepl_setup
\end{lstlisting}
\begin{itemize}
	\item \textit{import webrepl\_setup}
	\item reset/start webrepl (\textit{import webrepl \& webrepl.start()})
	\item visit \url{http://iot.wiai/webrepl/} or \url{http://micropython.org/webrepl/}
	\item enter your ESP's IP (\textit{sta\_if.ifconfig()}) \& connect
\end{itemize}
\end{frame}

\subsection{Init}
\begin{frame}[fragile]{main.py}
	Wird beim starten ... gestartet
	
\begin{lstlisting}[caption={main.py},label=mainpy]
def connect_wifi(ssid, passphrase):
	#TODO ;)
	pass

def setup():
	#TODO configure sensors, ...
	pass

connect_wifi()
setup()
\end{lstlisting}
\end{frame}

\subsection{Exkurs: Flask-Server}
\begin{frame}[fragile]{Gegenseite: Flask}
\begin{lstlisting}[caption={C\&C Server},label=cnc]
from flask import Flask, request
app = Flask(__name__)
@app.route("/")
def hello():
	return "Hello ESP8266!"
@app.route("/id/<id:id>", methods=['GET','POST'])
def log(id):
	app.logger.info("%s was here and delivered '%s'", id, request.data.decode("utf8"))
\end{lstlisting}
Starten:
\begin{itemize}
	\item[!] pip install Flask
	\item python server.py
	\item[||] docker-compose up (server.py in src/)
	\item[||] FLASK\_APP=server.py flask run
\end{itemize}
\end{frame}

\begin{frame}[fragile]{Daten übertragen}
\begin{lstlisting}[caption={HTTP Requests},label=http]
import urequests
host = "http://your.host.ip.here:5000"
response = urequests.get(host)q
print(response)

import machine
board_id = int.from_bytes(machine.unique_id(), 'little')
payload = '{"board": "{id}"}'.format(id=board_id)
json_header = {'Content-Type': 'application/json'}
post_url = "{host}/id/{id}".format(host=host, id=board_id)
urequests.post(post_url, data=data, headers=json_header)
\end{lstlisting}
\end{frame}


\section{Basteln}
\subsection{Blinkende LED}
\begin{frame}{LED anschließen}
\image{.4\textwidth}{node-led}{LED \cite{node-led}}{img:led}
\end{frame}
\begin{frame}[fragile]{LEDs}
\setbeamercovered{invisible}
\begin{lstlisting}[caption={LED},label=led,escapeinside={(*@}{@*)}]
import machine, time, math
pin = machine.Pin(0, machine.Pin.OUT)
pin.on()
pin.off()
(*@\onslide<2->@*)
pwm = machine.PWM(pin)
pwm.duty(512)
pwm.deinit()
(*@\onslide<3->@*)
def pulse(l, t):
	for i in range(20):
		l.duty(int(math.sin(i / 10 * math.pi) * 500 + 500))
		time.sleep_ms(t)
led = machine.PWM(machine.Pin(2), freq=1000)
pulse(led, 50)
for i in range(10):
	pulse(led, 20)
\end{lstlisting}

\end{frame}
\subsection{Schalter und Taster}
\begin{frame}[fragile]{Input}
\image{.35\textwidth}{button-nodemcu}{Taster \cite{node-button}}{img:button}
\begin{lstlisting}[caption={Input},label=input]
import machine
pin = machine.Pin(0, machine.Pin.IN, machine.Pin.PULL_UP)
# status = pin.value()
def callback(p):
	print('changed', p)
pin.irq(trigger=machine.Pin.IRQ_RISING | machine.Pin.IRQ_FALLING, handler=callback)
\end{lstlisting}
\end{frame}
\subsection{Sensoren}
\begin{frame}[fragile]{Sensoren}
\image{.35\textwidth}{nodemcu-dht22}{DHT22 \cite{node-dht}}{img:dht}
\begin{lstlisting}[caption={Sensoren},label=senors]
import dht
import machine
d = dht.DHT22(machine.Pin(4))
d.measure()
d.temperature()
d.humidity()
\end{lstlisting}
\end{frame}

\subsection{Interrupts}
\begin{frame}{Here be dragons}
	\begin{itemize}
		\item Z.B. Callbacks von Tastern
		\item pausieren main
		\item dürfen keinen Speicher allozieren
		\item Emergency exception buffer: \textit{micropython.alloc\_emergency\_exception\_buf(100)}
	\end{itemize}
	\cite{mp-interrupt}
\end{frame}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%% References          %%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section*{}
\begin{frame}[allowframebreaks]{References}
 \def\newblock{\hskip .11em plus .33em minus .07em}
 \scriptsize
 \bibliographystyle{IEEEtran}
 \bibliography{content/bib.bib}
 \normalsize
\end{frame}

\section*{Ausblick}
\begin{frame}{Was geht noch?}
\begin{itemize}
	\item \url{https://learn.adafruit.com/micropython-hardware-i2c-devices/overview}
	\item \url{http://luftdaten.info/}
	\item \url{https://micropython-on-esp8266-workshop.readthedocs.io/en/latest/index.html}
	\item \url{http://micropython-iot-hackathon.readthedocs.io/en/latest/index.html}
	\item MQTT, \href{http://nsq.io/}{nsq.io}
	\item Dateisystem
\end{itemize}
\end{frame}

\end{document}
