Taster und Ir Bedienung geht das ?

agmue:
Da muß ich Euch leider enttäuschen. Wenn man die IRremote mit Anpassungen von Nick Gammon (gammon.com.au/Arduino/IRremote_Attiny.zip) nutzt, habe ich als Anfänger es sogar geschafft. Keine echte Herausforderung weit und breit. ATtiny85 mit 8 MHz betreiben. Mein Projekt

Ok, das ist doch mal ein Ansatz.
Ich habe es auch schon mit der Lib versucht, bin aber daran gescheitert.
Habe mit da mal so einiges im Web durchgelesen und erst mal zur Seite gelegt.

Evtl. hast du ja ne Idee, wo es hakt.

Werde das alles mal wieder rauskramen.

Edit:
Ich hatte damals irgend etwas mit Fehler in vector4 oder so.

Die TinyWireS kann wohl nur byteweise übertragen, weshalb ich eine Lösung von Serenifly als Vorbild genommen habe, den Slave als IC anzusprechen.

hab mir jetzt die Grundschaltung noch mal auf ein testboard aufgebaut . hätte ja jetzt pin a0-a5 frei und auch 3-7

soweit so gut bin jetzt total durcheinander. IR-empfänger hab ich den vs 18388 steckt auch drauf und 4 Leeds zum test . dort will ich später einfach die optokoppler anbauen und parallel zum Taster gehen.

oh man dachte echt das ist so einfach

Hobergs-Art:
oh man dachte echt das ist so einfach

Ist es eigentlich auch. Wo stehst Du derzeit und was ist Dein Problem?

also einfach mal durchschauen und zur not verbessern :slight_smile:

Hab die Schaltung erst mal nur mit den 3 Ventilen aufgebaut und als Taster LED´s dran

der code

#include <IRremote.h>   // Das Programm greift an dieser Stelle auf eine „Library“ zurück. Das erleichtert einem viel Arbeit. Denn das Infrarotlicht wird mit einem Code verschlüsselt gesendet. Um diesen Code selber auszulesen und in passende Werte umzuwandeln, wären sehr viele Zeilen Code erforderlich.

int RECV_PIN = 7;  //  Der Kontakt der am Infrarotsensor die Daten ausgibt, wird mit Pin 11 des Arduinoboards verbunden.

IRrecv irrecv(RECV_PIN);   // An dieser Stelle wird ein Objekt definiert, dass den Infrarotsensor an Pin 11 ausliest.

decode_results results;  // Dieser Befehl sorgt dafür, dass die Daten, die per Infrarot eingelesen werden unter „results“ abgespeichert werden.

 

int LED6 = 6; // LED Pin Ventil 1 IR Anzeige 
int LED5 = 5; // LED Pin Ventil 2 IR Anzeige 
int LED4 = 4; // LED Pin Ventil 3 IR Anzeige 
int LED3 = 3; // Led PIN  ALLE Ventile IR Test durchlauf 


const int blinkInterval = 500;

long timeVentil1on = 1000;
long pause1        = 100;
long timeVentil2on = 1000;
long pause2        = 100; 
long timeVentil3on = 1000;

const byte taster   = 2;
const byte ventil1  = 9;
const byte ventil2  = 10;
const byte ventil3  = 11;
const byte ledRot   = 12;
const byte ledGruen = 8;

boolean buttonState;
boolean lastButtonState;

void setup()
{ 

Serial.begin(9600);    //Im Setup wird die Serielle Verbindung gestartet, damit man sich die Empfangenen Daten der Fernbedienung per seriellen Monitor ansehen kann.
pinMode (6, OUTPUT);   //An Pin 6 ist eine LED angeschlossen zum test des IR .
digitalWrite(6, LOW);    //Diese soll zunächst aus sein
pinMode (5, OUTPUT);   //An Pin 6 ist eine LED angeschlossen zum test des IR .
digitalWrite(5, LOW);    //Diese soll zunächst aus sein
pinMode (4, OUTPUT);   //An Pin 6 ist eine LED angeschlossen zum test des IR .
digitalWrite(4, LOW);    //Diese soll zunächst aus sein
pinMode (3, OUTPUT);   //An Pin 6 ist eine LED angeschlossen zum test des IR .
digitalWrite(3, LOW);    //Diese soll zunächst aus sein
irrecv.enableIRIn();   //Dieser Befehl initialisiert den Infrarotempfänger.


   pinMode(taster, INPUT_PULLUP);
   pinMode(ventil1, OUTPUT);
   pinMode(ventil2, OUTPUT);
   pinMode(ventil3, OUTPUT);
   pinMode(ledRot, OUTPUT);
   pinMode(ledGruen, OUTPUT);
}

