Schlagwort-Archive: ESP8266

BitBastelei #290 – MQTT (Protokoll, Mosquitto, ESP8266, HomeAssistant, TLS)

BitBastelei #290 - MQTT (Protokoll, Mosquitto, ESP8266, HomeAssistant, TLS)

(265 MB) 00:38:36

2018-07-01 10:00 🛈

In den letzten Jahren hat sich im Bereich der herstellerübergreifenden Hausautomation MQTT als Protokoll verbreitet. Schauen wir mal wie das Protokoll funktioniert, wie wir selbst einen Server aufsetzen und diesen absichern und letztentlich wie wir mit ESP8266 und HomeAssistant einen eigenen Sensor implementieren können.

Inhalt:

  • 00:00 Das Protokoll
  • 05:17 Installation von Mosquitto
  • 07:52 TLS und Passwörter mit Mosquitto
  • 22:28 MQTT mit HomeAssistant
  • 25:03 MQTT mit ESP8266/Arduino

Links:

  • Anleitung von Auxnet
  • Fingerprint-Befehl: echo | openssl s_client -connect localhost:1883 | openssl x509 -fingerprint -noout

Demo-Quellcode:
https://gist.github.com/adlerweb/807aee4a79a8dee043113d86172e7792
BitBastelei #290 – MQTT (Protokoll, Mosquitto, ESP8266, HomeAssistant, TLS) weiterlesen

BitBasics – ESP8266 – 2: DC-Lasten mit Transistoren schalten (LED, DC-Motoren, etc)

BitBasics - ESP8266 - 2: DC-Lasten mit Transistoren schalten (LED, DC-Motoren, etc)

(419 MB) 00:22:30

2018-04-29 10:00 🛈

Unseren ESP haben wir in der letzten Folge soweit vorbereitet, nun machen wir uns daran die ersten Ding anzubinden. Viele Geräte, welche nur wenig Strom brauchen, laufen mit Gleichspannung (DC, Direct Current). Dazu zählen unter anderem auch die meisten LEDs. Schauen wir mal, wie wir diese mit einem ESP an- und ausschalten können.

15:07 Negativ im Sinne von „geringer als VCC“

BitBasics – ESP8266 – 1b: Arduino Installation und Einrichtung unter Linux

BitBasics - ESP8266 - 1b: Arduino Installation und Einrichtung unter Linux

(34 MB) 00:09:03

2018-02-25 11:30 🛈

Um mit dem ESP8266 zu starten benötigen wir eine Programmierumgebung. In meiner Serie werde ich auf Arduino aufbauen, eine der verbreitetsten Systeme für den ESP und viele andere Mikrocontroller. In diesem Video zeige ich die Installation der Arduino-Umgebung und der nötigen Zusätze für den ESP8266 unter Ubuntu Linux. Weiterhin gebe ich einige Tipps, wie die Einrichtung auch unter anderen Linux-Distributionen funktionieren sollte.

Links:

BitBasics – ESP8266 – 1a1: Arduino Installation und Einrichtung unter Windows

BitBasics - ESP8266 - 1a1: Arduino Installation und Einrichtung unter Windows

(40 MB) 00:06:08

2018-02-25 11:00 🛈

Um mit dem ESP8266 zu starten benötigen wir eine Programmierumgebung. In meiner Serie werde ich auf Arduino aufbauen, eine der verbreitetsten Systeme für den ESP und viele andere Mikrocontroller. In diesem Video zeige ich die Installation der Arduino-Umgebung und der nötigen Zusätze für den ESP8266 unter Windows.

Links:

BitBasics – ESP8266 – 0: Einführung

BitBasics - ESP8266 - 0: Einführung

(72 MB) 00:09:53

2018-02-04 11:00 🛈

In dieser Serie werden wir und mit den Grundlagen rund um Arduino und den ESP8266 beschäftigen. Mit dieser Kombination kann man auch als Einsteiger schnell mächtige Mikrocontrollerprojekte umsetzen – egal ob blinkende LED oder IoT-Gerät.

In der Einführung spreche ich kurz über die geplanten Themen und die Unterschiede zwischen dem ESP8266 und den klassischen Arduino-Boards.

Korrekturen

  • 02:05 AVR war die Serie, der Hersteller hieß Atmel

