%=============================================================================== % 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: ~19 \item Kosten: \EUR{8} pro Set \begin{itemize} \item Bank of WIAI \item \url{https://www.paypal.me/clkl/8} \item Cash \end{itemize} \end{itemize} \begin{figure}[H] %\centering %\flushright \includegraphics[width=.3\textwidth]{qr} \label{img:qr} \end{figure} \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} \end{itemize} Lowlevel: C, Arduino Studio \end{frame} \section{Setup} \subsection{Tools} \begin{frame}{Tools} Linux \begin{itemize} \item Debian, Gentoo (testing): \texttt{\{apt install,emerge\} esptool picocom} \item Ubuntu: \texttt{pip3 install esptool \&\& apt install picocom} \item \texttt{adduser \$USER dialout} \item neuer Login (sudo su \$USER) %\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 Homebrew (\url{https://brew.sh}) installieren \item \texttt{brew install python3 \&\& pip install esptool} \end{itemize} \end{frame} \subsection{Firmware} \begin{frame}{Firmware} Windows-Spezial: \begin{itemize} \item Portbezeichner: Gerätemanager $\rightarrow$ Serielle Geräte (COM+LPT) $\rightarrow$ COM$X$ (z.B. COM12) \end{itemize} Flashen: \begin{itemize} \item MicroPython Download: \url{https://micropython.org/download\#esp8266} (esp8266-20171101-v1.9.3) \item[*nix] \texttt{esptool.py -{}-port /dev/ttyUSB0 erase\_flash} \item[win] \texttt{python -m esptool -{}-port COM12 erase\_flash} \item[*nix] \texttt{esptool.py -{}-port /dev/ttyUSB0 -{}-baud 460800 write\_flash -{}-flash\_size=detect 0 esp8266-20171101-v1.9.3.bin} \item[win] \texttt{python -m esptool -{}-port COM12 -{}-baud 460800 write\_flash -{}-flash\_size=detect 0 esp8266-20171101-v1.9.3.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) \item[exit] Ctrl-a Ctrl-x \item Alternativ: screen, \dots \end{itemize} Windows: \begin{itemize} \item PuTTY \item Serielle Verbindung \item 115200 Baud \item $n$ beherzte \textit{}-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('wiaiot', 'wiaiotoiaiw') 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 WebREPL einrichten (\textit{import webrepl \& webrepl.start()}) \item WebREPL Client \url{http://micropython.org/webrepl/} \item IP des ESP's für WebSocket verwenden (\textit{sta\_if.ifconfig()}) \item Datei Up-/Download (z.B. für main.py) \end{itemize} \end{frame} \subsection{Init} \begin{frame}[fragile]{main.py} Wird beim starten \dots gestartet \begin{lstlisting}[caption={main.py},label=mainpy] from secrets import SSID, PASS def connect_wifi(ssid=SSID, passphrase=PASS): #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.debug = True @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")) return "You were here!" \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 --host 0.0.0.0 \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) 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} \lstset{tabsize=6} \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}{Interrupts} \framesubtitle{Here be dragons} \begin{itemize} \item Z.B. Callbacks von Tastern \item pausieren main \item dürfen keinen Speicher allozieren \begin{itemize} \item[\checkmark] \textit{alarm = True \#only with previously allocated variable!} \item[\checkmark] \textit{counter = counter + 1} \item[\checkmark] \textit{interrupts[2] += 1} \item[X] \textit{events.append(Interrupt())} \item[X] \textit{} \end{itemize} \item Emergency exception buffer: \textit{micropython.alloc\_emergency\_exception\_buf(100)} \end{itemize} Siehe Doku :) \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}