Hallo,
ich habe mir in den letzten Tagen einen RGB LED controler zusammengebastelt, welchen man über IR ansteuern kann, und der auch wunderbar funktioniert.
Nun habe ich den Arduino auf eine Lochrasterplatine verpflanzt (natürlich mit quartz und allem) und anscheinend funktoiniert auch alles. Ich kann rot, grün, blau und weiss anwählen. Die Strobe funktion funktioniert, und ich kann auch die Zeit zwischen den einzelnen "strobes" verändern.
Nur wenn ich den Fader oder die "Mix" funktion nutzen möchte, resettet der Arduino sich selbst.
Ich habe absolut keinerleit erklärung dafür, da schliesslich exakt die gleichen Pins benutzt werden.
Anbei ist der Code, sollte er irgendetwas bringen.
Jegliche vermutungen wären sehr hilfreich ![]()
vielen dank schonmal
max
/*
* IRtraffic - control a walk / don't walk sign.
*
* An IR detector/demodulator must be connected to the input 11.
* Relays must be connected to outputs 3 and 4.
*
* This uses the IRremote library: http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
* Copyright 2010 Ken Shirriff
* http://arcfn.com
*/
// Program variables
int redVal = 255; // Variables to store the values to send to the pins
int greenVal = 0; // Initial values are all off
int blueVal = 0;
#include <IRremote.h>
#define RECV_PIN 11
#if 0
#define OFF_CODE 0xFFF807 // Stop on Sony DVD remote
#define ON_CODE 0xFFB04F // 1 on Sony DVD remote
#define RED_CODE 0xFF9867
#define GREEN_CODE 0xFFD827
#define BLUE_CODE 0xFF8877// 1 on Sony DVD remote
#define WHITE_CODE 0xFFA857
#define STROBE_CODE 0xFF00FF
#define FADE_CODE 0xFF58A7
#define UP_CODE 0xFF906F
#define DOWN_CODE 0xFFB847
#define MIX_CODE 0xFF30CF
#define REDUP_CODE 0xFF50AF
#define REDDOWN_CODE 0xFF38C7
#define GREENUP_CODE 0xFF7887
#define GREENDOWN_CODE 0xFF28D7
#define BLUENUP_CODE 0xFF708F
#define BLUEDOWN_CODE 0xFFF00F
#else
#define OFF_CODE 0xFFF807
#define ON_CODE 0xFFB04F
#define RED_CODE 0xFF9867
#define GREEN_CODE 0xFFD827
#define BLUE_CODE 0xFF8877
#define WHITE_CODE 0xFFA857
#define STROBE_CODE 0xFF00FF
#define FADE_CODE 0xFF58A7
#define UP_CODE 0xFF906F
#define DOWN_CODE 0xFFB847
#define MIX_CODE 0xFF30CF
#define REDUP_CODE 0xFF50AF
#define REDDOWN_CODE 0xFF38C7
#define GREENUP_CODE 0xFF7887
#define GREENDOWN_CODE 0xFF28D7
#define BLUENUP_CODE 0xFF708F
#define BLUEDOWN_CODE 0xFFF00F
#endif
#include "WProgram.h"
int modus=0;
int moduson=0;
long previousStrobe = 0;
long strobeinterval = 20;
long previousFade = 0;
long fadeinterval = 50;
int ledState = LOW;
int redmix =170;
int bluemix=170;
int greenmix=170;
IRrecv irrecv(RECV_PIN);
decode_results results;
int phase =1;
void setup()
{
pinMode(6, OUTPUT); //red
pinMode(9, OUTPUT); //green
pinMode(10, OUTPUT); //blue
irrecv.enableIRIn(); // Start the receiver
}
void loop() {
// Process the IR input, if any
if (irrecv.decode(&results)) {
if (results.value == OFF_CODE) {
moduson=0;
}
else if (results.value == ON_CODE) {
moduson=1;
}
else if (results.value == RED_CODE) {
modus=0;
}
else if (results.value == GREEN_CODE) {
modus=1;
}
else if (results.value == BLUE_CODE) {
modus=2;
}
else if (results.value == WHITE_CODE) {
modus=3;
}
else if (results.value == STROBE_CODE) {
modus=4;
}
else if (results.value == FADE_CODE) {
modus=5;
}
else if (results.value == MIX_CODE) {
modus=6;
}
else if (results.value == UP_CODE) {
if(modus==4)
{
strobeinterval=strobeinterval+5;
}
if(modus==5)
{
fadeinterval=fadeinterval+5;
}
}
else if (results.value == DOWN_CODE) {
if(modus==4)
{
strobeinterval=strobeinterval-5;
}
if(modus==5)
{
if(fadeinterval>5)
{
fadeinterval=fadeinterval-5;
}
}
}
else if (results.value == REDUP_CODE) {
if(redmix+15<=255)
{
redmix=redmix+15;
}
else
{
redmix=255;
}
}
else if (results.value == REDDOWN_CODE) {
if(redmix-15>=0)
{
redmix=redmix-15;
}
else
{
redmix=0;
}
}
else if (results.value == GREENUP_CODE) {
if(greenmix+15<=255)
{
greenmix=greenmix+15;
}
else
{
greenmix=255;
}
}
else if (results.value == GREENDOWN_CODE) {
if(greenmix-15>=0)
{
greenmix=greenmix-15;
}
else
{
greenmix=0;
}
}
else if (results.value == BLUENUP_CODE) {
if(bluemix+15<=255)
{
bluemix=bluemix+15;
}
else
{
bluemix=255;
}
}
else if (results.value == BLUEDOWN_CODE) {
if(bluemix-15>=0)
{
bluemix=bluemix-15;
}
else
{
bluemix=0;
}
}
else {
}
irrecv.resume(); // Resume decoding (necessary!)
}
if(moduson==0)
{
digitalWrite(6, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
}
if(modus==0 && moduson==1)
{
digitalWrite(6, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
}
if(modus==1 && moduson==1)
{
digitalWrite(6, LOW);
digitalWrite(9, HIGH);
digitalWrite(10, LOW);
}
if(modus==2 && moduson==1)
{
digitalWrite(6, LOW);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
}
if(modus==3 && moduson==1)
{
digitalWrite(6, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
}
if(modus==4 && moduson==1)
{
if(millis() - previousStrobe > strobeinterval) {
if (ledState == LOW)
{
digitalWrite(6, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
ledState = HIGH;
}
else{
digitalWrite(6, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
ledState = LOW; }
previousStrobe=millis();
}
}
if(modus==5 && moduson==1)
{
if(millis() - previousFade > fadeinterval) {
if(phase==1)
{
redVal=redVal-1;
greenVal=greenVal+1;
if(redVal==0)
{
phase=2;
}
}
if(phase==2)
{
greenVal=greenVal-1;
blueVal=blueVal+1;
if(greenVal==0)
{
phase=3;
}
}
if(phase==3)
{
blueVal=blueVal-1;
redVal=redVal+1;
if(blueVal==0)
{
phase=1;
}
}
// we do "255-redVal" instead of just "redVal" because the
// LEDs are hooked up to +5V instead of Gnd
analogWrite(6,redVal); // Write current values to LED pins
analogWrite(9,greenVal);
analogWrite(10,blueVal);
previousFade=millis();
}
}
if(modus==6 && moduson==1)
{
analogWrite(6, redmix);
analogWrite(10, bluemix);
analogWrite(9, greenmix);
}
}
hierbei wird im ersten teil das Signal empfangen und ausgewertet, und dementsprechent modus auf den gewünschten wert gesetzt und im 2. Teil wird je nach Modus die RGB angesteuert.