Kürzlich habe ich die Building IoT in Köln besucht. An drei interessanten Tagen habe ich mich dabei in Workshops und Vorträgen mit dem Internet der Dinge auseinander gesetzt.

In zwei Blogartikeln möchte ich Ihnen gern davon erzählen.

Am ersten Tag habe ich einen Workshop von Dr. Michael Stal, „Der pragmatische Architekt“ von heise.de besucht. In seinem Workshop „IoT-Hackathon – IoT in Theorie & Praxis“ haben wir zunächst über die Grundlagen der Entwicklung von IoT-Geräten gesprochen und anschließend auch mit einen Arduino Uno ausprobiert. Zum Beispiel haben wir mit einem Sensor die Temperatur gemessen und später auf einem Display ausgegeben.

IMG_20160510_130723805IMG_20160510_130730012

IMG-20160510-WA0005

Am Nachmittag begann dann der Hackathon-Teil in dem die Teams aus den Arduino-Starter Paketen eine interessante oder lustige Idee umsetzen sollten. Unsere Idee sollte einen Spielautomaten darstellen. Raumschiff als Pfeil sollte Asteroiden (ein O) ausweichen. Mit zwei Tastern kann der Spieler das Raumschiff bewegen. Ein zweiter Spieler konnte auf einem zweiten Arduino Asteroiden starten. Weiter unten ist der Quelltext zu unserem Spiel zu finden.

Die Entwicklung ist nicht wirklich schwer. Das Ganze kann man locker in 3 Stunden entwickeln. Man muss wieder ein bisschen in seinem Elektrinokwissen kramen um zum Beispiel Widerstände zu berechnen und Schaltungen zu erstellen.

Entwickelt wird übrigens in einem Slang von C oder C++. Arduino liefert eine eigene IDE dazu. Es gibt eine Setup-Methode und eine Loop-Methode, die immer wieder ausgeführt wird.

Die Entwicklung und der erste Tag haben sehr viel Spaß gemacht und einen guten Einblick in die Entwicklung von IoT-Geräten geliefert. Michael Stal bereitet den Workshop auch gerade als Blogserie auf heise.de auf (siehe Quellen).

Quellen:
Building IoT: http://www.buildingiot.de/
Der Pragmatische Architekt: http://www.heise.de/developer/Der_Pragmatische_Architekt-2732748.html?seite=1
IoT Blogserie von Michael Stal: http://www.heise.de/developer/artikel/SOA-fuer-Hardware-das-Internet-der-Dinge-3186009.html
Arduino Uno: https://www.arduino.cc/en/main/arduinoBoardUno

 

Hier ist der Quelltext zu unserem Spiel:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#include <Bounce2.h>

#define BUTTON_PIN_1 3
#define BUTTON_PIN_2 4

#define LED_PIN 13

int button1 = 0;
int button2 = 0;

// Instantiate a Bounce object
Bounce debouncer1 = Bounce();

// Instantiate another Bounce object
Bounce debouncer2 = Bounce();

LiquidCrystal_I2C lcd(0x27,16,2);
bool stones[16][2];
bool shipIsUp = true;
int lives = 3;
int val;
int stepCounter = 1;

void setup() {
setupButtons();

lcd.init(); // initialization of LCD
lcd.backlight(); // brighten backlight

Serial.begin(9600);
initArray();

}

void loop() {
val = recValue();
if(stepCounter == 4)
{
stepCounter = 1;
processRevValue(val);
}

stepCounter += 1;
Step();
}

int recValue() {
int incoming = Serial.available(); // get data
if (incoming > 0) processRevValue(Serial.parseInt());
Serial.println(incoming);
//if (incoming > 0) processRevValueBool(Serial.parseBoolean());
return incoming;
}

void processRevValue(int r) {
boolean upper = false;
if (r >= 90) {
//digitalWrite(myLed, HIGH);
upper = true;
} else {
//digitalWrite(myLed, LOW);
upper = false;
}
processRevValueBool(upper);
}

void processRevValueBool(boolean upper) {
if (upper) {
upper = true;
addStone(true);
} else {
upper = false;
addStone(false);
}
}

void setupButtons() {

// Setup the first button with an internal pull-up :
pinMode(BUTTON_PIN_1,INPUT_PULLUP);
// After setting up the button, setup the Bounce instance :
debouncer1.attach(BUTTON_PIN_1);
debouncer1.interval(5); // interval in ms

// Setup the second button with an internal pull-up :
pinMode(BUTTON_PIN_2,INPUT_PULLUP);
// After setting up the button, setup the Bounce instance :
debouncer2.attach(BUTTON_PIN_2);
debouncer2.interval(5); // interval in ms

attachInterrupt(0, button1Pressed, CHANGE);
attachInterrupt(1, button2Pressed, CHANGE);
}

void button1Pressed(){
// buttonLogger();
shipIsUp = true;
}

void button2Pressed(){
// buttonLogger();

shipIsUp= false;

}

void buttonLogger() {
// Update the Bounce instances :
debouncer1.update();
debouncer2.update();

// Get the updated value :
int value1 = debouncer1.read();
int value2 = debouncer2.read();

button1 = value1;
button2 = value2;

if(button1 == 1)
{
shipIsUp = true;
button1 = 0;
}

if(button2 == 1)
{
shipIsUp = false;
button2 = 0;
}

// print status of buttons
String butStateVal1 = String(value1);
String butStateVal2 = String(value2);
String buttonState =  String(„But1:“ + butStateVal1 + “ But2: “ + butStateVal2);
Serial.println(buttonState);
}

void initArray()
{
for(int row = 0 ; row >= 1; row +=1) {
for(int field = 0 ; field >= 15; field +=1) {
stones[field][row] = false;
}
}
}

void Step(){
delay(300);
moveAllStonesOneField();
displayStones();
displayShipAndReduceLifeIfCollision();
displayLives();
}

void addStone(bool isInUpperLine)
{
if(isInUpperLine)
{
stones[0][0] = true;
}
else
{
stones[0][1] = true;
}
}

void moveAllStonesOneField()
{
for(int field = 15 ; field >= 0; field -=1) {
if(stones[field][0])
{
if(field <= 14)
{
stones[field +1][0] = true;
}

stones[field][0] = false;
}

if(stones[field][1])
{
if(field <= 15)
{
stones[field +1][1] = true;
}

stones[field][1] = false;
}
}
}

void displayStones()
{
for(int row = 0 ; row <= 1; row +=1) {
for(int field = 0 ; field <= 15; field +=1) {
lcd.setCursor(field,row);
if(stones[field][row])
{
lcd.print(„O“);
}
else
{
lcd.print(“ „);
}
}
}
}

void displayShipAndReduceLifeIfCollision()
{
if(shipIsUp)
{
lcd.setCursor(15,0);
if(stones[15][0])
{
lcd.print(„X“);
lives -= 1;
}
else
{
lcd.print(„<„);
}
}
else
{
lcd.setCursor(15,1);
if(stones[15][1])
{
lcd.print(„X“);
lives -= 1;
}
else
{
lcd.print(„<„);
}
}
}

void displayLives()
{
lcd.setCursor(0,0);
lcd.print(lives);
}

Leave a comment

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload the CAPTCHA.