Serie

  • Nächster Teil: folgt

Hardware

Links:

BitNotice #127 – USB Datenkabel

BitNotice #127 - USB Datenkabel

(19 MB) 00:05:26

2017-11-22 22:00 🛈

Der ESP8266 und seine USB-Module wie Wemos D1 Mini oder NodeMCU mögen praktisch sein, aber Probleme zu Debuggen kann auf Grund der pingeligen Stromanforderungen schon mal zur Qual werden. Zwar lässt sich mit einem batteriebetriebenen Laptop die Serielle Schnittstelle ohne Erdreferenz mitlesen, da der Laptop aber auch 5V zuspeist kann der Anschluss das Problem verschwinden lassen. Also improvisieren wir mal ein USB-Adapter, welcher die 5V-Leitung bei Bedarf auftrennen kann.

[ICStation.com] BitBastelei #261 – GPS-Tracker mit Neo-6/7-Module und ESP8266

[ICStation.com] BitBastelei #261 - GPS-Tracker mit Neo-6/7-Module und ESP8266

(111 MB) 00:40:34

2017-11-05 11:00 🛈

In der letzten Woche haben wir uns angesehen, wie Satellitennavigationssysteme wie GPS funktionieren, nun wollen wir diese auch in der Praxis nutzen. Da die Berechnungen komplex sind ist es auch hier eine gute Idee spezialisierte ICs zu verwenden, welche eine einfache Schnittstelle für Mikrocontroller bereitstellen. ICStation.com bietet hierzu ein Modul auf Basis des mächtigen U-Blox Neo M6/M7 an, welches über UART angesprochen werden kann. Schauen wir mal auf das Modul, welche Optionen die Konfigurationssoftware bietet, den Aufbau des NMEA-Protokolls und bauen am Ende einen GPS-Trakcer auf Basis des ESP8266.

Links

Code

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <NMEAGPS.h>
#include <SoftwareSerial.h>

/**
 * Required libs (see manager):
 *   - SoftwareSerial
 *   - NeoGPS
 */

#define RTCMEMORYSTART 65

extern "C" {
#include "user_interface.h"
}

//WiFi
const char* ssid = "freifunk-myk.de";
const char* pass = "";

//URL of ownTracks Recorder
const char* owntracksURL = "http://adlerweb-vm-owntracks.ffmyk:8083/pub";

//User and Device for ownTracks
const char* owntracksUser   = "esp8266-1";
const char* owntracksDevice = "esp8266-1";

//Sleep between GNSS checks in minutes
//const unsigned int sleep_off = 5;
const unsigned int sleep_off = 1;

//Time for GNSS warm-up in seconds
//const unsigned int sleep_GNSS = 30;
const unsigned int sleep_GNSS = 10;

//Time to wait for 3D-Fix before reverting to 2D in seconds
const unsigned int sleep_3d  = 30;

//Time to wait for 2D-Fix before reverting to RF in seconds
const unsigned int sleep_2d  = 60;

//RF Geolocation Todo https://github.com/m0xpd/ESP8266-GeoLocation/blob/master/ESP8266_GeoLocate_2.ino

//Geo-deviation in deg-fract(?)
const unsigned int fence = 5000;

//Force update after x minutes
const unsigned int rf_force = 720;

//Time to wait for RF-Connect before giving up in seconds
const unsigned int rf_timeout = 60;

//GNSS Power Switch
#define GNSS_PWR_PIN D4
#define GNSS_PWR_ON  LOW

//Software UART for GNSS (RX, TX)
SoftwareSerial GNSSPort(D7, D8);
#define GNSS_BAUD 115200

//Hardware UART for Debug
#define DEBUG_PORT Serial
#define DEBUG_BAUD 115200

//Write all data when received
#define DEBUG_DUMP 0

NMEAGPS GNSS;
gps_fix fix;
int32_t lon=0, lat=0;
float vel=0,alt=0,cog=0;

bool delayGNSS(uint32_t dly) {
  return delayGNSS(dly, false);
}

