An open API service indexing awesome lists of open source software.

https://github.com/accso/learning-iot

Learning IoT HAT for D1 Mini ESP8266 based boards
https://github.com/accso/learning-iot

Last synced: 9 months ago
JSON representation

Learning IoT HAT for D1 Mini ESP8266 based boards

Awesome Lists containing this project

README

          

README.md

/* https://github.com/microsoft/vscode/blob/master/extensions/markdown-language-features/media/markdown.css */
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

body {
font-family: var(--vscode-markdown-font-family, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif);
font-size: var(--vscode-markdown-font-size, 14px);
padding: 0 26px;
line-height: var(--vscode-markdown-line-height, 22px);
word-wrap: break-word;
}

#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}

#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}

body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}

body.showEditorSelection .code-line {
position: relative;
}

body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}

body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}

.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}

.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}

.vscode-light.showEditorSelection .code-line .code-line:hover:before {
border-left: none;
}

.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}

.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}

.vscode-dark.showEditorSelection .code-line .code-line:hover:before {
border-left: none;
}

.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}

.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}

.vscode-high-contrast.showEditorSelection .code-line .code-line:hover:before {
border-left: none;
}

img {
max-width: 100%;
max-height: 100%;
}

a {
text-decoration: none;
}

a:hover {
text-decoration: underline;
}

a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}

hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}

h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}

h1, h2, h3 {
font-weight: normal;
}

table {
border-collapse: collapse;
}

table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}

table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}

table > tbody > tr + tr > td {
border-top: 1px solid;
}

blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left-width: 5px;
border-left-style: solid;
}

code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 1em;
line-height: 1.357em;
}

body.wordWrap pre {
white-space: pre-wrap;
}

pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}

pre code {
color: var(--vscode-editor-foreground);
tab-size: 4;
}

/** Theming */

.vscode-light pre {
background-color: rgba(220, 220, 220, 0.4);
}

.vscode-dark pre {
background-color: rgba(10, 10, 10, 0.4);
}

.vscode-high-contrast pre {
background-color: rgb(0, 0, 0);
}

.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}

.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}

.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}

.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}

.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}

/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */

/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}

/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}

/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}

/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}

/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}

/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}

/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}

.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}

.hljs-emphasis {
font-style: italic;
}

.hljs-strong {
font-weight: bold;
}

/*
* Markdown PDF CSS
*/

body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif, "Meiryo";
padding: 0 12px;
}

pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}

pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}

blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}

.emoji {
height: 1.4em;
}

code {
font-size: 14px;
line-height: 19px;
}

/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}

