Attiny85 will nicht aufwachen

Beispielsweise #6, jetzt mit Markierung.

grafik

Das Datenblatt vom ATtiny85. @Combi hat das aber auch schon in Beitrag #6 verlinkt.
Weil ich den Eindruck hatte, dass das bisher konsequent ignoriert wurde, wollte ich noch einmal darauf hinweisen.

Sonst ist dem TO nämlich nicht geholfen.

post #3 schon geändert und noch mal danke, extra fürs unmissverständliches Bild.

Den Eindruck hatte ich auch!
Bin mir aber zu fein, da mehr als 2 oder 3 mal drauf hinzuweisen.

Es ist OK, mir nicht zu glauben.
Es ist auch OK, das im Datenblatt geschriebene zu überlesen.
usw.
Aber meine Sache ist das dann nicht mehr.

@kolaha geht auch mit erneut abgeänderten code nicht. das teil pennt einfach weiter. habe den interrupt auch schon mit rising, falling, chance probiert, geht auch nicht.

Häng nicht so an deinem Code fest. Probiere den Code von @agmue aus post #19 aus. Der ist erprobt. Wenn das bei Dir auch klappt, hast Du eine Vorlage für Deinen Code und kannst ihn entsprechend anpassen.

Werde ich morgen mal versuchen. Danke.

Warum?
Im Datenblatt steht, dass das nicht funktioniert!
Hoffst du auf Magie?

@combie vielleicht, bin leicht übermüdet.

#include <VirtualWire.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>


#define BUZZER_PIN 0
#define VIBRATION_SENSOR_PIN 2
#define TRANSMIT_PIN 1

// Eindeutige ID für diese Einheit
const char *unitID = "UNIT1";

void setup() {
  vw_set_tx_pin(TRANSMIT_PIN);
  vw_setup(2000);
  pinMode(BUZZER_PIN, OUTPUT);
  pinMode(VIBRATION_SENSOR_PIN, INPUT_PULLUP);
  digitalWrite(VIBRATION_SENSOR_PIN, HIGH);
}

void loop() {
  int vibrationState = digitalRead(VIBRATION_SENSOR_PIN);
  if (vibrationState == HIGH) {
    // Wenn Vibration erkannt wurde, Buzzer aktivieren
    digitalWrite(BUZZER_PIN, HIGH);

    // Nachricht mit eindeutiger ID senden
    char msg[20];
    sprintf(msg, "%s:BEEP", unitID);
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx();
  } else {
    // Wenn keine Vibration mehr festgestellt wird, Buzzer ausschalten
    digitalWrite(BUZZER_PIN, LOW);
    sleepNow();
  }
}

void sleepNow() {
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);   
  sleep_enable();                        
  attachInterrupt(0, wakeUpNow, LOW);    

  sleep_mode();                          

  sleep_disable();                       
  detachInterrupt(0);                    
}

void wakeUpNow() {
}

hab jetzt das hier zusammen gebastelt. jetzt piepst er zwar wieder aber geht nicht mehr in den tiefschlaf :joy: verbrauch 8,8mA. ich bin für heute am ende....


#include <VirtualWire.h>
#include <avr/sleep.h>

#define BUZZER_PIN 0            //Bein 5
#define TRANSMIT_PIN 1          //Bein 6
#define VIBRATION_SENSOR_PIN 2  //Bein 7

#define Buzz_On (PORTB|=(1<<BUZZER_PIN))
#define BuzzOff (PORTB&=~(1<<BUZZER_PIN))

// Eindeutige ID für diese Einheit
const char *unitID = "UNIT1";

void setup() {
  vw_set_tx_pin(TRANSMIT_PIN);
  vw_setup(2000);
  pinMode(BUZZER_PIN, OUTPUT);
  pinMode(VIBRATION_SENSOR_PIN, INPUT);
  GIMSK |= (1 << 6);
  MCUCR |= (1 << 0) | (1 << 1);  // The rising edge of INT0 generates an interrupt request.
}

void loop() {
  static  char msg[20];
  if (digitalRead(BUZZER_PIN)) {
    sprintf(msg, "%s:BEEP", unitID);    // Nachricht mit eindeutiger ID senden
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx();
    while (digitalRead(VIBRATION_SENSOR_PIN));
    BuzzOff;
  }
  sleepNow();
}

void sleepNow() {
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  interrupts();
  sleep_mode();
  noInterrupts();
  sleep_disable();
}

ISR(INT0_vect) {
  Buzz_On;
}

