Schlagwort-Archive: bitbastelei

BitBastelei #305 – EC-Karten-Terminal-Recycling: LCD&Keypad an ESP8266

BitBastelei #305 - EC-Karten-Terminal-Recycling: LCD&Keypad an ESP8266

(318 MB) 00:30:29

2018-10-21 10:00 🛈

Vor einiger Zeit hatte ich ein altes EC-Kartenterminal zerlegt und schon angemerkt, dass man viele der Bauteile recyclen kann. Dieses mal geht es um das Display sowie die Tastatur – eigentlich eine einfache Aufgabe. Eigentlich.

Links

Quellcode Testsoftware

#include <Arduino.h>
#include <SPI.h>
#include <MCP23S17.h>
#include <Wire.h>
#include <LiquidCrystal_PCF8574.h>

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

const char* kbdmap = "K##.0CRE321MSO654FTe987U";
const char* cmdmap = " +-*/";

#define ROWS 4
#define COLS 6

LiquidCrystal_PCF8574 lcd(0x27);
MCP gpio(0, 15);
int8_t last = 0;

String num1, num2;
byte cmd = 0;

void setPinMode(void) {
    uint16_t out = 0xFFFF;
    out <<= (ROWS);
    gpio.pinMode(out);
    gpio.pullupMode(out);
    gpio.inputInvert(out);
    out = ~out;
    gpio.digitalWrite(out);
}

void startLCD(void) {
    int error;
    Serial.println("LCD...");
    Wire.begin(D1, D2);
    Wire.beginTransmission(0x27);
    error = Wire.endTransmission();
    Serial.print("Return: ");
    Serial.print(error);

    if (error == 0) {
        Serial.println(": LCD found.");
    } else {
        Serial.println(": LCD not found.");
    }

    lcd.begin(20, 2); // initialize the lcd
    lcd.home();
    lcd.clear();
    lcd.print("BitBa // POS-Matrix");
}

void setup() {
    Serial.begin(115200);
    Serial.print("\nInit...");
    gpio.begin();

    setPinMode();

    Serial.println("OK");

    startLCD();
}

int8_t checkKeys(void) {
    byte row, col;
    int input;
    for(row = 0; row < ROWS; row++) {
        gpio.digitalWrite(row, LOW);
        delay(1);
        input = gpio.digitalRead();
        gpio.digitalWrite(row, HIGH);
        for(col=0; col < COLS; col++) {
            if(input & (1<<(ROWS + col))) {
                return (byte)(COLS * row + col);
            }
        }
    }
    return -1;
}

void loop() {
    int8_t input = checkKeys(); 
    int8_t check = 0xFF;
    float result = num2.toFloat();
    bool change = false;
    if(result == 0) result = num1.toFloat();

    if(input < (COLS*ROWS) && input >= 0 && last != input) {
        Serial.print(input);
        Serial.print(": ");
        last = input;
        if(input >= 0) {
            check = kbdmap[input];
            Serial.print(check);
        }else{
            check = 0xFF;
        }
        Serial.println();
        delay(15); //Poor maker debounce
    }else{
        check = 0xFF;
    }

    if(check != 0xFF) {
        switch(check) {
            //K##.0CRE321MSO654FTe987U
            case 'K':
                cmd = 4;
                change = true;
                break;
            case 'R':
                cmd = 3;
                change = true;
                break;
            case 'S':
                cmd = 2;
                change = true;
                break;
            case 'T':
                cmd = 1;
                change = true;
                break;
            case 'C':
                cmd = 0;
                num1 = "";
                num2 = "";
                change = true;
                break;
            case 'U':
                cmd = 0;
                num2 = "";
                change = true;
                break;
            case 'F':
                if(cmd == 0) {
                    if(num1.length() > 0) num1.remove(num1.length()-1);
                }else{
                    if(num2.length() > 0) num2.remove(num2.length()-1);
                }
                change = true;
                break;
            case '#':
                switch(cmd) {
                    case 1:
                        result = num1.toFloat() + num2.toFloat();
                        break;
                    case 2:
                        result = num1.toFloat() - num2.toFloat();
                        break;
                    case 3:
                        result = num1.toFloat() * num2.toFloat();
                        break;
                    case 4:
                        result = num1.toFloat() / num2.toFloat();
                        break;
                }
                cmd = 0;
                num1 = result;
                num2 = "";
                change = true;
                break;
            case '.':
            case '0':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
                if(cmd == 0) {
                    num1 += (char)check;
                }else{
                    num2 += (char)check;
                }
                change = true;
        }

        if(change) {
            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print(num1);
            if(cmd > 0) {
                lcd.setCursor(18, 0);
                lcd.print(" ");
                lcd.print(cmdmap[cmd]);
                lcd.setCursor(0, 1);
                lcd.print(num2);
            }
        }
    }
}

 

 

