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

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

(318.1 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.

BitNotice #137 – Und noch ein 40W-LED-Panel. Für 5€.

BitNotice #137 - Und noch ein 40W-LED-Panel. Für 5€.

(2 GB) 00:16:46

2018-10-17 16:13 🛈

Ab und an lohnt es sich durch die Artikellisten diverser Plattformen zu scrollen – ein 40W LED-Panel für 5€ incl. Versand? OK, gebraucht, aber wohl funktionsfähig. Neu kostet der Spaß etwa das 6-fache, also hey, ich bin dabei.

BitBastelei #304 – Server-Akkupacks: Was steckt drin

BitBastelei #304 - Server-Akkupacks: Was steckt drin

(73.3 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.

BitNotice #136 – Step-Up-Module mit höheren Spannungen

BitNotice #136 - Step-Up-Module mit höheren Spannungen

(514.4 MB) 00:29:09

2018-10-10 17:30 🛈

Schaltregler um die Spannung zu erhöhen, auch als „Step-Up“ oder „Boost“ bekannt, gibt es wie Sand am Meer. Aber was, wenn man mal ein paar Volt mehr brauch?

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

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

(583.3 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

BitNotice #135 – Mailbag: PCIe-USB-Voodoo, Staubsensor

BitNotice #135 - Mailbag: PCIe-USB-Voodoo, Staubsensor

(79.5 MB) 00:06:53

2018-10-04 18:29 🛈

Ihr kennt das: Noch ein paar Euro mehr Warenwert bis zum kostenlosen Versand. Also schnell noch ein paar interessant erscheinende Dinge mit in den Warenkorb. Schaunwama

BitBastelei #302 – Solar-Router – Ideen und Wege

BitBastelei #302 - Solar-Router - Ideen und Wege

(557.3 MB) 00:36:19

2018-09-30 10:00 🛈

WLAN ist praktisch – dumm nur, dass man nicht überall Empfang hat. Oder Strom. Ich möchte an einem Ort einen vom Stromnetz autarken Freifunk-Router installieren – versorgt per Solar. In diesem Video schauen wir auf die Mittel und Wege einen Router – oder übertragen auch andere Geräte mit ähnlichem Aufbau – über die Sonne zu versorgen.

Hinweis: Der hier gezeigte 841er wird auf Grund seines geringen Speichers mittelfristig vermutlich nicht mehr mit Freifunk funktionieren und sollte daher nicht für neue Aufbauten verwendet werden.

BitBastelei #301 – Canon EOS 550D Fehlersuche

BitBastelei #301 - Canon EOS 550D Fehlersuche

(446.4 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.

OSTicket: Ticketerstellung über Python

OSTicket ist ein freies Ticketsystem, also System zur Sammlung und Dokumentation von Aufgaben. Ab und an kann es praktisch sein solche Aufgaben auch per Software zu generieren, z.B. für wiederkehrende Aufgaben oder wenn Systeme Störungen automatisiert erkennen. Da die Doku bisher eher dünn ist anbei ein kleines Python-Script, welches über die API Tickets erstellen kann. Hierzu muss erst im Admin-Bereich ein passender API-Zugang angelegt werden. Zu beachten ist, dass ein solcher API-Zugang auf eine IP limitiert ist.

import requests
import json

headers = {'X-API-Key': '12345ENTERHERE12345'}
subject = "12345"

ostdata = {
    "alert": True,
    "autorespond": False,
    "source": "API",
    "name": "GenervterUser",
    "email": "genervter@us.er",
    "phone": "",
    "subject": str(subject),
    "ip": "::1",
    "message": "data:text/plain,Ich bin ein Ticket",
}

json_data = json.dumps(ostdata)

r =
requests.post("https://helpdesk.meinefirma.local/api/tickets.json", data=json_data, verify = '/usr/local/share/ca-certificates/meineca.crt', headers=headers)
print(r)

Hinweise:

  • Der verify-Parameter ist nur nötig, wenn man HTTPS mit einer im System unbekannten CA nutzt
  • Die Telefonnummer wird bei source=API wohl nicht angezeigt
  • Der Name wird bei erster Nutzung mit der E-Mail-Adresse verknüpft, wenn man weitere Tickets mit der selben E-Mail anlegt scheinen diese alle den zuerst genutzten Namen anzuzeigen

Weitere Doku

Nerd Inside