Sendet der Sensor ein durchgehendes LOW-Signal, wenn er Vibrationen erkennt, oder gibt es ständige HIGH-LOW-Wechsel? Im zweiten Fall benötigt der Sensor möglicherweise ein retriggerbares Monoflop, um die gewünschte Funktionalität zu erreichen.

Test mit retriggerbarem Monoflop
// https://forum.arduino.cc/t/attiny85-will-nicht-aufwachen/1115819/19
// Attiny85 will nicht aufwachen
// Quelle: https://github.com/blevien/attiny85-sleep/blob/master/attiny85-sleep.ino
#include <avr/interrupt.h>
#include <avr/sleep.h>

const byte ledPinLoop = 0;        // LED connected to digital pin 0
const byte ledPinWakeUp = 4;      // LED to show the action of a interrupt
const byte wakePin = 2;           // active LOW, ground this pin momentary to wake up
uint32_t vorher = 0;

void setup()
{
  pinMode(ledPinLoop, OUTPUT);     // sets the digital pin as output
  pinMode(ledPinWakeUp, OUTPUT);   // sets the digital pin as output
  pinMode(wakePin, INPUT_PULLUP);  // sets the digital pin as input
}

void sleepNow()
{
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);   // sleep mode is set here
  sleep_enable();                        // enables the sleep bit in the mcucr register so sleep is possible
  attachInterrupt(0, wakeUpNow, LOW);    // use interrupt 0 (pin 2) and run function wakeUpNow when pin 2 gets LOW
  digitalWrite(ledPinLoop, LOW);

  sleep_mode();                          // here the device is actually put to sleep!!

  sleep_disable();                       // first thing after waking from sleep: disable sleep...
  detachInterrupt(0);                    // disables interrupton pin 3 so the wakeUpNow code will not be executed during normal running time.
  delay(10);                             // wait so humans can notice the interrupt LED to show the interrupt is handled
  digitalWrite (ledPinWakeUp, LOW);      // turn off the interrupt LED
}

void wakeUpNow()        // here the interrupt is handled after wakeup
{
  // execute code here after wake-up before returning to the loop() function
  // timers and code using timers (serial.print and more...) will not work here.
  digitalWrite(ledPinWakeUp, HIGH);
}

void loop()
{
  digitalWrite(ledPinLoop, HIGH);        // sets the LED on
  if (!digitalRead(wakePin))
  {
    vorher = millis();                   // retriggern
  }
  if (millis() - vorher >= 1000)         // seit 1 Sekunde keine Impulse  
  {
    sleepNow();                          // sleep function called here
  }
}

ich vermute mal, dass Quecksilber Tropfen kann physikalisch nicht schneller hin und zurück schalten als Attiny aufwacht, aber für später sollte man tatsächlich den Pegel ein Weilchen beobachten, das könnte ich auch noch hinzufügen, wenn es mit den Aufwachen/Einschlafen klappt.

#include <VirtualWire.h>
#include <avr/sleep.h>

#define BUZZER_PIN 0            //Bein 5
#define TRANSMIT_PIN 1          //Bein 6
#define VIBRATION_SENSOR_PIN 2  //Bein 7

#define Buzz_On (PORTB|=(1<<BUZZER_PIN))
#define BuzzOff (PORTB&=~(1<<BUZZER_PIN))

// Eindeutige ID für diese Einheit
const char *unitID = "UNIT1";

ISR(INT0_vect) {
  Buzz_On;
}

void setup() {
  vw_set_tx_pin(TRANSMIT_PIN);
  vw_setup(2000);
  pinMode(BUZZER_PIN, OUTPUT);
  pinMode(VIBRATION_SENSOR_PIN, INPUT);
  GIMSK |= (1 << 6);
  MCUCR |= (1 << 0) | (1 << 1);  // The rising edge of INT0 generates an interrupt request.
}

void loop() {
  static  char msg[20];
  if (digitalRead(BUZZER_PIN)) {
    sprintf(msg, "%s:BEEP", unitID);    // Nachricht mit eindeutiger ID senden
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx();
    uint32_t MerkeMillis = millis();
    bool beobachten = true;
    bool Ergebnis = true;
    while (beobachten) {
      if (digitalRead(VIBRATION_SENSOR_PIN))Ergebnis = false;
      if (millis() - MerkeMillis > 1000)
        if (Ergebnis)beobachten = false;
        else {
          MerkeMillis = millis();
          Ergebnis = true;
          sprintf(msg, "%s:stillBEEP", unitID);
          vw_send((uint8_t *)msg, strlen(msg));
          vw_wait_tx();
        }
    }
    BuzzOff;
  }
  sleepNow();
}

void sleepNow() {
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  interrupts();
  sleep_mode();
  noInterrupts();
  sleep_disable();
}