/* Page Break : use <div class="page"/> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}


mermaid.initialize({
startOnLoad: true,
theme: document.body.classList.contains('vscode-dark') || document.body.classList.contains('vscode-high-contrast')
? 'dark'
: 'default'
});

Learning IoT


Goody for Building IoT in Munich 25. - 27. April 2023.


Images PCB




Pin List


GPIO
Pin
Function

GPIO0
D3
Button / SW1

GPIO2
D4
LED Green

GPIO15
D8
LED Blue

GPIO16
D0
LED Red

Bill of Materials (BOM)



All components can be ordered at http://reichelt.de

Order Number
Description

D1
1
LED LL 5-8000RGBRGB-LED
5 mm, bedrahtet, 4-Pin, rt/gn/bl, 8000 mcd, 25°

SW1
1
TASTER 3301
Kurzhubtaster 6x6mm, Höhe: 4,3mm, 12V, vertikal

U1
2
MPE 087-1-008
Stiftleisten 2,54 mm, 1X08, gerade

R4
1
1/4W 10K
Widerstand, Kohleschicht, 10 kOhm, 0207, 250 mW, 5

R1-3
3
1/4W 300
Widerstand, Kohleschicht, 300 Ohm, 0207, 250 mW, 5%

1
ESD BEUTEL-S 127
ESD PE-Abschirmbeutel, wiederverschließbar, 76 x 127 mm

Schematic



Assembly



  1. Bend the wires of the resistors by 90°


  2. Put the resistors through the holes (R4 is 10k while R1-3 is 330 Ohms)


  3. Bend the wires by 30° and cut the pins, so 1mm wire is still visible from the bottom


  4. Put the tactile button through the holes as described in following picture


  5. Put the LEDs through the holes with the flatted side pointed in direction of the push button

  6. Bend the outer wires by 30° and cut all wires, so 1mm wire is still visible from the bottom


  7. Solder all components


  8. Solder the pin headers (male) downwards


  9. Solder the pin headers (female) on top of D1 mini, so the shield can be put on top.




Flashing firmware


See the latest release at the release page of Github!


Install Firmware:


pip3 install esptool
python3 -m esptool --port /dev/tty.usbserial-1440 --baud 115200 erase_flash
python3 -m esptool --port /dev/tty.SLAB_USBtoUART --baud 115200 write_flash 0x0 firmware-v1.0-esp8266_learning-iot.bin

WiFi-AP:

SSID: Accso Learning IoT

Key: Accso Learning IoT


URL

http://192.168.4.1

http://accso-learning-iot.local


Config-Area:

User: admin

Password: admin


SW API


Initialize Board


To initialize the Learning IoT Board requires as parameter the pointer to the web server handling REST-API calls.


LIoTBoard.begin(&webServer);

Setting LEDs


void LIoTBoard.setLed(String color);

color: Color as string. Can be:
- "black"
- "red"
- "green"
- "yellow"
- "blue"
- "purple"
- "cyan"
- "white"


void LIoTBoard.setLed(bool bRed, bool bGreen, bool bBlue);

bRed: LED red true = on, false = off

bGreen: LED green true = on, false = off

bBlue: LED blue true = on, false = off


Read button


bool LIoTBoard.getButtonPressed(void);

returns: true if button pressed and false if button is released


Getting started


Driving LED without board support


basic.ino


#define LED_RED 16 // D0
#define LED_GREEN 2 // D4
#define LED_BLUE 15 // D8
#define BUTTON 0 // D3

void setup(void)
{
pinMode(LED_RED,OUTPUT);
pinMode(LED_GREEN,OUTPUT);
pinMode(LED_BLUE,OUTPUT);
pinMode(BUTTON,INPUT);
}

void loop(void)
{
// blink red LED
digitalWrite(LED_RED,HIGH);
delay(500);
digitalWrite(LED_RED,LOW);
delay(500);

// blink green LED
digitalWrite(LED_GREEN,HIGH);
delay(500);
digitalWrite(LED_GREEN,LOW);
delay(500);

// blink blue LED
digitalWrite(LED_BLUE,HIGH);
delay(500);
digitalWrite(LED_BLUE,LOW);
delay(500);

// wait for button pressed (blocking)
while(digitalRead(BUTTON))
{
delay(1);
}
}


Driving LED with board support


board-support.ino


# requires to add liotboard.h and liotboard.cpp to the project
#include "liotboard.h"

void setup(void)
{
LIoTBoard.begin();

LIoTBoard.setLed("red");
}

void loop(void)
{
LIoTBoard.update();
if (LIoTBoard.getButtonPressed())
{
LIoTBoard.setLed("green");
} else
{
LIoTBoard.setLed("red");
}
}


REST API Example


POST data with JSON content /api/status:



  • "red": LED Red, allowed values: "true" or "false"

  • "green": LED Green, allowed values: "true" or "false"

  • "blue": LED Blue, allowed values: "true" or "false"

  • "button": Button change overwrite, allowed values: "true" or "false"


GET data as JSON format /api/status:



  • "red": LED Red, allowed values: "true" or "false"

  • "green": LED Green, allowed values: "true" or "false"

  • "blue": LED Blue, allowed values: "true" or "false"

  • "button": Button status, allowed values: "true" or "false"


restapi.ino


#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

# requires to add liotboard.h and liotboard.cpp to the project
#include "liotboard.h"

#ifndef STASSID
#define STASSID "your-ssid"
#define STAPSK "your-password"
#endif

const char* ssid = STASSID;
const char* password = STAPSK;

ESP8266WebServer server(80);

void handleRoot() {
server.send(200, "text/plain", "hello from esp8266!\r\n");
}

void setup(void) {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");

// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());

if (MDNS.begin("esp8266")) { Serial.println("MDNS responder started"); }

LIoTBoard.begin(&server);
server.on("/", handleRoot);

server.begin();
Serial.println("HTTP server started");
}

void loop(void) {
server.handleClient();
MDNS.update();
}