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€.
(1.3 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
(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
(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
(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
(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
(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
(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
(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
(77.4 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