void loop()
{ 

if (irrecv.decode(&results)) 
 {
  irrecv.resume(); // Das Signal empfangen
 }
  switch(results.value) // Abhaengig vom Signal in den richtigen Modus springen
 {

  /************************************Ventil 1********************************/
  case 2534850111://Wenn der Infrarotempfänger die Zahl 
//„2534850111“ ausgelesen hat (Entsprechend der Taste“1“ auf der Fernbedienung)
//dann
 Serial.println("Ventil 1"); // Ausgabe auf der Seriellenschnittstelle
 digitalWrite (6, LOW);//soll die LED an pin 6 angehen.

   digitalWrite(ledGruen, LOW);
   digitalWrite(ledRot, HIGH);
   
   digitalWrite(ventil1, HIGH);
   delay(timeVentil1on);
   digitalWrite(ventil1, LOW);
   delay(pause1);
 break;
 
  /************************************Ventil 1 ENDE********************************/

  /************************************Ventil 2 ********************************/
 case 1033561079: //Wenn der Infrarotempfänger die Zahl 
//„1033561079“ ausgelesen hat (Entsprechend der Taste“2“ auf der Fernbedienung)
//dann
 digitalWrite (5, LOW);//soll die LED an pin 5 angehen.
 Serial.println("VENTIL 2"); // Ausgabe auf der Seriellenschnittstelle
   digitalWrite(ledGruen, LOW);
   digitalWrite(ledRot, HIGH);
   
   digitalWrite(ventil2, HIGH);
   delay(timeVentil2on);
   digitalWrite(ventil2, LOW);
   delay(pause2);
 break;
/************************************Ventil 2 ENDE ********************************/

/************************************Ventil 3 ********************************/
 case 1635910171: //Wenn der Infrarotempfänger die Zahl 
//„1635910171“ ausgelesen hat (Entsprechend der Taste“3“ auf der Fernbedienung)
//dann
 digitalWrite (4, LOW);//soll die LED an pin 4 angehen.
 Serial.println("VENTIL 3"); // Ausgabe auf der Seriellenschnittstelle
   digitalWrite(ledGruen, LOW);
   digitalWrite(ledRot, HIGH);
   
   digitalWrite(ventil3, HIGH);
   delay(timeVentil3on);
   digitalWrite(ventil3, LOW);
   digitalWrite(ledRot, LOW);
 break;
/************************************Ventil 3 ENDE ********************************/

/************************************Ventil TEST ALLE ********************************/
 case 3855596927: //Wenn der Infrarotempfänger die Zahl 
//„3855596927“ ausgelesen hat (Entsprechend der Taste“EQ“ auf der Fernbedienung)
//dann
 digitalWrite (3, LOW);//soll die LED an pin 4 angehen.
 Serial.println("VENTILE Test"); // Ausgabe auf der Seriellenschnittstelle
   digitalWrite(ledGruen, LOW);
   digitalWrite(ledRot, HIGH);
   
   digitalWrite(ventil1, HIGH);
   delay(timeVentil1on);
   digitalWrite(ventil1, LOW);
   delay(pause1);
   
   digitalWrite(ventil2, HIGH);
   delay(timeVentil2on);
   digitalWrite(ventil2, LOW);
   delay(pause2);
   
   digitalWrite(ventil3, HIGH);
   delay(timeVentil3on);
   digitalWrite(ventil3, LOW);
   digitalWrite(ledRot, LOW);
 break;
/************************************Ventil TEST ENDE ********************************/
 
 default: // Standard
 digitalWrite(LED6, HIGH);
 digitalWrite(LED5, HIGH);
 digitalWrite(LED4, HIGH);
 digitalWrite(LED3, HIGH);
 
}

   buttonState = digitalRead(taster);
   if (buttonState == LOW  &&  buttonState != lastButtonState)   // Taster wurde gedrueckt
   {  action();
   }
   digitalWrite(ledGruen, millis()/blinkInterval%2);   // die gruene LED blinkt (nicht-blockierend)
   lastButtonState = buttonState;
}  