Ich werde die Sketche heute Abend mal testen. Das der Tropfen Physikalisch zu schnell kann eigentlich nicht sein, weil ich den Tropfen auch an einer Stelle lassen kann und somit ein Dauerkontakt entsteht. Der Sensor reagiert auf Vibration und auf Neigung.

Es geht eigentlich darum, bei mehreren, kurz hintereinander folgenden Impulsen, nur eine Nachricht zu bekommen. Erst nach einer Pause nach dem letzten Impuls wird wieder "scharfgeschaltet".

So die Idee und Anregung.

@kolaha Dein Code aus Post 30 erzeugt einen Pieper beim Einschalten, dann tut sich gar nichts mehr. Der Code aus Post 32 erzeugt einen Dauerton sobald ich die Batterie anschließe.

Das sind übrigens der Sender und Empfänger Code ohne Tiefschlaffunktion. Beide funktionieren super. Nur wenn ich einen Tiefschlaf mit implementiere bekomme ich ihn nicht mehr wach. Das der Vibrationssensor in dem Code auf dem Falschen Beinchen ist habe ich natürlich im DeepSleep Code geändert. Der Buzzer vibriert solange in Impulsen wie er bewegt wird. Genau das wird auch per Funk übertragen.

**Sender:**

#include <VirtualWire.h>

// Pin-Belegungen für ATtiny85 
#define BUZZER_PIN 0
#define VIBRATION_SENSOR_PIN 1
#define TRANSMIT_PIN 2

// Eindeutige ID für diese Einheit
const char *unitID = "UNIT1";

void setup() {
vw_set_tx_pin(TRANSMIT_PIN);
vw_setup(2000);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(VIBRATION_SENSOR_PIN, INPUT);
}

void loop() {
int vibrationState = digitalRead(VIBRATION_SENSOR_PIN);
if (vibrationState == HIGH) {
// Wenn Vibration erkannt wurde, Buzzer aktivieren
digitalWrite(BUZZER_PIN, HIGH);

// Nachricht mit eindeutiger ID senden
char msg[20];
sprintf(msg, "%s:BEEP", unitID);
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx();
} else {
// Wenn keine Vibration mehr festgestellt wird, Buzzer ausschalten
digitalWrite(BUZZER_PIN, LOW);
}
}



**dazugehöriger Empfänger Code:**


#include <VirtualWire.h>

// Pin-Belegungen für ATtiny85 (müssen möglicherweise angepasst werden)
#define BUZZER_PIN 0
#define RECEIVE_PIN 1

// Eindeutige ID für diese Einheit
const char *unitID = "UNIT1";

void setup() {
vw_set_rx_pin(RECEIVE_PIN);
vw_setup(2000);
vw_rx_start();
pinMode(BUZZER_PIN, OUTPUT);
}

void loop() {
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;

if (vw_get_message(buf, &buflen)) {
// Nachricht empfangen
char msg[buflen + 1];
memcpy(msg, buf, buflen);
msg[buflen] = '\0';

// Überprüfen, ob die Nachricht die richtige ID enthält
char checkID[20];
sprintf(checkID, "%s:", unitID);
if (strncmp(msg, checkID, strlen(checkID)) == 0) {
// Summer für 0,3 Sekunden aktivieren
digitalWrite(BUZZER_PIN, HIGH);
delay(300);
digitalWrite(BUZZER_PIN, LOW);
}
}
}

gut. dann kollidiert entweder Schlaf- oder Unterbrechfunktion mit der Versand-Bibliothek. oder?

Ich bin mit meinem Laienprogrammierlatein am Ende.
Würde mich freuen wenn noch jemand einen Lösungsansatz hätte. Letztendlich geht es mir darum möglichst lange Betriebslaufzeit aus der Batterie rauszuholen. Dafür wäre dieser Tiefschlaf mit Interrupt vom Vibrationssensor der beste gewesen. Watchdog und Co bringt mir nix, weil Vibration und 433Mhz Übertragung möglichst 1 zu 1 stattfinden muss.

im Prinzip can man innere Geräte selbst ausschalten: ADC, BOD, Wachhund, etc. und so Energie sparen

Meine in #19 und #31 hast Du leider ignoriert, warum? Mein ATtiny85 schläft und wacht auf, wie programmiert.

Deine Codes werde ich auch noch testen. Ich bin nicht so fit im programmieren und wenn mein Code hier nicht direkt von jemand umgeschrieben wird, dass ich nur Copy und Paste machen muß, muss sich mein Sohn immer erst neben mir plazieren um das umzuschreiben.