Hallo, ich mache meine ersten Gehversuche mit Arduino Nano und einem Projekt dazu.
Durch viel lesen im Internet gehts auch gut voran, nun stolper ich aber über die Sleep Funktion.
Mein Anliegen, ich frage an einem Analog Pin einen Zustand ab, ist der Pin >999 sag ich "mache deine Arbeit", ist < 999 "geh schlafen".
soweit sogut, im Internet ein feines Beispiel dazu gefunden, geht auch soweit.
Mein Problem das Aufwachen, bzw. versteh ich nicht was er wirklich in der Schlafphase tut.
hier erstmal die wichtigen Auszüge aus dem Sketch.
#include <avr/sleep.h>
#include <avr/power.h>
volatile int sleepcounter = 0; // Schlafzyklen mitzählen
int campin = A3;
int lanpin = A4;
int routerpin = A5;
int solarpin = A7;
//bla bla bla
void setup() {
pinMode (lanpin, OUTPUT); //LAN Pin
pinMode(campin, OUTPUT); //Cam Pin
pinMode(routerpin, OUTPUT); //Router Pin
pinMode(solarpin, INPUT); //Solar Pin
watchdogOn(); // Watchdog timer einschalten für Sleep
currentTime = millis(); //Zeitzeug
}
void loop()
{
//Laufzeit des Boards
currentTime = millis();
//Zeitfunktion aufrufen
uptime();
//Werte setzem
if (secs==00) {
//schauen ob Solar anliegt
int solarvalue = analogRead(solarpin);
if (solarvalue <= 999) {
digitalWrite(lanpin, LOW); //LAN anschalten LOW=AUS, HIGH=AN
digitalWrite(campin, LOW); //Cam LOW=AUS, HIGH=AN
digitalWrite(routerpin, LOW); //Router LOW=AUS , HIGH=AN
pwrDown(180); //180Sekunden Sleep da kein Solar
}
}
delay(1000);
}
void uptime()
{
secs = currentTime/1000; //convect milliseconds to seconds
mins=secs/60; //convert seconds to minutes
hours=mins/60; //convert minutes to hours
secs=secs-(mins*60); //subtract the coverted seconds to minutes in order to display 59 secs max
mins=mins-(hours*60); //subtract the coverted minutes to hours in order to display 59 minutes max
}
void pwrDown(int sekunden) {
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // den tiefsten Schlaf auswählen PWR_DOWN
for(int i=0; i < sekunden; i++) {
sleep_enable(); // sleep mode einschalten
power_all_disable ();// turn off various modules
// power_adc_disable(); // ADC converter
power_spi_disable(); // SPI
power_usart0_disable();// Serial (USART)
// power_timer0_disable();// Timer 0
// power_timer1_disable();// Timer 1
// power_timer2_disable();// Timer 2
power_twi_disable(); // TWI (I2C)
sleep_mode(); // in den sleep mode gehen
sleep_disable(); // sleep mode ausschalten nach dem Erwachen
power_all_enable();
int solarvalue = analogRead(solarpin);
if (solarvalue <= 999) {
digitalWrite(lanpin, LOW); //LAN anschalten LOW=AUS, HIGH=AN
digitalWrite(campin, LOW); //Cam aus=LOW AN=HIGH
digitalWrite(routerpin, LOW); //Router LOW=AUS , HIGH=AN
pwrDown(180); //180Sekunden Sleep da immer noch kein Solar
} else {
asm volatile ("jmp 0");
}
}
}
void watchdogOn() {
MCUSR = MCUSR & B11110111; // Reset flag ausschalten, WDRF bit3 vom MCUSR.
WDTCSR = WDTCSR | B00011000; // Bit 3+4 um danach den Prescaler setzen zu können
WDTCSR = B00000110; // Watchdog Prescaler auf 128k setzen > ergibt ca. 1 Sekunde
WDTCSR = WDTCSR | B01000000; // Watchdog Interrupt einschalten
MCUSR = MCUSR & B11110111;
}
ISR(WDT_vect) {
sleepcounter ++; // Schlafzyklen mitzählen
}
so wer sich jetzt die Mühe gemacht hat da durch zu steigen ...........................
zu Deutsch, im Loop frage ich jede Minute ab Solar JA/NEIN wenn NEIN (<999) dann geh schlafen.
So nun wenn er wieder Aufwacht, will ich eigentlich das er schaut ob Solar anliegt, wenn NEIN wieder schlafen, wenn JA einfach komplett neu starten, weil ich find das am einfachsten das sich alles andere neu initialisiert.
Bei mir ist es im Moment so, er geht schlafen, wenn ich nun Solar JA sage (per anlegen 5V) fährt er SOFORT neu hoch, wie kann das sein? er müsste doch noch im Schlafmodus sein wenn ich 5V anlege und erst wenn die 180Sekunden um sind schauen ob PIN > 999 ???
Ich glaube der schläft nicht richtig?
Danke Heiko