Автор Тема: arduino малко обяснение че не ми е ясно как?  (Прочетена 5558 пъти)

ka4a4e

  • Бил знаел какво е Мехатроника!
  • *****
  • Публикации: 114
    • Профил
    • http://google.bg
arduino малко обяснение че не ми е ясно как?
« -: Декември 15, 2011, 05:11:14 pm »
Здравейте имам един RGB светодиод който го управлявам със следната програма.

int r = 9;
int g = 10;
int b = 11;
int X = 0;

void up(int a){
  for(int i=0;i<=200;i++){
    analogWrite(a,i);
    delay(100);
  }
}

void down(int a){
  for(int i=200;i>=0;i--){
    analogWrite(a,i);
    delay(100);
  }
}
   

void setup(){}
void loop()
{
  up(g);
  if(X>0){
    down(r);
  }
  up(b);
  down(g);
  up(r);
  down(b);
  if(X==0){
    X++;
  }
}


Та как да направя така че като натисна бутона веднага да започне да изпълнява друг алгоритъм за управление на диода. До сега като правя експерименти докато не стигни края на алгоритъма не прави нищо чак когато кода стигне до бутона.
Деян Георгиев на 20г. от град Любимец област Хасковска студент в ТУ Габрово спец. Е курс ІI

westony

  • Заклет Роботостроител
  • *****
  • Публикации: 237
    • Профил
    • http://westony.blogspot.com
arduino малко обяснение че не ми е ясно как?
« Отговор #1 -: Декември 15, 2011, 06:37:37 pm »
Слагаш бутон, натискаш го, прави се проверка да ли е натиснат бутона, ако е натиснат изпъхлнява дадена функция...
Ако искаш да става по-бързо трябва да използваш таймери...
Технически Университет - София , ФА, III курс.
Мартин, 21 години
   Ако е лесно няма да е интересно!

Един не по-различен блог
Google+

ka4a4e

  • Бил знаел какво е Мехатроника!
  • *****
  • Публикации: 114
    • Профил
    • http://google.bg
arduino малко обяснение че не ми е ясно как?
« Отговор #2 -: Декември 17, 2011, 11:21:12 pm »
Добре а как да направя така че примерно една програма си върви и натисна бутона и започни 2 програми паралелно да вървят.
Примерно имам един температурен сензор, 2Х7 сегментен дисплей, и RGB светодиод за да показва горе/долу цвят на градуса. И като се натисни бутона пак да си показва каква е температурата ама и да започне този ефект от горната програма вместо досегашното "цвят на градуса".
Опитах с тази програма ама като натисна бутона свети без да се смени цвета(стой на масив[0]) и промяна стоиностите на градусите.

#define A A5
#define B 3
#define C 4
#define D 5
#define E 6
#define F 7
#define G 8

// Pins driving common anodes
#define CA1 13
#define CA2 12

// Pins for A B C D E F G, in sequence
const int segs[7] = { A, B, C, D, E, F, G };

// Segments that make each number
const byte numbers[10] = {
  0b1000000,//0
  0b1111001,//1
  0b0100100,//2
  0b0110000,//3
  0b0011001,//4
  0b0010010,//5
  0b0000010,//6
  0b1111000,//7
  0b0000000,//8
  0b0010000 //9
};

//stoinostite na cvetovete
byte r[20]={  0,  0,  0,  0,  0,  0,  0,  0,  0, 64,128,198,255,255,255,255,255,255,255,255};
byte g[20]={  0, 50,100,150,200,200,200,200,200,200,200,200,200,150,100, 50,  2,  0,  0,  0};
byte b[20]={200,200,200,200,200,150,100, 50,  0,  0,  0,  0,  0,  0,  0,  0,  2, 50,100,150};

//efekta
byte effect(byte time){
  for(byte i=0;i<20;i++){
    return i;
    delay(time);
  }
}

//za miganeto na displeite
void lightDigit1(byte number){
  digitalWrite(CA1, LOW);
  digitalWrite(CA2, HIGH);
  lightSegments(number);
}

//za miganeto na displeite
void lightDigit2(byte number){
  digitalWrite(CA1, HIGH);
  digitalWrite(CA2, LOW);
  lightSegments(number);
}

//izkarva nujnoto 4islo
void lightSegments(byte number){
  for (int i = 0; i < 7; i++) {
    int bit = bitRead(number, i);
    digitalWrite(segs[i], bit);
  }
}

//nai vajnata 4ast na displeq
void seg(byte a, byte b){
  unsigned long startTime = millis();
  for (unsigned long elapsed=0; elapsed < 600; elapsed = millis() - startTime){
    lightDigit1(numbers[a]);
    delay(5);
    lightDigit2(numbers[b]);
    delay(5);
  }
}

void setup()
{
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(CA1, OUTPUT);
  pinMode(CA2, OUTPUT);
}

//main
void loop()
{
  unsigned int val = analogRead(0);   //temperaturniq sensor
  byte temp = (5*val*100/1024);       //preobrazuvaneto na temperatura
  byte i;
  if(analogRead(1)==0)         //proverkata na butona
  {
    i =(temp/2)-1;
  }else{
    i = effect(100);
  }
  analogWrite(9,r[i]);
  analogWrite(10,g[i]);
  analogWrite(11,b[i]);  
  byte digit1, digit2;      //tezi sa za da izkara ot dvycifreno 4islo 2 cifri
  digit1 = temp % 10;
  digit2 = temp - digit2;
  digit2 = digit2 / 10;
  seg(digit1,digit2);
}


Да отбележа от този код някои работи съм ги взел от интернет и някои леко са променени за да работи
Деян Георгиев на 20г. от град Любимец област Хасковска студент в ТУ Габрово спец. Е курс ІI

westony

  • Заклет Роботостроител
  • *****
  • Публикации: 237
    • Профил
    • http://westony.blogspot.com
arduino малко обяснение че не ми е ясно как?
« Отговор #3 -: Декември 18, 2011, 11:48:24 am »
Не могат две програми паралелно да вървят ... Това са таймери/прекъсвания, когато бутона е натиснат програмата вдига флаг, изпълнява се ISR функцията, тя сваля флага и програмата продължава.

Тук можеш да погледнеш...
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=50106

или направо да си свалиш документацията на процесора и от там да прочетеш.
Технически Университет - София , ФА, III курс.
Мартин, 21 години
   Ако е лесно няма да е интересно!

Един не по-различен блог
Google+