Arduino kod, värre än nybörjare...!

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
tänt_var_det_här
Inlägg: 23
Blev medlem: 5 januari 2015, 22:32:13

Arduino kod, värre än nybörjare...!

Inlägg av tänt_var_det_här »

Tjena!
Har en Arduino mega 2560 med breadboard, 2 RGB common anode lysdioder och 3 st 100 ohm inkopplade.

Hittade denna kod på internet, hade en annan förut med samma funktion utom att hela koden såg totalt annorlunda ut.

Problemet med första koden, och denna är att bara en av de två lysdioderna lyser. Första koden så "fade:ade" den ena medans den andra lös blått med kort delay.

Nu är den ena helt släckt.

Skulle vilja veta hur man lägger till flera portar (utgångar) i/under samma #define.

Så här ser koden ut:

#define GRN_PIN 5
#define GRN_PIN 8
#define RED_PIN 6
#define RED_PIN 9
#define BLU_PIN 7
#define BLU_PIN 10

byte RED, GREEN, BLUE;
byte RED_A = 0;
byte GREEN_A = 0;
byte BLUE_A = 0;
int led_delay = 0;
byte colour_count = 1; //Count the colours out
#define colour_count_max 7 //Set this to the max number of colours defined
#define colour_delay 4000 //Define the delay between changing colours in ms
#define time_at_colour 1000 //Time to stay on a colour in ms

//Some Time values
unsigned long TIME_LED = 0;
unsigned long TIME_COLOUR = 0;

//Define Colours here.
//Blue
#define C1_R 0
#define C1_G 0
#define C1_B 255
//Red
#define C2_R 255
#define C2_G 0
#define C2_B 0
//White
#define C3_R 255
#define C3_G 255
#define C3_B 255
//Orange
#define C4_R 255
#define C4_G 186
#define C4_B 0
//Light Blue
#define C5_R 0
#define C5_G 168
#define C5_B 255
//Purple
#define C6_R 255
#define C6_G 0
#define C6_B 255
//Yellow
#define C7_R 255
#define C7_G 250
#define C7_B 0

void setup()
{

//Assign initial values
RED = C1_R;
GREEN = C1_G;
BLUE = C1_B;
//Get the led_delay speed
led_delay = (colour_delay - time_at_colour) / 255;

analogWrite(GRN_PIN, 0);
analogWrite(RED_PIN, 0);
analogWrite(BLU_PIN, 0);

}

void loop()
{

//Rest of your program - Avoid using delay(); function!

if(millis() - TIME_LED >= led_delay){
TIME_LED = millis();

//Run the LED Function to check and adjust the values
LED();
}

if(millis() - TIME_COLOUR >= colour_delay){
TIME_COLOUR = millis();

//Run the Colour Change function
COLOUR();
}

}

void LED()
{

//Check Values and adjust "Active" Value
if(RED != RED_A){
if(RED_A > RED) RED_A = RED_A - 1;
if(RED_A < RED) RED_A++;
}
if(GREEN != GREEN_A){
if(GREEN_A > GREEN) GREEN_A = GREEN_A - 1;
if(GREEN_A < GREEN) GREEN_A++;
}
if(BLUE != BLUE_A){
if(BLUE_A > BLUE) BLUE_A = BLUE_A - 1;
if(BLUE_A < BLUE) BLUE_A++;
}

//Assign modified values to the pwm outputs for each colour led
analogWrite(RED_PIN, RED_A);
analogWrite(GRN_PIN, GREEN_A);
analogWrite(BLU_PIN, BLUE_A);

}

void COLOUR()
{

//Increment the colour by one or go back to 1 if maxed out
if(colour_count < colour_count_max) colour_count++;
else colour_count = 1;

if(colour_count == 1){
RED = C1_R;
GREEN = C1_G;
BLUE = C1_B;
} else if(colour_count == 2){
RED = C2_R;
GREEN = C2_G;
BLUE = C2_B;
} else if(colour_count == 3){
RED = C3_R;
GREEN = C3_G;
BLUE = C3_B;
} else if(colour_count == 4){
RED = C4_R;
GREEN = C4_G;
BLUE = C4_B;
} else if(colour_count == 5){
RED = C5_R;
GREEN = C5_G;
BLUE = C5_B;
} else if(colour_count == 6){
RED = C6_R;
GREEN = C6_G;
BLUE = C6_B;
} else if(colour_count == 7){
RED = C7_R;
GREEN = C7_G;
BLUE = C7_B;
}
}



Ändrade port nummer högst upp och lade dessutom till en av varje extra med en ny siffra. Det funkar inte. Har testat , +- && lite allt möjligt.
Hittade denna sida med de flesta variablerna http://arduino.cc/en/Reference/HomePage
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Arduino kod, värre än nybörjare...!

