Status LED ohne Delay, Sleep und Infrarot

Diese //####### Zeichen interpretiert die Forensoftware falsch. Bitte entferne diese.

Und mach mal STRG+T in deiner Arduino IDE, vor dem Kopieren und einsetzen hier.

Edit: Der Kerko sollte sehr nah an die VCC und GND vom ATTiny. So wie es momentan auf deinem Schaltbild ist, ist der Weg vom GND des ATTiny zu dem Kerko zu weit.

Ich Programmiere mit Visual Studio da geht diese Tasten kombi nicht.

edit: Ok es gibt aber eine andere Tastenkombi hoffe das passt jetzt so mit dem Auto Format


#include <Arduino.h>
#include <IRremote.h>
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>

IRsend irsend;

const int b1 = 3;     //Weckbutton
const int b2 = 4;     //Auslöse Button Tasten
const int G_LED = 0;  //Grüne status LED
const int IR_LED = 1; //IR LED

int nb = 0; // anzahl der blink durchläufe
int t = 0;  // time zwischen blinklicht
int i = 0;  // blink Zähler

// LED Blink Loop Rechner 

boolean value = LOW;              // Startwert der LED
unsigned long previousMillis = 0; // speichert wie viele Sekunden seit derletzten Änderung vergangen sind
unsigned long interval = 1500;    // Interval zwischen zwei Änderungen

// Sleep Timmer Rechner 

unsigned long timerMillis = 0;       // speichert wie viele Sekunden seit derletzten Änderung vergangen sind
unsigned long timerinterval = 30000; // Wartezeit bis zum Sleep Mode 30s später 10min=>600 000 ms



void blink(int nb, int t) // Start- und Stopp-LED blinkt
{
  for (i = 0; i <= nb; i++)
  {
    analogWrite(G_LED, 128);
    delay(t);
    analogWrite(G_LED, 0);
    delay(t);
  }
  i = 0;
  t = 0;
}


void setup()
{

  pinMode(b1, INPUT);        //Wecken
  pinMode(b2, INPUT_PULLUP); //Tasten
  pinMode(IR_LED, OUTPUT);
  pinMode(G_LED, OUTPUT);
  Serial.begin(9600);

  blink(3, 500); //Unterprogramm aufrufen LED blinkt
}


void sleep()
{

  blink(3, 5000); //Signal wieder wach
}


void loop()
{
  //+++++++++++Taster Abfrage+++++++++++++++
  if (digitalRead(b2) == HIGH)
  {
    irsend.sendNECMSB(0xC2A9FC0, 32);
    //irsend.sendJVCMSB(0xC2A9FC0, 32);
    Serial.print("Taster ausgelenkt ");
    timerMillis = millis(); //Timmer für Sleep Mode reset

    digitalWrite(IR_LED, HIGH); // Nur zu Testzwecken
    delay(5000);
    digitalWrite(IR_LED, LOW);

    blink(1, 200);
  }

  //++++++++++LED Status Blinken++++++++++++
  if (millis() - previousMillis > interval)
  {
    previousMillis = millis(); // aktuelle Zeit abspeichern

    value = !value; // LED Zustand wecheln.

    digitalWrite(G_LED, value); // Wert auf den Ausgang schreiben
  }
  //+++++++++Timer Sleep Mode zähler++++++++
  if (millis() - timerMillis > timerinterval)
  {
    timerMillis = millis();    // aktuelle Zeit abspeichern
    digitalWrite(G_LED, HIGH); // Warnsignal Sleep Mode
    delay(5000);
    digitalWrite(G_LED, LOW);
    sleep();
  }
}

Dann solltest du das so auch im Programm schreiben.
Du lässt im Setup die Grüne LED blinken.
Im Loop fragst du

ab. Da b2 Input PullUp hat, ist er High. Somit Bedingung erfüllt. Somit leuchtet deine rote led.

So ist es deutlich lesbarer, Danke