bool delayGNSS(int32_t dly, bool direct) {
  unsigned long mstop = millis()+dly;
  bool ret = false;

  if(DEBUG_DUMP > 1) DEBUG_PORT.print(F("\nS:"));
  if(DEBUG_DUMP > 1) DEBUG_PORT.print(dly);

  do {
    if (GNSS.available( GNSSPort )) {
      fix = GNSS.read();
      ret = true;
      if(DEBUG_DUMP > 1) DEBUG_PORT.print('!');
    }
  }while(!ret && mstop > millis());

  if (fix.valid.heading) cog = fix.heading();
  if (fix.valid.speed) vel = fix.speed_kph();
  if (fix.valid.altitude) alt = fix.altitude();
  if (fix.valid.location) {
    lon = fix.longitudeL();
    lat = fix.latitudeL();
  }
  

  if(!ret) return false;
  if(!direct) {
    if(DEBUG_DUMP > 1) DEBUG_PORT.print('+');
    if(DEBUG_DUMP > 1) DEBUG_PORT.print(mstop-millis());
    delay((mstop-millis()));
  }
  return true;
}

bool getGNSS(void) {
  bool ret;
  if(delayGNSS(100, true)) {
    if(DEBUG_DUMP > 0) debugDump();
    return true;
  }
  return false;
}

bool wait_3d(void) {
  DEBUG_PORT.print(F("Waiting 3D Fix..."));
  for (unsigned int sec = 0; sec < sleep_3d; sec++) {
    if(getGNSS() && lon != 0 && lat != 0 && alt != 0) {
      DEBUG_PORT.println(F("OK"));
      return true;
    }
    Serial.print('.');
    yield();
    delayGNSS(1000);
  }
  DEBUG_PORT.println(F("NOPE"));
  return false;
}

bool wait_2d(void) {
  DEBUG_PORT.print(F("Waiting 2D Fix..."));
  for (unsigned int sec = 0; sec < sleep_2d; sec++) {
    if(getGNSS() && lon != 0 && lat != 0) {
      DEBUG_PORT.println(F("OK"));
      return true;
    }
    Serial.print('.');
    yield();
    delayGNSS(1000);
  }
  DEBUG_PORT.println(F("NOPE"));
  return false;
}

byte getBattery(void) {
  //@TODO not yet implemented
  return 100;
}

String getGeoDecimal(int32_t location) {
  unsigned long tmp1, tmp2;
  String out = "";

  if (location < 0) {
    out += '-';
    location = 0 - location;
  }

  tmp1 = location / 10000000;
  tmp2 = location - (tmp1 * 10000000);

  out += tmp1;
  out += ".";
  out += tmp2;

  return out;
}

bool getFence(void) {
  int32_t check = 0;
  DEBUG_PORT.print(F("FENCE - "));

  //Lat
  DEBUG_PORT.print(F("LAT:"));
  system_rtc_mem_read(RTCMEMORYSTART + 1, (int32_t *)check, 4);
  DEBUG_PORT.print(check);
  DEBUG_PORT.print('/');
  DEBUG_PORT.print(lat);
  if (check + fence > lat || check - fence < lat) {
    DEBUG_PORT.println('!');
    return true;
  }
  //Lon
  DEBUG_PORT.print(F(" - LON:"));
  system_rtc_mem_read(RTCMEMORYSTART + 2, (int32_t *)check, 4);
  DEBUG_PORT.print(check);
  DEBUG_PORT.print('/');
  DEBUG_PORT.print(lon);
  if (check + fence > lon || check - fence < lon) {
    DEBUG_PORT.println('!');
    return true;
  }

  DEBUG_PORT.println('_');
  return false;
}

NeoGPS::clock_t getTimestamp(void) {
  if (!fix.valid.date || !fix.valid.time) return 0;

  //This contains the seconds starting from the start of this century
  NeoGPS::clock_t seconds = fix.dateTime;

  //Guessing we're still 20xx this is the unix timestamp for 01.01.2000 00:00:00
  seconds += 946684800;

  return seconds;
}

bool rfConnect(void) {
  unsigned int rftimer;
  
  if(WiFi.status() == WL_CONNECTED) return true;
  
  DEBUG_PORT.print(F("connecting to "));
  DEBUG_PORT.println(ssid);
  if(pass == "") {
    WiFi.begin(ssid);
  }else{
    WiFi.begin(ssid, pass);
  }
  while (WiFi.status() != WL_CONNECTED && rftimer < rf_timeout) {
    delay(1000);
    DEBUG_PORT.print(".");
    rftimer++;
    yield();
  }
  if (WiFi.status() != WL_CONNECTED) {
    DEBUG_PORT.println(F("failed"));
    return false;
  }
  DEBUG_PORT.println(F("connected"));
  DEBUG_PORT.print(F("IP address: "));
  DEBUG_PORT.println(WiFi.localIP());
  return true;
}