Inlägg av sodjan »

Använd alltid code-taggarna till kod!
Då blir det betydligt lättare att läsa...
Användarvisningsbild
Nisse
Inlägg: 908
Blev medlem: 9 juli 2006, 23:25:46
Ort: Kumla

Re: Arduino kod, värre än nybörjare...!

Inlägg av Nisse »

-> Skulle vilja veta hur man lägger till flera portar (utgångar) i/under samma #define.
-> Ändrade port nummer högst upp och lade dessutom till en av varje extra med en ny siffra.

Kan du förklara lite mer vad det är du vill uppnå? Kanske visa hur du skrev när det inte fungerade?

Hur har du lysdioderna kopplade med dina 100 ohm? Har du räknat på vilka strömmar det blir och om din Arduino klarar av att leverera det?

Mvh
Nisse
tänt_var_det_här
Inlägg: 23
Blev medlem: 5 januari 2015, 22:32:13

Re: Arduino kod, värre än nybörjare...!

Inlägg av tänt_var_det_här »

Tackar för kodtaggarna, visste ej att de fanns!
Så här såg koden ut från början fast det var typ 5 6 9 istället. Ändrade till mina utgångar, vilket är 5 6 7.

Kod: Markera allt

#define GRN_PIN 5
#define RED_PIN 6
#define BLU_PIN 7


byte RED, GREEN, BLUE; 
byte RED_A = 0;
byte GREEN_A = 0; 
byte BLUE_A = 0;
int led_delay = 0;
byte colour_count = 1; //Count the colours out
#define colour_count_max 7 //Set this to the max number of colours defined
#define colour_delay 4000 //Define the delay between changing colours in ms
#define time_at_colour 1000 //Time to stay on a colour in ms

//Some Time values
unsigned long TIME_LED = 0;
unsigned long TIME_COLOUR = 0;

//Define Colours here.
//Blue
#define C1_R 0
#define C1_G 0
#define C1_B 255
//Red
#define C2_R 255
#define C2_G 0
#define C2_B 0
//White
#define C3_R 255
#define C3_G 255
#define C3_B 255
//Orange
#define C4_R 255
#define C4_G 186
#define C4_B 0
//Light Blue
#define C5_R 0
#define C5_G 168
#define C5_B 255
//Purple
#define C6_R 255
#define C6_G 0
#define C6_B 255
//Yellow
#define C7_R 255
#define C7_G 250
#define C7_B 0

void setup()
{

//Assign initial values
RED = C1_R;
GREEN = C1_G;
BLUE = C1_B;
//Get the led_delay speed
led_delay = (colour_delay - time_at_colour) / 255; 

analogWrite(GRN_PIN, 0);
analogWrite(RED_PIN, 0);
analogWrite(BLU_PIN, 0);

}

void loop()
{

//Rest of your program - Avoid using delay(); function!

if(millis() - TIME_LED >= led_delay){
TIME_LED = millis();

//Run the LED Function to check and adjust the values
LED();
}

if(millis() - TIME_COLOUR >= colour_delay){
TIME_COLOUR = millis();

//Run the Colour Change function
COLOUR();
}

}

void LED()
{

//Check Values and adjust "Active" Value
if(RED != RED_A){
if(RED_A > RED) RED_A = RED_A - 1;
if(RED_A < RED) RED_A++;
}
if(GREEN != GREEN_A){
if(GREEN_A > GREEN) GREEN_A = GREEN_A - 1;
if(GREEN_A < GREEN) GREEN_A++;
}
if(BLUE != BLUE_A){
if(BLUE_A > BLUE) BLUE_A = BLUE_A - 1;
if(BLUE_A < BLUE) BLUE_A++;
}

//Assign modified values to the pwm outputs for each colour led
analogWrite(RED_PIN, RED_A);
analogWrite(GRN_PIN, GREEN_A);
analogWrite(BLU_PIN, BLUE_A);

}

void COLOUR()
{

//Increment the colour by one or go back to 1 if maxed out
if(colour_count < colour_count_max) colour_count++;
else colour_count = 1;

if(colour_count == 1){
RED = C1_R;
GREEN = C1_G;
BLUE = C1_B;
} else if(colour_count == 2){
RED = C2_R;
GREEN = C2_G;
BLUE = C2_B;
} else if(colour_count == 3){
RED = C3_R;
GREEN = C3_G;
BLUE = C3_B;
} else if(colour_count == 4){
RED = C4_R;
GREEN = C4_G;
BLUE = C4_B;
} else if(colour_count == 5){
RED = C5_R;
GREEN = C5_G;
BLUE = C5_B;
} else if(colour_count == 6){
RED = C6_R;
GREEN = C6_G;
BLUE = C6_B;
} else if(colour_count == 7){
RED = C7_R;
GREEN = C7_G;
BLUE = C7_B;
}
}