Hinweis: Der bei 19:40 gezeigter GPIO-Expander wurde mir seinerzeit von ICStation.com zur Verfügung gestellt.

BitBastelei #304 – Server-Akkupacks: Was steckt drin

BitBastelei #304 - Server-Akkupacks: Was steckt drin

(73 MB) 00:17:14

2018-10-14 10:00 🛈

In professionellen Speichersystemen kommen oft Batterien oder große Kondensatoren zum Einsatz, um bei Stromausfällen die Risiken eines Datenverlustes zu minimieren. Erstere müssen regelmäßig getauscht werden um Probleme durch Alterung zuvorzukommen. Schauen wir doch mal, was da so im Inneren steckt.

BitBastelei #303 – DIY Storage-System mit SAS-Expander

BitBastelei #303 - DIY Storage-System mit SAS-Expander

(583 MB) 00:28:02

2018-10-07 10:00 🛈

Zu wenig USB? Hub. Zu wenig Netzwerk? Switch. Zu wenig S-ATA? Auch hier gibt es mit so genannten SAS-Expandern eine Art Verteiler, welche es ermöglichen mehrere Geräte an einem SAS-Anschluss zu betreiben. Und das Beste: Sie sind recht günstig zu haben. Ein solcher bildet die Basis für den Ersatz meines bisherigen Wäscheleinensystems. Und das damit ein Fake-USB-Kabel und die Flex zu tun haben? Nu das bekommen wir sicher auch noch raus.

Inhalt:

  • 00:00 Bisheriger Aufbau
  • 08:21 Server-Recycling: Storage-Gehäuse
  • 14:04 Das neue Konzept
  • 17:36 Aufbau und Fehlersuchen

BitBastelei #301 – Canon EOS 550D Fehlersuche

BitBastelei #301 - Canon EOS 550D Fehlersuche

(446 MB) 00:24:22

2018-09-23 10:00 🛈

Ugh, doll. Meine Canon EOS 550D lässt sich plötzlich nicht mehr Einschalten. Eine Ursache ist nicht zu sehen und auch durchtauschen von Akku, Objektiv & Co bringt keine Änderung. Also bleibt nur eins: Zerlegen und hoffen, dass die Ursache sichtbar wird.

BitBastelei #300 – Externe Grafikkarte am PC/Server? Quick’n’Dirty-Weg

BitBastelei #300 - Externe Grafikkarte am PC/Server? Quick'n'Dirty-Weg

(534 MB) 00:21:27

2018-09-16 10:00 🛈

Grafikkarten im Server? Was für dein Ein oder Anderen vermutlich seltsam klingt ist doch gar nicht so ungewöhnlich, denn mit diesen kann man nicht nur Spiele spielen, sondern auch hoch-parallelisierte Berechnungen durchführen. Da ich aktuell mit diversen dieser Techniken herumexperimentiere soll also auch mein Home-Server eine solche erhalten. Nur gibt es da so ein paar Hindernisse.

BitNotice #134 – Volkszähler-Daten mit Grafana visualisieren

BitNotice #134 - Volkszähler-Daten mit Grafana visualisieren

(77 MB) 00:17:25

2018-09-12 17:30 🛈

Das Projekt Volkszähler hatte ich ja schon öfter gezeigt: Mit diesem lassen sich über längere Zeiträume Messwerte sammeln und darstellen. Auch wenn es prinzipiell funktioniert: Inzwischen gibt es Konkurrenzprojekte, welche interessante Funktionen haben. Eines davor ist Grafana – eine reine Messwertvisualisierung, welche durch einfache Bedienung und großen Funktionsumfang heraussticht. In der aktuellen Version können auch Daten auf MySQL-Tabellen angezeigt werden – also jene Datenbank, die auch der „VZ“ nutzt. Verheiraten wir das Ganze doch einfach und nutzen Grafana zum Anzeigen der VZ-Daten.

Code

Using Channel-IDs (that’s not UUID)

SELECT
  timestamp/1000 as time_sec, 
  data.value as value, 
  properties.value as metric
FROM data
  LEFT JOIN properties ON (properties.entity_id = data.channel_id)
  LEFT JOIN entities ON (entities.id = data.channel_id)
WHERE 
  (channel_id = 1 || channel_id = 2 || channel_id = 3)  AND 
  (timestamp/1000) >= $__unixEpochFrom() AND 
  (timestamp/1000) <= $__unixEpochTo() AND
  properties.pkey = 'title'
ORDER BY timestamp ASC

Using channel names

SELECT
  timestamp/1000 as time_sec, 
  data.value as value, 
  properties.value as metric