Wegen dem Kondensator: ich meinte nicht den Stütz-Elko, sondern den 100nF Ceramik-Kondensator, der als Block-Kondensator dient, um Störungen aus der Betriebsspannung zu blocken. Diese Stöhrungen können auch bei Batteriebetrieb in Die Betriebsspannung von aussen eingestreut werden, wodurch ein zuverlässiges Arbeiten des Mokrokontrollers nicht mehr gewärleistet ist. Spannungsschwankungen kann der Ceramik.Kondensator nicht wirklich auffangen, da er dafür eine zu kleine Kapazität hat, dr ist wegen Hochfrequenz-Störungen notwendig, immer!
Zum stutzen würde ich bei so ner kleinen Energiezelle keinen Normalen Elko einsetzen, da die einen relativ grossen Leckstrom habenn der Dir die Batteriezelle unötig entleert. wenn ein Stützkondensator dann nim einen Tantal-Elko mit 10 oder 22 uF, Spannungsfestigkeit 10V oder 16V. Mit Tantal-Elkos habe ich bei Mikrokontroller-Schaltungen im RC-Modellbau gute erfahrungen gemacht, die Schaltungen laufen sauber und stabil, und Tantalelkos sind auch noch von der Baugrösse her kleiner als Normale Elkos, gleicher Kapazität.

ok es könnte so einfach sein das klappt jetzt. aber komischerweise nur einmal danach ist die Rote LED wieder ohne Funktion.

Ich bin beim besten willen kein Elektriker und was diese Bauteile angeht ganz am Anfang.
Mit dem ganzen Fachwissen bin ich etwas Überfragt.
Tantal Kondensator 15uF 16V
Meinst du sowas?

Und habe ich das richtig rausgelesen das dann 2 unterschiedliche benötigt werden?

Ja.
Der Kerko 100nF direkt am ATTiny schützt vor Störung.
Der Tantal stellt die Energie bereit, die deine Knopfzelle nicht schnell genug liefern kann.

Der von Dir verlinkten Tantalkondensator ist okay. Beim Einbau unbedingt auf die Polarität des Tantalkondesators achten!: Achtung: Bei den Tantalkondensatoren ist der PLUS Anschluss mit einer senkrechten Linie gekenzeichnet. Bed dem in Deinem Link sind es 3 kurze Linien, gilt aber als Kennzeichnung für den PLUS (+) , Anschluss. (bei normalen Elkos ist es genau umgekehrt, da ist der Minus (-) Anschluss mit einem Strich o.ä. gekennzeichnet - dies aber nur zu Deiner Info, falls Du mal irgendwo nen normalen Elko einbauen willst oder musst).

das heißt der Tantal muss dann nicht direkt am Tiny sitzen sondern eher Richtung spannungsquelle

danke für die Info

KERKO 100nF
Wäre das dan der Richtige als KERKO

Ja , Du kannst den Tantal irgendwo in der Nähe der Spannungsquelle plazieren, ist jetzt hier, bei der kleinen Platine nicht kritisch, aber nähe Spannungsquelle ist gut. Mache ich auch so.

ok dann komm ich dem Physikalischen Aufbau ja langsam näher. Im Code passt so einiges halt noch nicht.
Wenn der rechte Button betätigt wird schaltet die rote LED an für 5000ms und wieder aus. Danach ein kurzes Blinken der Grünen LED als Rückmeldung das getastet wurde. Soweit in Ordnung

      //+++++++++++Taster Abfrage+++++++++++++++
    if (digitalRead(b2) == LOW) 
    {
      irsend.sendNEC(0xC2A9FC0, 32); 
      //irsend.sendJVCMSB(0xC2A9FC0, 32); 
      Serial.print("Taster ausgelenkt "); 
      timerMillis = millis();             //Timmer für Sleep Mode reset


      digitalWrite(IR_LED, HIGH);         // Nur zu Testzwecken
      delay(5000);
      digitalWrite(IR_LED, LOW);  


      blink(1,200);    
    } 

Danach geht die Rote wieder an und bleibt an. Rechter Button ohne Funktion. ??

Dann liegt das Problem in dem Code, den Du nicht gezeigt hast.

Es wäre auch hilfreich, wenn Du lokale und globale Variablen besser trennen würdest, am besten unterschiedlich benennen. Dein blink() macht da verdächtige Sachen.

ich hab den blink() mal komplett rausgenommen Ergebnis ist das selber:


