Hallo Zusammen,
ich bastel gerade an meinem ersten Projekt und bin blutiger Anfänger... ich hoffe jemand kann mir helfen ![]()
Ich möchte gern die ausgelesen Daten einer IR Fernbedienung (Slave Arduino) vom Master einlesen lassen sobald eine Taste gedrückt wurde.
Im Moment setzt der Slave kurz einen Ausgang auf LOW -> dieses Signal will ich am Master benutzen um die Daten "abzuholen". Leider hängt sich das ganze aber auf sobald ich eine Taste drücke. Nun die Frage: kann man die I2C Daten nicht innerhalb eines Interrupts auslesen bzw. in Variablen schreiben?
Danke schon mal im Voraus ![]()
Slave:
// Auslesen einer IR-Fernbedienung mit 24 Tasten
// Ausgabe eines Bytes (Taste) über I2C an Master
// Ausgabe eines "Interrupts" (IRQ) an Master
#include <Arduino.h>
#include <IRremote.h>
#include <Wire.h>
#define I2C_ADDR 8 // i2c slave address
#define IR_SIG_IN 3 // IR Sensor Signal
#define IRQ_PIN 6 // Interrupt an Master
byte i2cByte[] = { 101, 102, 103, 104, 105, 106 , 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124 };
byte sendByte = 0;
//______________________________________________________________________________________________________________________________________________
void setup()
{
Serial.begin(9600); // Serielle Ausgabe starten
IrReceiver.begin(IR_SIG_IN, ENABLE_LED_FEEDBACK, USE_DEFAULT_FEEDBACK_LED_PIN); // Infrarotempfänger initialisieren
Wire.onRequest(IRCodeTransmit); // Auf Anfrage des Master sendByte übertragen
Wire.begin(I2C_ADDR); // init I2C Slave mode
digitalWrite(IRQ_PIN, HIGH); // Output Pin, Interrupt für Master auf HIGH
pinMode(IRQ_PIN, OUTPUT); // IRQ LOW
}
//______________________________________________________________________________________________________________________________________________
void loop(){
readIRcode(); // start IR-Code empfangen und dekodieren
}
//______________________________________________________________________________________________________________________________________________
void readIRcode(){
if (IrReceiver.decode()) {
//Fernbedienung Tasten________________________________________________________________
switch (IrReceiver.decodedIRData.decodedRawData) {
case 0xF609FF00: sendi2cIRQ(i2cByte[0]); break; //Heller
case 0xE21DFF00: sendi2cIRQ(i2cByte[1]); break; //Dunkler
case 0xE01FFF00: sendi2cIRQ(i2cByte[2]); break; //OFF
case 0xF20DFF00: sendi2cIRQ(i2cByte[3]); break; //ON
case 0xE619FF00: sendi2cIRQ(i2cByte[4]); break; //Rot
case 0xE41BFF00: sendi2cIRQ(i2cByte[5]); break; //Grün
case 0xEE11FF00: sendi2cIRQ(i2cByte[6]); break; //Blau
case 0xEA15FF00: sendi2cIRQ(i2cByte[7]); break; //Weiß
case 0xE817FF00: sendi2cIRQ(i2cByte[8]); break; //Orange
case 0xED12FF00: sendi2cIRQ(i2cByte[9]); break; //Hellgrün
case 0xE916FF00: sendi2cIRQ(i2cByte[10]); break; //Lila
case 0xB24DFF00: sendi2cIRQ(i2cByte[11]); break; //Flash
case 0xBF40FF00: sendi2cIRQ(i2cByte[12]); break; //Braun
case 0xB34CFF00: sendi2cIRQ(i2cByte[13]); break; //Grün-Blau
case 0xFB04FF00: sendi2cIRQ(i2cByte[14]); break; //Brombeere
case 0xFF00FF00: sendi2cIRQ(i2cByte[15]); break; //Strobe
case 0xF50AFF00: sendi2cIRQ(i2cByte[16]); break; //Beige
case 0xE11EFF00: sendi2cIRQ(i2cByte[17]); break; //Hellblau-Türkis
case 0xF10EFF00: sendi2cIRQ(i2cByte[18]); break; //Pink-Rot
case 0xE51AFF00: sendi2cIRQ(i2cByte[19]); break; //Fade
case 0xE31CFF00: sendi2cIRQ(i2cByte[20]); break; //Gelb
case 0xEB14FF00: sendi2cIRQ(i2cByte[21]); break; //Türkis
case 0xF00FFF00: sendi2cIRQ(i2cByte[22]); break; //Pink
case 0xF30CFF00: sendi2cIRQ(i2cByte[23]); break; //Smooth
}
IrReceiver.resume();
}
}
//______________________________________________________________________________________________________________________________________________
void sendi2cIRQ(byte x){
sendByte = x; // Taste in sendByte schreiben
digitalWrite(IRQ_PIN, LOW); // Interrupt Pin auf LOW (auslösen der Interrupt-Routine am Master Arduino)
delay(10);
digitalWrite(IRQ_PIN, HIGH);
}
//______________________________________________________________________________________________________________________________________________
void IRCodeTransmit(){
Wire.write(sendByte);
}
Master:
//Libraries einbinden
#include <Arduino.h>
#include <IRremote.h>
#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#define SLAVE_ADDR 8 // Adresse des Slave
//Ein- / Ausgänge Arduino
const byte IR_READY = 3; // Interrupt - Slave 8 hat neue Daten von Fernbedienung empfangen und ist bereit zum Senden
const byte PIXEL_DATA_OUT = 6; // Ausgang DATA NeoPixel
//Parameter
int PIXEL_COUNT = 16; //Anzahl LEDs
int BRIGHTNESS = 0; //Helligkeitswert LDR
volatile byte IR_BYTE_RCVD = 0;
//Definition Objetkte
Adafruit_NeoPixel Matteo = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_DATA_OUT, NEO_GRB + NEO_KHZ800);
//Interrupt_____________________________________________________________________________________________________________________________
void IR_REM_NEW_INPUT() {
Wire.requestFrom(8, 1);
while (Wire.available()) { // slave may send less than requested
IR_BYTE_RCVD = Wire.read();
}
}
//Effekte________________________________________________________________________________________________________________________________
//setAll_______________________________________________________________________
void setAll(int R,int G,int B){
for(int i=0; i<PIXEL_COUNT; i++){
Matteo.setPixelColor(i, Matteo.Color(R, G, B));
Matteo.show();
}
}
//Rainbow______________________________________________________________________
void rainbow(int wait) {
for(long firstPixelHue = 0; firstPixelHue < 1*65536; firstPixelHue += 500) {
for(int i=0; i<Matteo.numPixels(); i++) {
int pixelHue = firstPixelHue + (i * 65536L / Matteo.numPixels());
Matteo.setPixelColor(i, Matteo.gamma32(Matteo.ColorHSV(pixelHue)));
}
Matteo.show();
delay(wait);
}
}
//_______________________________________________________________________________________________________________________________________
void setup() {
Serial.begin(9600); //Serielle Ausgabe starten
Serial.println("Bereit");
Wire.begin();
Matteo.begin(); //LED-Streifen initialisieren
pinMode(IR_READY, INPUT);
attachInterrupt(digitalPinToInterrupt(IR_READY), IR_REM_NEW_INPUT, FALLING); //Einbinden des Interrupts (Änderungen FB)
}
//_______________________________________________________________________________________________________________________________________
void loop() {
Serial.println(IR_BYTE_RCVD);
switch (IR_BYTE_RCVD) {
case 101: ; break; //Heller
case 102: ; break; //Dunkler
case 103: setAll(0,0,0); break; //OFF
case 104: ; break; //ON
case 105: setAll(255,0,0); break; //Rot
case 106: setAll(0,255,0); break; //Grün
case 107: setAll(0,0,255); break; //Blau
case 108: setAll(255,255,255); break; //Weiß
case 109: setAll(255,127,0); break; //Orange
case 110: setAll(150,255,70); break; //Hellgrün
case 111: setAll(123,104,238); break; //Lila
case 112: rainbow(100); break; //Flash
case 113: setAll(205,102,29); break; //Braun
case 114: setAll(34,139,34); break; //Grün-Blau
case 115: setAll(139,34,82); break; //Brombeere
case 116: ; break; //Strobe
case 117: setAll(255,185,15); break; //Beige
case 118: setAll(135,206,250); break; //Hellblau-Türkis
case 119: setAll(205,50,120); break; //Pink-Rot
case 120: ; break; //Fade
case 121: setAll(255,255,0); break; //Gelb
case 122: setAll(0,245,255); break; //Türkis
case 123: setAll(255,20,147); break; //Pink
case 124: ; break; //Smooth
default: break;
}
}