void rfDisconnect(void) {
  /*WiFi.disconnect();
  WiFi.mode(WIFI_OFF);
  WiFi.forceSleepBegin();*/
}

bool rfSend(void) {
  String data;
  HTTPClient http;

  if (!rfConnect()) return false;
  if (lat == 0 || lon == 0) return false;

  http.begin(owntracksURL);

  http.addHeader(F("X-Limit-U"), owntracksUser);
  http.addHeader(F("X-Limit-D"), owntracksDevice);
  http.addHeader(F("User-Agent"), F("Adlerweb-ESP-Tracker"));
  http.addHeader(F("Content-Type"), F("application/json"));

  data  = "{\"_type\":\"location\",\"tid\":\"01\",\"conn\":\"m\",\"_cp\":true,\"batt\":";
  data += getBattery();
  data += ",\"lat\":";

  data += getGeoDecimal(lat);
  data += ",\"lon\":";
  data += getGeoDecimal(lon);

  if (cog != 0) {
    data += ",\"cog\":";
    data += cog;
  }

  if (vel != 0) {
    data += ",\"vel\":";
    data += vel;
  }

  if (alt != 0) {
    data += ",\"alt\":";
    data += alt;
  }

  data += ",\"tst\":";
  data += getTimestamp();
  data += "}";

  DEBUG_PORT.println(F("---"));
  DEBUG_PORT.println(data);
  DEBUG_PORT.println(F("---"));
  DEBUG_PORT.println(F("Send"));
  DEBUG_PORT.flush();
  http.POST(data);
  DEBUG_PORT.println(".");
  DEBUG_PORT.flush();
  http.writeToStream(&Serial);
  DEBUG_PORT.println(".");
  DEBUG_PORT.flush();
  http.end();
  DEBUG_PORT.println(F("OK"));
  DEBUG_PORT.flush();

  rfDisconnect();

  return true;
}

void debugDump() {
  DEBUG_PORT.print(F("Status: "));
  switch (fix.status) {
    case 1:
      DEBUG_PORT.println(F("Nährungswert"));
      break;
    case 2:
      DEBUG_PORT.println(F("Nur Zeit"));
      break;
    case 3:
      DEBUG_PORT.println(F("GNSS-Fix"));
      break;
    case 4:
      DEBUG_PORT.println(F("DGNSS-Fix"));
      break;
    default:
      DEBUG_PORT.println(F("Keiner"));
  }
  DEBUG_PORT.print(F("UTC: "));
  DEBUG_PORT.print(fix.dateTime.year);
  DEBUG_PORT.print("-");
  DEBUG_PORT.print(fix.dateTime.month);
  DEBUG_PORT.print("-");
  DEBUG_PORT.print(fix.dateTime.date);
  DEBUG_PORT.print(" ");
  DEBUG_PORT.print(fix.dateTime.hours);
  DEBUG_PORT.print(":");
  DEBUG_PORT.print(fix.dateTime.minutes);
  DEBUG_PORT.print(":");
  DEBUG_PORT.print(fix.dateTime.seconds);
  DEBUG_PORT.print(" - ");
  DEBUG_PORT.print(getTimestamp());
  DEBUG_PORT.print("/");
  //DEBUG_PORT.println(lasttime);

  DEBUG_PORT.print(F("Satellites: "));
  DEBUG_PORT.println(fix.satellites);

  DEBUG_PORT.print(F("Speed: "));
  DEBUG_PORT.println(vel);

  DEBUG_PORT.print(F("Heading: "));
  DEBUG_PORT.println(cog);

  DEBUG_PORT.print(F("Altitude: "));
  DEBUG_PORT.println(alt);

  DEBUG_PORT.print(F("Postition: "));
  DEBUG_PORT.print(lat);
  DEBUG_PORT.print(",");
  DEBUG_PORT.println(lon);

  DEBUG_PORT.print(getGeoDecimal(lat));
  DEBUG_PORT.print(",");
  DEBUG_PORT.println(getGeoDecimal(lon));
}