Det jag menar under samma #define är att istället för att skriva

Kod: Markera allt

#define GRN_PIN 5
#definre GRN_PIN 6

Etc, så man skrivet

Kod: Markera allt

#define GRN_PIN 5, 6
Samma funktion fast att man skickar ut den över fler utgångar samtidigt.

Har säkert simmat ut på alldeles för djupt vatten, kan knappt någonting om programmering, ej hittat någon bra tutorial för grunderna heller. Dock ser Arduino 10 ggr lättare ut än C++ som jag ibland kollar lite på :)


Använder för tillfället Arduinon genom usbporten. Mina RGB lysdioder är kopplade med anode pin till 5V på arduinon, R G B är kopplade över varsin 100 ohm resistor till respektive utgång. Räknat 5V - 3V = 2V. 2V / 0.020 mah = 100 ohm.
Användarvisningsbild
Icecap
Inlägg: 26151
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Arduino kod, värre än nybörjare...!

Inlägg av Icecap »

Röd och grön LED har en Vf på ~2V.

0,02mAh är en mycket låg ström i en timme, vad det har med saken att göra kan jag inte klura ut.

5V - 2V = 3V
3V @ 20mA = 150 Ohm.

Och din omdefiniering fungerar helt enkelt inte! En #define gör en textmässig ombyte innan själva kompileringen sker. Alltså måste du definiera alla utgångarna med unika namn och ändra programmet så att det skriver till dom alla.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Arduino kod, värre än nybörjare...!

Inlägg av sodjan »

> Så här såg koden ut från början...

Jag har ingen idé om själva problemet, men bara en sak
som kan underlätta, speciellt för den som ska läsa koden.
http://sv.wikipedia.org/wiki/Indentering
Jämför detta med din kod utan indentering:

Kod: Markera allt

//Check Values and adjust "Active" Value
if(RED != RED_A){
    if(RED_A > RED) RED_A = RED_A - 1;
    if(RED_A < RED) RED_A++;
}
if(GREEN != GREEN_A){
    if(GREEN_A > GREEN) GREEN_A = GREEN_A - 1;
    if(GREEN_A < GREEN) GREEN_A++;
}
if(BLUE != BLUE_A){
    if(BLUE_A > BLUE) BLUE_A = BLUE_A - 1;
    if(BLUE_A < BLUE) BLUE_A++;
}
Sen så är det väl samma sak som:

Kod: Markera allt

//Check Values and adjust "Active" Value
if(RED != RED_A){
    if(RED_A > RED) RED_A--;
    if(RED_A < RED) RED_A++;
}
if(GREEN != GREEN_A){
    if(GREEN_A > GREEN) GREEN_A--;
    if(GREEN_A < GREEN) GREEN_A++;
}
if(BLUE != BLUE_A){
    if(BLUE_A > BLUE) BLUE_A--;
    if(BLUE_A < BLUE) BLUE_A++;
}
tänt_var_det_här
Inlägg: 23
Blev medlem: 5 januari 2015, 22:32:13

Re: Arduino kod, värre än nybörjare...!

Inlägg av tänt_var_det_här »

Ja mA ska det såklart va! Fel av mig, ursäkta.

Enligt tabellen jag fått av tillverkan så ligger röd på 2V, grön och blå 3 V. Så ja, jag bör ha en aning högre ohm för röd, får se till att fixa det.

Tror också jag förstår vad du menar med att deklarera var för sig. Finns det något att annat sätt man kan deklarera utgångarna på?
Användarvisningsbild
Nisse
Inlägg: 908
Blev medlem: 9 juli 2006, 23:25:46
Ort: Kumla

Re: Arduino kod, värre än nybörjare...!

Inlägg av Nisse »

#define GRN_PIN 5, 6

Detta fungerar inte, det har du ju märkt själv. :-)

#define GRN_PIN 5
#define GRN_PIN 6

Fungerar inte som du önskar eftersom du först talar om att GRN_PIN ska betyda 5 bara för att i nästa rad tala om att GRN_PIN inte alls ska betyda 5 utan 6 istället :-)
http://arduino.cc/en/Reference/Define

Tyvärr kan inte kommandot AnalogWrite manipulera flera utgångar på samma gång.
http://arduino.cc/en/Reference/analogWrite


Hur många lysdioder tänker du driva med 20mA styck? Varje RGB-diod är ju tre dioder i en vilket ger 60 mA vid vitt ljus på full effekt. Hur mycket ström klarar din Arduino att leverera totalt?
Skriv svar