//#include <Arduino.h>
#include <IRremote.h>
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>

IRsend irsend;

const int b1 = 3;     //Weckbutton
const int b2 = 4;     //Auslöse Button Tasten
const int G_LED = 0;  //Grüne status LED
const int IR_LED = 1; //IR LED

//int nb = 0; // anzahl der blink durchläufe
//int t = 0;  // time zwischen blinklicht
int i = 0;  // blink Zähler

//LED Blink Loop Rechner

boolean value = LOW;              // Startwert der LED
unsigned long previousMillis = 0; // speichert wie viele Sekunden seit derletzten Änderung vergangen sind
unsigned long interval = 1500;    // Interval zwischen zwei Änderungen

//Sleep Timmer Rechner 

unsigned long timerMillis = 0;       // speichert wie viele Sekunden seit derletzten Änderung vergangen sind
unsigned long timerinterval = 30000; // Wartezeit bis zum Sleep Mode 30s später 10min=>600 000 ms


void setup()
{

  pinMode(b1, INPUT);        //Wecken
  pinMode(b2, INPUT_PULLUP); //Tasten
  pinMode(IR_LED, OUTPUT);
  pinMode(G_LED, OUTPUT);
  //Serial.begin(9600);

}


void sleep()
{

    for (i = 0; i <= 3; i++)  
  {
    digitalWrite(G_LED, HIGH);
    delay(5000);
    digitalWrite(G_LED, LOW);
    delay(5000);
  } 
  i = 0;
}


void loop()
{
  //+++++++++++Taster Abfrage+++++++++++++++
  if (digitalRead(b2) == LOW)
  {
    irsend.sendNEC(0xC2A9FC0, 32);
    //irsend.sendJVCMSB(0xC2A9FC0, 32);
    //Serial.print("Taster ausgelenkt ");
    timerMillis = millis(); //Timmer für Sleep Mode reset

    digitalWrite(IR_LED, HIGH); // Nur zu Testzwecken
    delay(5000);
    digitalWrite(IR_LED, LOW);

    digitalWrite(G_LED, HIGH); //Bestätigung Kante erreicht
    delay(200);
    digitalWrite(G_LED, LOW);
  }

  //++++++++++LED Status Blinken++++++++++++
  if (millis() - previousMillis > interval)
  {
    previousMillis = millis(); // aktuelle Zeit abspeichern

    value = !value; // LED Zustand wecheln.

    digitalWrite(G_LED, value); // Wert auf den Ausgang schreiben
  }
  //+++++++++Timer Sleep Mode zähler++++++++
  if (millis() - timerMillis > timerinterval)
  {
    timerMillis = millis();    // aktuelle Zeit abspeichern
    digitalWrite(G_LED, HIGH); // Warnsignal Sleep Mode
    delay(5000);
    digitalWrite(G_LED, LOW);
    sleep();
  }
}

Wie sind die LED angeschlossen?
Über welchen Pin läuft irsend()?

Du musst dich von den delays trennen. In dieser for-Schleife fängst du den Code für 40 Sekunden ein. In der Zeit kann nichts anderes passieren. Da du millis eh schon nutzt kannst du millis auch hier nutzen. Ganz ohne for Schleife. Zähle bei jedem Blinken ein Zähler mit der dann dein Blinken begrenzt.

Vielleicht erstellst du einen neuen leeren Sketch und fügst Schritt für Schritt etwas dazu.

wo bei es gibt so was

if ((millis() / 5000) % 2 == 1)//LCD alle 5Sek umschalten
  {
    digitalWrite(G_LED, HIGH);
    }
    else {
       digitalWrite(G_LED, LOW); 
    }

Siehe Schaltplan

es wird noch garnichts über IR gesendet weil ich nicht weis wie! Die Rote LED ersetzt aktuell die IR Diode damit ich überhaupt sehe ob was passiert.

Auch hier soll später eigentlich nur noch der Aufruf für den Sleep Mode stehen und nichts blinken. Auch hier wies ich aber nicht wie und diese Zeilen Dienen nur als Feedback damit ich nachvollziehen kann wo er gerade im PGM steht