%=============================================================================== % 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 { \frametitle{Outline} \tableofcontents[currentsection,hideallsubsections] } } %\AtBeginSubsection[] %{ % \frame % { % \frametitle{Outline} % \tableofcontents[sectionstyle=show/hide,subsectionstyle=show/shaded/hide,subsubsectionstyle=hide] % } %} % %\AtBeginSubsubsection[] %{ % \frame % { % \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{}-Drücke \item Docker: \texttt{docker-compose run esp} (evtl. TTY anpassen) \end{itemize} Windows: \begin{itemize} \item PuTTY \item Serielle Verbindung \item 115200 Baud \item $n$ beherzte \textit{}-Drücke \end{itemize} %TODO: bild mit REPL (inkl ENTERs) \end{frame} \lstset{language=Python,captionpos=b} \begin{frame}{REPL} \framesubtitle{Hello World!} %TODO: bild \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 (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} \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/", 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} TODO schema \end{frame} \begin{frame}[fragile]{LEDs} \begin{lstlisting}[caption={LED},label=led] import machine, time, math pin = machine.Pin(0, machine.Pin.OUT) pin.on() pin.off() pwm = machine.PWM(pin) pwm.duty(512) pwm.deinit() 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} TODO: schema \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} TODO: schema \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} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%% 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}