FROM data
  LEFT JOIN properties ON (properties.entity_id = data.channel_id)
  LEFT JOIN entities ON (entities.id = data.channel_id)
WHERE 
  (properties.value = "Flur" || properties.value = "Werkstatt" ) AND
  (timestamp/1000) >= $__unixEpochFrom() AND 
  (timestamp/1000) <= $__unixEpochTo() AND
  properties.pkey = 'title'
ORDER BY timestamp ASC

Using UUID

SELECT
  timestamp/1000 as time_sec, 
  data.value as value, 
  properties.value as metric
FROM data
  LEFT JOIN properties ON (properties.entity_id = data.channel_id)
  LEFT JOIN entities ON (entities.id = data.channel_id)
WHERE 
  (uuid = "12345678-1234-1234-1234-1234567890ab" || uuid = "12345678-1234-1234-1234-1234567890ac" ) AND
  (timestamp/1000) >= $__unixEpochFrom() AND 
  (timestamp/1000) <= $__unixEpochTo() AND
  properties.pkey = 'title'
ORDER BY timestamp ASC

BitBastelei #299 – IMax B6 Tastentausch

BitBastelei #299 - IMax B6 Tastentausch

(143 MB) 00:09:22

2018-09-09 10:00 🛈

Momentan ist der Basteltisch durch defekte Geräte überfüllt, also machen wir das Beste draus und versuchen den Stapel langsam abzuarbeiten. Heute im Angebot: Mein Li-Ion-Ladegerät, welches ein paar Taster verloren hat und daher nur noch schwer zu bedienen ist.

BitBastelei #298 – BME280 am ESP8266: Temperatur, Luftfeuchte, Luftdruck per WLAN

BitBastelei #298 - BME280 am ESP8266: Temperatur, Luftfeuchte, Luftdruck per WLAN

(311 MB) 00:18:31

2018-09-02 10:00 🛈

Sensoren habe ich viele, der BME280 verspricht aber ein Alleskönner zu sein: Neben Temperatur und Luftfeuchte soll er auch den Luftdruck übermitteln können. Zusammen mit einem ESP8266 ist so schnell eine eigene „Wetterstation“ gebaut, welche die Messwerte auf einer Webseite anzeigt, per MQTT an Haussteuerungen wie HomeAssistant gibt oder mittels HTTP einen Volkszähler befüllt.

Code:
https://github.com/adlerweb/ESP8266-BME280-Multi
Video von Chris Figge
https://www.youtube.com/watch?v=KMwVNuzghsY

BitBastelei #297 – NEC P2200 Nadeldrucker

BitBastelei #297 - NEC P2200 Nadeldrucker

(288 MB) 00:23:39

2018-08-26 10:00 🛈

Bevor sich Laser und Tinte verbreitet haben druckten viele mit Nadeldruckern. Ähnlich wie eine Schreibmaschiene wird hier mit Farbbändern gearbeitet. Langsam und laut, aber auch günstig im Verbrauch und lange haltbar wird der Technologie nachgesagt. Schauen wir an diesem fast 30 Jahre altem Gerät, ob das so stimmt.

BitBastelei #296 – WiFi-Schalter Sonoff Basic – eWeLink, Tasmota, PlatformIO/Android

BitBastelei #296 - WiFi-Schalter Sonoff Basic - eWeLink, Tasmota, PlatformIO/Android

(278 MB) 00:31:55

2018-08-19 10:00 🛈

In der letzten Folge BitBasics hatten wir ja bereits gesehen, wie man mit einem ESP8266 einen WLAN-Schalter bauen kann. Heute werfen wir mal einen Blick auf ein kommerzielles Produkt.

Achtung: Der Anschluss an das öffentliche Stromnetz darf nur durch autorisiertes Fachpersonal erfolgen

Inhalt:

0:00 Das Gerät
4:24 Innenleben
6:26 Anschluss
8:39 eWeLink: Die offizielle App
13:32 Was ist Tasmota
15:11 Der Programmierport
23:07 Einrichtung und Nutzung von PlatformIO
26:09 Anpassung von Tasmota mit PlatformIO
28:47 Eigene Software mit PlatformIO

Links:

eWeLink: http://sonoff.itead.cc/en/ewelink
Tasmota: https://github.com/arendst/Sonoff-Tasmota
Produkt: https://amzn.to/2waRaFP *
oder: http://s.click.aliexpress.com/e/MizYO16 *
PlatformIO: https://platformio.org/
Selfmade-Code: https://github.com/adlerweb/sonoff-mqtt

* Affiliate-Link: Durch Nutzung erkennt der Anbieter, dass Ihr über meine Seite zu ihnen gefunden habt. Ich werde prozentual an euren Umsätzen beteiligt. Für euch bleiben die Preise natürlich gleich.

Das Gerät wurde selbst erworben.