Porin karhureitti iot-kokeilun 2. maastokäynti

Pari hacklabin jäsentä kävi tekemässä 2. maastokäynnin liittyen Porin karhureitin iot-kokeiluun 27.4. Nyt vuorossa oli Hiivaniemen taukopaikka

Pari hacklabin jäsentä kävi tekemässä 2. maastokäynnin liittyen Porin karhureitin iot-kokeiluun 27.4. Nyt vuorossa oli Hiivaniemen taukopaikka sekä Rekitaipaleenjärven taukopaikka Joutsijärvellä.

Sää oli iltapäivällä epäilyttävän keväinen tosin aika viileä, mutta paluumatkalla sumuksi luultu ilman sakeneminen järven yllä osoittatuikin pian lumipyryksi. 🙂 Eli sää oli lähes vastaava kuin 1. kerralla. Tällä kertaa matkalla olivat vain Marko ja Santeri.

Valkoista sumua..

Maastokäynti osoittautui onnistuneeksi, eväät olivat tosin aika kevyet mutta olipa niitäkin matkassa. 1. kerrasta oppineena päätimme siirtää siirrettävän Lorawan-tukiaseman eli gatewayn mahdollisimman lähelle suunniteltua pysyvämpää paikkaa Tammen Tilan vanhassa päärakennuksessa korkean mäen päällä.

Siirrettävän gatewayn uusi sijainti

Hiivaniemessä käynti oli päätavoite. Toinen lisätavoite mahd. myöhempää tarvetta varten kävelimme Rekitaipaleenjärven taukopaikalle myös, koska se oli autojen pysäköintikohdan tuntumassa.

Hiivaniemen puuvaja n. 2m x 2,5m x 1,75m
Dataa reitiltä lähde:ttnmapper.org

Näiden lisäksi matkan varrella oli yksi kävijälaskurikokeilulle otollinen pieni silta.

Kävijälaskuri jollakin anturitekniikalla tähän?

Eli seuraavat vaiheet kokeilussa liittyvätkin polttopuuvarasto mittarin suunnitteluun ja protoiluun sekä Tammen tilalle asennettavan loraWAN Gatewayn asentamiseen. Niistä tosin kuullaan vasta viikkojen päästä johtuen osittain hankinta ja toimitussyistä… Eli niistä kuullaan tuonnempana..

Porin karhureitti iot-kokeilu alkaa

Pori-Hacklab sekä Porin Kaupungin Luontopaja on ottanut kirjaimellisesti ensiaskeleet lumisissa tunnelmissa Tammen tilalla iot-kokeilussa. Kokeilun tavoitteena saada oppia iot-tekniikasta erityisesti LoraWAN:a käyttävästä tekniikasta sekä tarjottua samalla jotain lisäarvoa ainakin reitin palveluita ylläpitäville.

Pori-Hacklab sekä Porin Kaupungin Luontopaja ovat ottaneet kirjaimellisesti ensiaskeleet lumisissa tunnelmissa Tammen tilalla iot-kokeilussa. Kokeilu alkoi siis muutama viikko sitten. Kokeilun tavoitteena saada oppia iot-tekniikasta erityisesti LoraWAN:a käyttävästä tekniikasta sekä tarjottua samalla jotain lisäarvoa ainakin reitin palveluita ylläpitäville.

Kokeilua voi seurata ja siihen ottaa osaa Satkyn github sivuilta sekä hacklabin slack-kanavalta #porinkarhureitti-iot-kokeilu. Kokeilu päätettiin rajata alueellisesti Tammen Tilan lähellä oleviin Porin karhureitin kohteisiin (I) Hiivaniemi, (II) Siltainsuo ja mahdollisesti (III) Pitkäniemi. Kokeilun aikana mahdollisesti tehdään kenttätestausretkiä muuallekin Porin karhureitillä, esim. Joutsijärven pohjoispuolelle.


Tässä tunnelmakuvia reissusta 9.4.

Sähköistetty rakennus, jonka yläkertaan TheThingsNetwork(tm)-Gateway tarkoitus asentaa

Valopaistaa lautojen välistä. Jee.
Yläkerrasta tehty löytö: ”Valo paistaa lautojen välistä. Jee!”
Markon testi-gateway eli TTN-gateway ja 62 ampeerin akku suojattuna hyvästä syystä. Hätäseis-painikekin löytyi.

Työnjako sopi hyvin mielestäni, Mikko ryhmänjohtajana, Marko (kuvassa kelta-takkinen) valmisteli ja testasi edeltävänä päivänä testausvälineet ja itse toimein kuorma-muulina.