byte getBootMode(void) {
  byte bootMode = 0;
  system_rtc_mem_read(RTCMEMORYSTART, &bootMode, 1);
  DEBUG_PORT.print("BootMode: ");
  DEBUG_PORT.println(bootMode);
  return bootMode;
}


/////////////


void setup() {
  int32_t dummy = 0;

  pinMode(GNSS_PWR_PIN, OUTPUT);

  DEBUG_PORT.begin(DEBUG_BAUD);
  GNSSPort.begin(GNSS_BAUD);

  delay(2000);

  DEBUG_PORT.println( F("Adlerweb GNSS Tracker v0.1.1") );
  DEBUG_PORT.flush();

  byte bootMode = getBootMode();

  if(bootMode == 0 || bootMode > 5) { //Unknown or first boot
    DEBUG_PORT.println(F("Enabling GNSS Power"));
    digitalWrite(GNSS_PWR_PIN, GNSS_PWR_ON);
    bootMode=1;
    system_rtc_mem_write(RTCMEMORYSTART, &bootMode, 1);
    DEBUG_PORT.print(F("Sleeping for "));
    DEBUG_PORT.print(sleep_GNSS);
    DEBUG_PORT.println(F(" Seconds"));
    DEBUG_PORT.flush();
    ESP.deepSleep(sleep_GNSS * 1e6);
  }

  if(bootMode == 1) { //Waiting for GNSS 3D Fix
    if (wait_3d()) {
      bootMode = 4;
    } else {
      bootMode++;
    }
  }

  if(bootMode == 2) {//Waiting for GNSS 2D Fix
    if (wait_2d()) {
      bootMode = 4;
    } else {
      bootMode++;
    }
  }
  
  if(bootMode == 3) { //Waiting for RF Fix
    //@TODO Not implemented
    bootMode = 5;
  }

  if(bootMode == 4) { //Fix Aquired - sending
    system_rtc_mem_read(RTCMEMORYSTART + 3, &dummy, 4);
    if (getFence() || dummy + (rf_force * 60) <= getTimestamp()) {
      bootMode = 5;
      if (rfSend()) {
        system_rtc_mem_write(RTCMEMORYSTART + 1, &lat, 4);
        system_rtc_mem_write(RTCMEMORYSTART + 2, &lon, 4);
        dummy = getTimestamp();
        system_rtc_mem_write(RTCMEMORYSTART + 3, &dummy, 4);
        bootMode = 0;
      } else {
        DEBUG_PORT.println(F("Transfer failed"));
        bootMode = 0;
      }
    }else{
      Serial.println(F("Position unchanged, no transfer"));
      bootMode = 0;
    }
  }

  if(bootMode == 5) { //No fix
    debugDump();
    bootMode = 0;
  }
  
  system_rtc_mem_write(RTCMEMORYSTART, &bootMode, 1);
}

void loop() {
  DEBUG_PORT.println(F("Disabling GNSS Power"));
  digitalWrite(GNSS_PWR_PIN, !GNSS_PWR_ON);
  DEBUG_PORT.print(F("Sleeping for "));
  DEBUG_PORT.print(sleep_off);
  DEBUG_PORT.println(F(" Minutes"));
  DEBUG_PORT.flush();
  ESP.deepSleep(sleep_off * 60e6);
}

Inhalt

  • 00:35 Das Modul
  • 09:07 Das NMEA-Protokoll
  • 13:33 Test & Konfiguration per U-Center
  • 18:02 GPS mit ESP8266 und Arduino
  • 19:05 Test mit SoftwareSerial
  • 20:47 GPS/WiFi-Tracking mit OwnTracks

Hinweise:

Das GPS-Modul wurde mir von ICStation.com für dieses Video kostenfrei zur Verfügung gestellt.

[ICStation.com] BitBastelei #243 – Si1145 Licht/IR/UV-Sensor

[ICStation.com] BitBastelei #243 - Si1145 Licht/IR/UV-Sensor

(107 MB) 00:24:19

2017-06-18 10:00 🛈

