Hallo geschätzte Freeduinocommunity!
Der folgende Post bezieht sich auf ein umfangreicheres Projekt welches momentan sehr arduinolastig ist. Da ich mich aber hauptsächlich nicht mit Microcontrollern und Programmieren beschäftige, bin ich sehr auf eure Hilfe angewiesen! Ich versuche alles so weit es geht mir selbst zu erarbeiten aber leider hapert es bei mir hin und wieder bereits bei vermeintlich einfachen Dingen.
Kurzfassung meines Vorhabens (jedoch finde ich den passenden Code nirgends):
http://www.youtube.com/watch?v=zcu0UQvQPA8
Ich benutze ein Arduino Duemilanove, an dem ein Infrarotsensor angeschlossen ist. Über den entsprechenden Code (IRMP) empfängt dieser die Signale der zugehörigen Fernbedienung und gibt sie mir im Serialmonitor in Form von Zahlenwerten aus.
Über eine if-Funktion erreiche ich das Einschalten einer LED, sobald ich eine bestimmte Taste meiner FB drücke (in diesem Falle "Volume up") Mit "Volume down" schalte ich sie wieder aus. Nun möchte ich zusätzlich gerne eine kurze Melodie beim Drücken der "Volume up" Taste ausgegeben haben. Ein Lautsprecher habe ich bereits angeschlossen, welcher auch einen Ton ausgibt, mit dem nun bestehenden Problem:
der Ton hält nicht etwa nur für den Delay an, sondern wird durch void loop scheinbar ununterbrochen und endlos weitergegeben.
(Drücke ich auf meiner FB nun "Volume down" erlischt die LED und es ertönt ein anderer zugewiesener Ton, der ebenfalls nicht enden möchte)
Mit welcher Methode kann man ein einmaliges Abspielen eines bestimmten Tons / einer bestimmten Melodie erreichen sobald eine bestimmte Taste der FB gedrückt wird?
vor 1 year 11 weeks
Ok, teilweise konnte ich das Problem nun bereits mit einer boolean-Funktion lösen. Der Ton ertönt nur kurz und endet dann auch wieder.
Das neue Problem ist nun jedoch, dass ich nicht mehrfach die gleiche Taste drücken kann um damit weitere Male den Sound abzuspielen (ich muss jedesmal erst die "Volume down"-Taste drücken um erneut den Effekt der "Volume up"-Taste zu erhalten).
Der Code:
/* This is a simple example for using the IRMP library
* original home of IRMP is: http://www.mikrocontroller.net/articles/IRMP
* arduino port of IRMP home: https://gitorious.org/arduino-addons/irmp-arduino
*
* (C) 2012 Stefan Seyfried
*
* This program is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details.
*/
/* use TimerOne http://arduino.cc/playground/Code/Timer1 for interrupts */
#include
/* first include Arduino.h, the IDE includes it after irmp*.h ... */
#include "Arduino.h"
/* ... and then chokes on uintX_t ... */
extern "C" {
#include
#include
}
/* undefine this if you don't want blinking LED for diagnosis */
#define LED_PIN 13
#define SER_BAUD 115200
/* F_INTERRUPTS is the interrupt frequency defined in irmpconfig.h */
#define US (1000000 / F_INTERRUPTS)
const int speakerPin = 4;
const int ledPin = 6;
boolean signal1 = false;
boolean signal2 = false;
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(speakerPin, OUTPUT);
Serial.begin(SER_BAUD);
/* greeting string and debugging ouput */
Serial.println("IRMP test sketch");
Serial.print("US: ");
Serial.println(US);
/* configure the input pin. IRMP_BIT is defined in irmpconfig.h,
default is digital pin 2 */
pinMode(IRMP_BIT, INPUT);
#ifdef LED_PIN
pinMode(LED_PIN, OUTPUT);
#endif
led(HIGH);
delay(20); /* make sure the greeting string is out before starting */
led(LOW);
Timer1.initialize(US);
Timer1.attachInterrupt(timerinterrupt);
}
IRMP_DATA irmp_data;
void loop()
{
if (irmp_get_data (&irmp_data))
{
led(HIGH);
Serial.print(irmp_data.protocol);
Serial.print(" A:");
Serial.print(irmp_data.address, HEX);
Serial.print(" C:");
Serial.print(irmp_data.command);
Serial.print(" ");
Serial.print(irmp_data.flags, HEX);
Serial.println("");
/* Serial.print is asynchronous, so the LED is only flashing very lightly */
led(LOW);
}
if((irmp_data.command == 57120)&&(signal1 == false))
{
digitalWrite(ledPin, HIGH);
tone(4, 400, 100);
delay(2000);
signal1 = !signal1;
signal2 = false;
}
if((irmp_data.command == 40800)&&(signal1 == true))
{
digitalWrite(ledPin, LOW);
tone(4, 300,300);
delay(2000);
signal1 = false;
signal2 = true;
}
}
/* helper function: attachInterrupt wants void(), but irmp_ISR is uint8_t() */
void timerinterrupt()
{
irmp_ISR();
}
static inline void led(int state)
{
#ifdef LED_PIN
digitalWrite(LED_PIN, state);
#endif
}
Login or register to post comments