Patikoinnin aikana Marko seurasi ttnmapper:lla että dataa tulee. Pienen patikoinnin päätteeeksi saavuimme Siltainsuolle puuvajan luokse.

Tänne olisi tarkoitus saada klapi-anturi lähettämään dataa Tammen tilan gateway:lle

Siltainsuolla juotiin Markon keittämät kahvit ja päätettiin vielä tarkistaa signaalit lähimmälle huoltotielle, johon pääsee autolla (ao. kuvassa läntisin mittauspiste).

Kuvakaappaus ttnmapper.org sivulta saatavasta mittausdatasta. Huom! Kuvassa näkyvä väliaikainen Tammen tilan TTN-gateway (punainen ikoni) katoaa huhtikuun aikana palvelusta, jolloin URL tod.näk. lakkaa toimimasta myös.

Signaali-mittausdataa käytiin läpi ja todettiin että eri SpreadingFactor-arvoilla esim. kuvassa näkyvä mittapiste oli SF8 ns. toiseksi vähiten virheitä sietävä.

Eli kenttämittaus antoi ns. vihreää valoa suunnitelmille asentaa Tammen tilalle Gateway.

Seuraavat vaiheet kokeilussa ovat

  • Asentaa Tammen tilalle LoraWAN (TTN) gateway
  • Tehdä kenttämittausretki Hiivaniemeen samalla kolmikolla (Tammen tilan sisälle asennettua Gatewayta ei tähän tarvita välttämättä)
  • Suunnitella kohteeseen soveltuva painoanturi klapeille
  • Asentaa 1. painoanturi Luontopajan kanssa
  • Suunnitella kohteeseen soveltuvia ratkaisuja kävijälaskureille
  • Asentaa 1. kävijälaskuri Luontopajan kanssa

Eritoten liittyen kävijälaskureihin vielä sananen. Yksityisyyden suoja tulee pysymään hyvänä syystä että TTN-verkko on turvallinen ja antureilla ei haluta identifioida henkilöitä esim. bluetooth-MAC-, kuva- tai ääni-perusteisesti. Pelkästään teknisesti ajateltuna, kaikkiin edellä mainittuihin tunnistustapoihin liittyy mittalaitteen akun kestoa huonontava ongelma, joka puolestaan on LPWAN-teknologian periaatetta vastaan. LoraWAN on siis LPWAN-teknologia, jossa tärkeänä osana on akunkeston maksimointi. Tämä toki johtaa siihen että kävijälaskurien arvot sisältävät lähtökohtaisesti epätarkkuutta, toisaalta voidaan saada tietoa kävijämääristä ainakin kohtuullisella tarkuudella aiempaan nähden.

Kokeilussa on jo päätetty että mitään arkaluonteista dataa ei edes haluta käsitellä. Päinvastoin tiedon jota käsitellään oletetaan sekä halutaan olevan avointa ja saavutettavissa olevaa tietoa.

Tämän ensimmäisen käynnin aikana tuli muutamia ideoita mihin muuallekin tätä voisi vielä hyödyntää… Mutta edetään kokeilu kerrallaan … ja tämä kokeilu on vasta alkanut, töyssyjäkin saattaa olla luvassa poluilla liukastelun lisäksi.

Lämpötila-paineanturi + TTN + Pipedream + Google Sheet + WordPress

Kokeilussa tavoitteena saada ns. heatmap-tieto (Google Sheet) mittalaitteelta LoraWAN-verkon avulla (The things network) yhdistämällä laitedata Pipedream-palvelun avulla

Kokeilussa tavoitteena saada ns. heatmap-tieto (Google Sheet) mittalaitteelta LoraWAN-verkon avulla (The things network) yhdistämällä laitedata Pipedream-palvelun avulla:

(Tässä demossa google sheet on upotettu iframe-tekniikalla. WordPress-käyttäjän tulee osata määrittää iframe-elementtiin lisäksi width ja height.)

Koko ketjusta ja ehkä itseäni eniten haastaneesta filosofiasta ”ohjelmoinnin demokratisointi” myöhemmin lisää. Todetaan heti että tähän pisteeseen päätymiseen meni muutama ehtoo ainakin allekirjoittaneella. HeatMap-idea tuli Hacklabin ulkopuolelta kävijälaskuri-ideasta Kyläsaaren kyläyhdistykseltä, tässä demossa tavallaan pykälää monimutkaisempi ”laskuridata” ehdon kera. Sovellutusideat sekä Lorawan- ja TTN-perehdytykset tulivat Marko Kauppiselta, iso kiitos kipinän luomisesta itselle uutta aihetta kohtaan. Markolta tuli siis myös laitteet jota tässä demossa hyödynnettiin, lyhyesti siis suurin työ koko kokeilusta. Itse keskityin ainoastaan softa-puoleen.

