Wer kennt es nicht, man sitzt auf dem Sofa und will einen Film schauen…
Aber nein der Raspberry Pi ist noch aus…
Also wieder aufstehen und den Netzstecker ziehen đ
Da ich mich und die Micro USB Buchse schonen wollte
habe ich nun ein kleines Gadget gebastelt.
Teile Liste:
- Arduino Uno (oder vergleichbares)
- Raspberry Pi :o)
- Taster
- Led Rot
- Led GrĂŒn
- Passende WiderstĂ€nde fĂŒr die gewĂ€hlten LEDÂŽs
- IR-EmpfÀnger (TSOP 4838)
https://youtu.be/tze5aOquT1Q
Das folgende Script muss auf den Raspberry Pi erstellt werden.
(nicht vergessen:Â sudo chmod 755 /home/pi/RaspiRemoteHelper.sh)
#!/bin/bash
############################################################
## Raspberry PI Remote Switch Helper Script v0.1 ##
## ##
## Shojo 30/12/2014 ##
## ##
## Kontakt: ##
## https://www.bastelbunker.de/raspberry-pi-remote-switch/ ##
############################################################
echo "22" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio22/direction
echo "1" > /sys/class/gpio/gpio22/value
echo "23" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio23/direction
while true
do
ButtonState=$(cat /sys/class/gpio/gpio23/value)
if [ $ButtonState -eq "1" ]; then
poweroff &
exit 0
else
sleep 2
fi
doneNun wird der Script in der rc.local eingetragen (Der Autostart!)
(sudo nano /etc/rc.local)
Nach einen Neustart lÀuft das Script nun.
Jetzt noch der Arduino Code:
Die AbhÀngigkeiten:
Â
#include <Arduino.h>
#include <IRremote.h>
#include <EEPROM.h>
#include "EEPROMAnything.h"
// IR
#define RECV_PIN 11
// RPI-PIN's
#define WAKE_UP_PIN 8
#define GO_SLEEP_PIN 7
#define RPI_ONLINE_PIN 9
// Button
#define ON_OFF_BUTTON 4
// LED's
#define STATE_LED_ONLINE 6
#define STATE_LED_OFFLINE 10
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long StartPressButtonTimer = 0;
boolean ShortPressButton = false;
struct config_t
{
long WakeUPKey;
long GoSleep;
} Data;
void setup()
{
pinMode(WAKE_UP_PIN, OUTPUT);
pinMode(GO_SLEEP_PIN, OUTPUT);
pinMode(RPI_ONLINE_PIN, INPUT);
pinMode(STATE_LED_ONLINE, OUTPUT);
pinMode(STATE_LED_OFFLINE, OUTPUT);
pinMode(ON_OFF_BUTTON, INPUT_PULLUP);
// Der Raspberry Pi wird ĂŒber GND resettet!
digitalWrite(WAKE_UP_PIN, true);
Serial.begin(115200);
irrecv.enableIRIn();
EEPROM_readAnything(0, Data);
}
void loop()
{
if (!digitalRead(ON_OFF_BUTTON))
{
// 5 Sek. drĂŒcken um im Aufnahme Modus zu kommen.
if (millis() - StartPressButtonTimer > 4999)
{
Serial.println(F("Go in rec mode."));
RecSignal();
StartPressButtonTimer = millis();
}
return;
}
// Unter 5 Sek. drĂŒcken um ein oder aus zuschalten.
else if (millis() - StartPressButtonTimer > 250)
{
ShortPressButton = true;
StartPressButtonTimer = millis();
}
else
{
StartPressButtonTimer = millis();
}
if (irrecv.decode(&results))
{
if ((Data.WakeUPKey == results.value) && !digitalRead(RPI_ONLINE_PIN))
{
Serial.println(F("IR event"));
WakeUp();
StartPressButtonTimer = millis();
}
else if ((Data.GoSleep == results.value) && digitalRead(RPI_ONLINE_PIN))
{
Serial.println(F("IR event"));
GoSleep();
StartPressButtonTimer = millis();
}
irrecv.resume();
}
if (ShortPressButton && !digitalRead(RPI_ONLINE_PIN))
{
Serial.println(F("Button event"));
WakeUp();
ShortPressButton = false;
StartPressButtonTimer = millis();
}
else if (ShortPressButton && digitalRead(RPI_ONLINE_PIN))
{
Serial.println(F("Button event"));
GoSleep();
digitalWrite(GO_SLEEP_PIN, false);
ShortPressButton = false;
StartPressButtonTimer = millis();
}
}
void Blinking(int LED)
{
int counter = 0;
while (counter <= 5)
{
digitalWrite(LED, true);
delay(100);
digitalWrite(LED, false);
delay(100);
counter++;
}
}
void TwoBlinking(int LED1, int LED2)
{
int counter = 0;
while (counter <= 5)
{
digitalWrite(LED1, true);
digitalWrite(LED2, true);
delay(100);
digitalWrite(LED1, false);
digitalWrite(LED2, false);
delay(100);
counter++;
}
}
void Fading(bool isBooting)
{
int STATE_LED = 0;
// Welche LED ?
if (isBooting)
{
STATE_LED = STATE_LED_ONLINE;
}
else
{
STATE_LED = STATE_LED_OFFLINE;
}
// Fade in
for (int fadeValue = 0; fadeValue <= 20; fadeValue += 5)
{
analogWrite(STATE_LED, fadeValue);
delay(30);
}
// In der FadingSchleife verweilen bis hoch oder runter gefahren wurde.
while (GetSystemStateForWhile(isBooting))
{
for (int fadeValue = 20; fadeValue <= 255; fadeValue += 5)
{
analogWrite(STATE_LED, fadeValue);
delay(30);
}
for (int fadeValue = 255; fadeValue >= 20; fadeValue -= 5)
{
analogWrite(STATE_LED, fadeValue);
delay(30);
}
}
// Fade out
for (int fadeValue = 20; fadeValue >= 0; fadeValue -= 5)
{
analogWrite(STATE_LED, fadeValue);
delay(30);
}
}
// State fĂŒr Boot oder Shutdown ermitteln
boolean GetSystemStateForWhile(bool isBooting)
{
bool result;
if (isBooting)
{
result = !digitalRead(RPI_ONLINE_PIN);
}
else
{
result = digitalRead(RPI_ONLINE_PIN);
}
return result;
}
void WakeUp()
{
Serial.println(F("Wake UP!"));
digitalWrite(WAKE_UP_PIN, false);
delay(500);
digitalWrite(WAKE_UP_PIN, true);
Fading(true);
}
void GoSleep()
{
Serial.println(F("Go sleep..."));
digitalWrite(GO_SLEEP_PIN, true);
Fading(false);
}
// Startet im Einschlatsignal aufnahme Modus.
void RecSignal()
{
bool WakeUpSignal = true;
int LED = 0;
StartPressButtonTimer = millis();
while (true)
{
if (!digitalRead(ON_OFF_BUTTON))
{
// 2 Sek. drĂŒcken um das Ausschlatsignal zu speichern.
if (millis() - StartPressButtonTimer > 1999)
{
WakeUpSignal = false;
}
// 5 Sek. drĂŒcken um alle Einstellungen zu löschen!
if (millis() - StartPressButtonTimer > 3999)
{
LED = 0;
Serial.println(F("Delete all signals!"));
TwoBlinking(STATE_LED_OFFLINE, STATE_LED_ONLINE);
Data.WakeUPKey = 0;
Data.GoSleep = 0;
EEPROM_writeAnything(0, Data);
break;
}
}
else
{
StartPressButtonTimer = millis();
}
if (WakeUpSignal)
{
LED = STATE_LED_ONLINE;
digitalWrite(STATE_LED_ONLINE, true);
digitalWrite(STATE_LED_OFFLINE, false);
}
else
{
LED = STATE_LED_OFFLINE;
digitalWrite(STATE_LED_OFFLINE, true);
digitalWrite(STATE_LED_ONLINE, false);
}
if (irrecv.decode(&results))
{
if (WakeUpSignal)
{
Data.WakeUPKey = results.value;
}
else
{
Data.GoSleep = results.value;
}
EEPROM_writeAnything(0, Data);
irrecv.resume();
break;
}
}
if (LED != 0)
{
Blinking(LED);
}
}Update 18.01.2015:
So ich habe jetzt mal die ersten Platinen hergestellt…
Hier das Ergebnis:












