Funktionieren tut es aber gibts irgendwelche Fehler die ich eingebaut/übersehen habe?
Bekannt ist mir:
Wenn man aus der Konsole aus herunterfährt oder das System abstürzt weiß die Schaltung nix davon. Für meine Anwendung spielt das aber keine Rolle.
Verwendet habe ich einen ATtiny45 sowie das Relais FRS1B und als Transistor BC547B. Bekommt man alles beim blau/gelben C
Als Taster verwende ich ein Teil mit integrierter LED. Das LED soll dem Benutzer anzeigen wann er das Netzteil nicht ausstecken darf.
Schaltplan:
siehe Anhang
Code auf dem attiny:
Code: Select all
#include <avr/io.h>
#ifndef F_CPU
#warning "F_CPU war noch nicht definiert, wird nun mit 1000000 definiert"
#define F_CPU 1000000UL
#endif
#include <util/delay.h>
void sleep(uint16_t ms)
{
for(; ms > 0; ms--) _delay_ms(1);
}
int main(void)
{
while(1) {
DDRB |= (1 << DDB1) | (1 << DDB2); // Set pin 2 to output (1: LED, 2: Relais)
DDRB &= ~((1 << DDB3) | (1 << DDB4)); // Set pin 3 and 4 to input (3: Button, 4: Raspberry Pi)
while(!(PINB & (1<<PINB3))) { // Wait for button pressed
;
}
PORTB |= (1<<PB2); // Set Relais ON
while(!(PINB & (1<<PINB4))) { // Wait for Raspberry Pi
;
}
PORTB |= (1<<PB1); // Set LED ON
while(!(PINB & (1<<PINB3))) { // Wait for button pressed
;
}
uint16_t i = 0;
while(PINB & (1<<PINB3)) { // Wait for button pressed
i++;
_delay_ms(1);
}
if(i > 4000) {
PORTB &= ~(1<<PB1); // Set LED OFF
PORTB &= ~(1<<PB2); // Set Relais OFF
continue;
}
DDRB |= (1 << DDB4); // Set pin 4 to output (4: Raspberry Pi)
PORTB |= (1<<PB4);
sleep(1000); // Give RPi a 1 second HIGH pulse
PORTB &= ~(1<<PB4);
DDRB &= ~(1 << DDB4);
sleep(2000); // Wait for RPi
while(PINB & (1<<PINB4)) { // Wait for Raspberry Pi
;
}
sleep(5000); // Wait for safe shutdown
PORTB &= ~(1<<PB1); // Set LED OFF
PORTB &= ~(1<<PB2); // Set Relais OFF
}
return 0;
}
Code: Select all
#!/bin/bash
echo "25" > /sys/class/gpio/unexport
echo "25" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio25/direction
echo "1" > /sys/class/gpio/gpio25/value
sleep 1
echo "in" > /sys/class/gpio/gpio25/direction
while [ true ]
do
if [ "$(cat /sys/class/gpio/gpio25/value)" == '1' ]; then
echo "out" > /sys/class/gpio/gpio25/direction
echo "1" > /sys/class/gpio/gpio25/value
shutdown -h now
exit 1
fi
sleep 0.5
done
LG
*edit*
Bild ist winzig...
http://imageshack.us/photo/my-images/221/v10s.png/