Melko varmasti tulee muitakin demoja lisää. Mutta ensin tämä demo tullaan palastelemaan paremmin…

Sparkfun ESP8266 Thing + DS18B20 langaton sauna lämpömittari proggis.

Jo muutama vuosi sitten mietein kämppiksen kanssa, että olisi ihan siistiä piha saunaan rakentaa langaton lämpömittari. En silloin hirveästi elektroniikasta ollut perillä vaikka pitkään olen ohjelmointia harrastanut.

Tammikuussa tilasin huvikseni yhden Sparkfun ESP8266 Thing kehityskortin ja harmikseni huomasin, että tarvitsen myös ohjelmointi laitteen. Sparkfun suosittelee Thingin kanssa käytettäväksi SparkFun FTDI Basic Breakout korttia.

Samalla tajusin, että tuon ESP8266 kehityskortin kanssa olisi aika helppo rakentaa lämpömittari. Hacklab kaverit puhunut noista ESP8266 korteista ja DS18B20 lämpömittareista jonkun aikaa joten päätin katsoa millain tuollaisen kytkennän saisi tehtyä.

Pistin siis tilaukseen ohjelmointikortin, DS18B20 anturin ja vähän johtoa. Aloin lueskelemaan Thingin dokumentaatiota ja sitten piirsin oman kaltaisen kytkentä kaavion. Kysyin tietenkin Hämäläisen Markolta menikö kytkentä suunnitelma yhtään oikein. Hän kertoi, että se näyttää aikalailla oikealta. Ei kun siis odottamaan, että osat tulee postilaatikkoon. Harmikseni 170 euron Sparkfun tilaus jäi tulliinkin hetkeksi.

Sparkfun ESP8266 Thing + DS18B20 kytkentäkaavio

Kämppiksen vaimo vastaanotti paketin tiistaina 16.2.2016 ja minä tietenkin töihin lähtiessä otin paketin mukaan. Jonkin aikaa töitä tehdessä alkoi into kolvailuun. Sain kolvattua Arduino headerin ohjelmointikortin liittämistä varten kun minun kolvini hajosi.

Sitten juttelin hetken Markon kanssa ja tultiin siihen päätökseen, että käyn hänen luonaan pikaiseen kolvaamassa kytkennän ennen Hacklab miittiä. Kolvailu onnistui sujuvasti kun kunnon juotin. En minä pistäisi noin 300 euroa juottimeen.

P.S. Pistettiin Hacklab miitissä yhteisökeskuksella tavaraa muutto valmiiksi.

Miitin jälkeen tulin kotiin. Joskus aikoinaan on tullut Arduinoa ohjelmoitua, mutta jostain syystä IDE oli koneeltani hukassa. Meni pari tuntia Arch Linuxissa, että sain tuon Arduino IDE:n asennettua. Sen jälkeen tietenkin varmistin, että ohjelman lähettäminen onnistuu pistämällä Sparkfunin sivuilta löytyvän Blink koodin pyörimään.

Jonkun aikaa koodailtuani tulin taisin saada lämmön mittaamisen toimintaan.

#include 

#define ESP8266_LED 5
#define DS18B20 0

OneWire oneWire(DS18B20);

void setup() 
{
  pinMode(ESP8266_LED, OUTPUT);
}