void action()    // diese Funktion ist blockierend
{  digitalWrite(ledGruen, LOW);
   digitalWrite(ledRot, HIGH);
   
   digitalWrite(ventil1, HIGH);
   delay(timeVentil1on);
   digitalWrite(ventil1, LOW);
   delay(pause1);
   
   digitalWrite(ventil2, HIGH);
   delay(timeVentil2on);
   digitalWrite(ventil2, LOW);
   delay(pause2);
   
   digitalWrite(ventil3, HIGH);
   delay(timeVentil3on);
   digitalWrite(ventil3, LOW);
   digitalWrite(ledRot, LOW);
}

und es geht auch alles . Denke zwar das ist nicht formschön aber die Funktion geht :slight_smile:

Deine vielen "delays" blockieren aber immer noch den Sketch.
Während die Funktion durchläuft, wird kein IR-Code angenommen.
Das musst du umschreiben, wurde auch schon geschrieben.

Das ist doch richtig so .

Solange eine Funktion durchläuft soll die auch 100% durchlaufen egal was ich mache . Es darf nichts anders passieren .
Das war doch so gedacht

Ahh, ok. Wenn es so sein soll ist das doch gut. Und wenn es jetzt auch funktioniert, noch besser.

Jo geht perfekt . Und wieder was dazu verlebt :-). Danke Euch allen

Wenn mal jemand sowas sucht kann er mich gern anschreiben . der code ist jetzt über 9000 Zeichen groß und kann ich so hier nicht posten .

BYEEEEE. Und danke

Hobergs-Art:
Jo geht perfekt . Und wieder was dazu verlebt :-). Danke Euch allen

Wenn mal jemand sowas sucht kann er mich gern anschreiben . der code ist jetzt über 9000 Zeichen groß und kann ich so hier nicht posten .

BYEEEEE. Und danke

Gerne und wir freuen uns alle auf ein Karma von dir.

was richtig cooles wäre hier noch eine 7 Segment anzeige einzubauen :slight_smile: aber da die Ventile in micro sek !!!! schalten würde ich wo nie sehen von 1 2 3 :-). Karma wird verteilt

Hobergs-Art:
was richtig cooles wäre hier noch eine 7 Segment anzeige einzubauen :slight_smile: aber da die Ventile in micro sek !!!! schalten würde ich wo nie sehen von 1 2 3 :-). Karma wird verteilt

Dann würde ich es bei den Leds belassen.
Die 7Segmentanzeige musst du ja auch ansteuern und wenn es eh knapp mit den Pins ist.

agmue:
Da muß ich Euch leider enttäuschen.

Warum ?
Nur weil es keine echte Herausforderung ist ?

Ich habe es gerade nochmal angepackt und das Kompilieren macht auch keine Fehler mehr.
Habe erst mal die einfacher Variante (Serielle Übertragung per SoftwareSerial) gewählt. Und funktionierte sofort. So kann ich die IR-Code direkt weiterleiten und im Empfänger (Atmega328) auswerten.

Die I2C-Variante kommt auch noch aber wird auch funktionieren. Danke Tommy und dir für den Anreiz.

HotSystems:
Danke Tommy und dir für den Anreiz.

Als Ansporn war meine Bemerkung gemeint gewesen. Bitte gerne :slight_smile:

agmue:
Als Ansporn war meine Bemerkung gemeint gewesen. Bitte gerne :slight_smile:

Genau, manchmal braucht es eben so einen Piks.