Sensorzeit: Mit dem Si1145 lassen sich so einige Werte aus dem Bereich „Licht“ erfassen: Neben der sichtbaren Lichtstärke rückt der Sensor gleich noch den Infrarot-Anteil und den aktuellen UV-Index raus. Praktisch wenn man wissen möchte, wie schnell der Sonnenbrand droht. Alles läuft mittels I²C, lässt sich also schnell mit nahezu jedem Mikrocontroller auswerten.

Das Modul von ICStation.com bringt den 2x2mm-Winzling auf ein für Bastler brauchbares Format und sorgt auch gleich noch dafür, dass die 5V eines Arduino den 3.3V-Chip nicht gleich zerstören.

Inhalt

  • 00:00 IC und Modul
  • 07:09 Si1145 an Arduino
  • 12:32 Messwerte – Si1145 vs. offizielle Werte
  • 17:07 Si1145 an ESP8266

Produkt

http://www.icstation.com/si1145-integrated-infrared-ultraviolet-sensor-module-arduino-stm32-p-10572.html

Mit dem Rabattcode: bitics gibt es 15% Rabatt

Korrekturen

Arduino betreibt die I²C-Pins immer mit internem Pull-Up, bei Nutzung eines 5V-Arduinos besteht daher die Gefahr, dass der Sensor beschädigt wird. Es sollte ein „I²C-Level-Shifter“ oder 3.3V-Mikrocontroller (3.3V-Arduino, ESP8266, etc) genutzt werden!

Weitere Links

Bild: https://www.adlerweb.info/blog/wp-content/uploads/2017/06/arduino-si1145-300×169.png

BitBastelei #232 – Feinstaubsensor im Eigenbau

BitBastelei #232 - Feinstaubsensor im Eigenbau

(97 MB) 00:46:51

2017-02-26 11:00 🛈

Feinstaub ist in letzter Zeit immer wieder in den Nachrichten zu hören – kleine Staubpartikel, welche bis in die Lunge vordringen und gesundheitliche Risiken bergen können. Mit dem SDS011 ist ein erschwinglicher Sensor verfügbar, mit welchem man schnell und einfach eine lokale Messstation aufbauen kann.

In diesem Video gehen wir vom ersten Blick bis zum Auslesen alle Schritte durch, welche ich nach Erhalt des Sensors durchführte. Wer einfach nur Messwerte lesen möchte kann natürlich auch einfach die fertige Firmware von Luftdaten.info verwenden. Ich erarbeite Sensordaten und Protokoll, schreibe eine Testsoftwate am Rechner und portiere sie zusammen mit einer Cloud-Anbindung auf den ESP8266.

Inhalt:

00:00 Der Sensor
03:33 Technische Daten
09:56 Das Protokoll
17:15 Sensorwerte am PC interpretieren
23:05 Datensammlung in der Cloud: Thingspeak
26:09 Sensorwerte mit Arduino/ESP8266
42:12 ESP8266-Hardware
43:00 Vergleich mit staatlicher Messstation
45:40 Fazit & Ausblick

Links:

00:26 http://www.codefor.de/stuttgart
00:34 http://www.stuttgart.de/feinstaubalarm
01:50 http://en.wikipedia.org/wiki/File:Particlecounter.jpg
03:33 http://www.luftdaten.info
04:45 http://inovafitness.com/software/SDS011%20laser%20PM2.5%20sensor%20specification-V1.3.pdf
09:58 http://cl.ly/ekot
23:05 http://www.thingspeak.com
26:18 https://github.com/nothans/ESP8266/blob/master/examples/RSSI_to_ThingSpeak.ino

PHP-Testcode:
https://gist.github.com/adlerweb/5ea58beb8a6bee3422932983c5c8ae92
Arduino-Testcode:
https://gist.github.com/adlerweb/ce23c61179bec3433279da6c2e7ff969

BitBasics: Funk-Datenübertragung per Mikrocontroller

BitBasics: Funk-Datenübertragung per Mikrocontroller

(36 MB) 00:15:02

2017-02-05 11:00 🛈

Nicht immer kann ein ein Kabel legen um Daten eines Mikrocontrollers wie dem Arduino zu ihrem Ziel zu bringen. Hier zeige ich die bekanntesten Möglichkeiten um mit Mikrocontrollern Daten drahtlos zu übertragen.