void loop() 
{
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;

  if (!oneWire.search(addr)) {
    oneWire.reset_search();
    delay(250);
    return;
  }

  if(OneWire::crc8(addr, 7) != addr[7]) {
    return;
  }
  Serial.println();

  switch (addr[0]) {
    case 0x10: // Chip = DS18S20
      type_s = 1;
      break;
    case 0x28: // Chip = DS18B20
      type_s = 0;
      break;
    case 0x22: // Chip = DS1822
      type_s = 0;
      break;
    default: // Device is not a DS18 family Device
      return;
  }

  oneWire.reset();
  oneWire.select(addr);
  oneWire.write(0x44, 1);

  delay(1000);
  
  present = oneWire.reset();
  oneWire.select(addr);
  oneWire.write(0xBE);

  for (i = 0; i < 9; i++) {
    data[i] = oneWire.read();
  }

  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3;
    if (data[7] == 0x10) {
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw & ~7;
    else if(cfg == 0x20) raw = raw & ~3;
    else if(cfg == 0x40) raw = raw & ~1;
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;

  for(i = 0; i < (int)celsius; i++) {
    digitalWrite(ESP8266_LED, HIGH);
    delay(500);
    digitalWrite(ESP8266_LED, LOW);
    delay(500);
  }
  delay(2000);
}

Tuossa on siis tämän hetkinen koodipätkä jota debuggaan seuraavalla Youtube videolla.

Kirjoitan projektista tänne lisää kun saan ohjelmoitua lämpötilan lähettämisen palvelimelle. Kuten videolla sanon, en jaksa ohjelmoida juuri nyt enempää. Kello on 2:33 ja päätän tältä yöltä tämän proggiksen tähän. 😉

Edit: 24.02:

Jäänyt kirjoittamatta loput kun Hacklabin WordPress vähän sekoillut. Jos huomaatte poistin vahingossa kaikista artikkeleista kuvatkin.

Seuraava lähdekoodi pyörii itse ESP8266 Thingissä.

#include 
#include 

#define ESP8266_LED 5
#define DS18B20 0

OneWire oneWire(DS18B20);

const char WiFiSSID[] = "SSID";
const char WiFiPSK[] = "PSK";

const char Host[] = "Hostname";
const int Port = 443;
String Sensor = "SparkfunESP8266+DS18B20+1";
const char* fingerprint = "86 A5 43 FB 57 17 94 6D 5E F3 84 BD 5B 3C 33 C5 2C 68 1F 4A";

const int toSeconds = 1000000;

void setup() {
  pinMode(ESP8266_LED, OUTPUT);
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(WiFiSSID, WiFiPSK);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;

  if (!oneWire.search(addr)) {
    oneWire.reset_search();
    delay(250);
    return;
  }

  if(OneWire::crc8(addr, 7) != addr[7]) {
    return;
  }
  Serial.println();

  switch (addr[0]) {
    case 0x10: // Chip = DS18S20
      type_s = 1;
      break;
    case 0x28: // Chip = DS18B20
      type_s = 0;
      break;
    case 0x22: // Chip = DS1822
      type_s = 0;
      break;
    default: // Device is not a DS18 family Device
      return;
  }

  oneWire.reset();
  oneWire.select(addr);
  oneWire.write(0x44, 1);

  delay(1000);
  
  present = oneWire.reset();
  oneWire.select(addr);
  oneWire.write(0xBE);

  for (i = 0; i < 9; i++) {
    data[i] = oneWire.read()
  }

  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3;
    if (data[7] == 0x10) {
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw & ~7;
    else if(cfg == 0x20) raw = raw & ~3;
    else if(cfg == 0x40) raw = raw & ~1;
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;

  for(i = 0; i < (int)celsius; i++) {
    digitalWrite(ESP8266_LED, HIGH);
    delay(500);
    digitalWrite(ESP8266_LED, LOW);
    delay(500);
  }

  WiFiClientSecure client;
  if (!client.connect(Host, Port)) {
    return;
  }

  if (!client.verify(fingerprint, Host)) {
    return;
  }

  String url = "/insert.php?table=temperatures&from=" + Sensor + "&temperature=" + celsius;

  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                "Host: " + Host + "\r\n" + 
                "Connection: Close\r\n\r\n");
  delay(10);
  
  digitalWrite(ESP8266_LED, HIGH);
  delay(500);
  digitalWrite(ESP8266_LED, LOW);
  delay(500);

  if (celsius < 20.0) {
    ESP.deepSleep(600 * toSeconds);
  } else {
    ESP.deepSleep(30 * toSeconds);
  }
}

void loop() {
  
}

Jos huomaat kaikki koodi on siirtynyt setup() funktioon ESP.deepSleep() funktio kutsun takia. ESP.deepSleep on ESP8266 Thingille ominainen syväuni joka vähentää virran kulutusta. Ja lähetän Temperaturen palvelimelle HTTP GET kutsulla. NGINX palvelimella pyörii PHP seuraava PHP scripti.

<?php

$database_location = "database/";

if(!is_dir($database_location)) {
        mkdir($database_location, 755);
}

$database = $database_location . $_GET['table'];
$table = json_decode("[]", true);

if(file_exists($database)) {
        $table = json_decode(file_get_contents($database), true);
}

unset($_GET['table']);

$_GET['created'] = date("d-m-Y H:i:s");
array_push($table, $_GET);

$table = json_encode($table, JSON_PRETTY_PRINT);
file_put_contents($database, $table);

?>

Tämä PHP scripti tallentaa vastaanotetun lämpötilan JSON tiedostoon, josta voin myöhemmin lukea lämpötila arvon.

ESP8266 + DS18B20 langaton lämpömittari

Olen vähän niputtanut DS18B20 johtoa, koska se on tällä hetkellä niin paljon tiellä. Se on pari metriä pitkä saunaa varten. Seuraavaksi tarvis tehdä tuolle kotelo ja päästään asentamaan se saunaan.