• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Problem z kodem - biblioteka Timers
#1
Witam serdecznie mam problem z kodem a raczej z poprawnym jego napisaniem i działaniem.

Chciałbym potencjometrem regulować jasność świecenia się diod. 

Poniżej kod i filmik z obecnego działania.
Docelowa chce zrobić kilka rodzajów ruchów Pan/Tilt oraz kolorów i jasność świecenia.

Kod:
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define analogPin  1         
#define PIN      6
#define NUMPIXELS 8
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

#include <Timers.h>
#include <Servo.h>

Servo servoU;
Servo servoT;


Timers <8> akcja;
int val = analogRead(A1);
int brightness;
float i;
double x;
double y;


void setup()
{
  pinMode(analogPin, INPUT);
  Serial.begin(9600);

  pixels.begin();

  servoU.attach(10);
  servoT.attach(9);

  akcja.attach(0, 250, zadanie1); // Wątek 1: wcześniej zdefiniowana funkcja o nazwie zadanie1, wywoływana co ok  1 sek.
  akcja.attach(1, 30, zadanie2);    // anlogicznie dla zadanie2 , ale tutaj na razie nie robimy nic, bo interwał =0;.
  akcja.attach(2, 50, zadanie3); // zadanie3 wykonuje się co 50 ms. (np. pomiar temperatury)
  //akcja.attach(3, 200, zadanie4);  // co 200 ms sprawdzamy np stan przycisku
  //akcja.attach(4, 189, zadanie5);  // a co 189 ms sprawdzamy stan czujnika odległości
  // akcja.attach(5, 1211, zadanie6);  // a co 1211 ms wysyłamy jakis komunikat na Seriala

}



void zadanie1() {
  for (i = 0; i < 360; i += 0.02) {
    x = 60 * sin(i) + 80;
    y = 60 * cos(i) + 120;
    servoU.write(x);
    servoT.write(y);
    delay(10);
  }


}
void zadanie2() { 



  pixels.clear();
  pixels.setPixelColor(0, pixels.Color(200, 0, 255));
  pixels.setPixelColor(1, pixels.Color(200, 0, 255));
  pixels.setPixelColor(2, pixels.Color(200, 0, 255));
  pixels.setPixelColor(3, pixels.Color(200, 0, 255));
  pixels.setPixelColor(4, pixels.Color(200, 0, 255));
  pixels.setPixelColor(5, pixels.Color(200, 0, 255));
  pixels.setPixelColor(6, pixels.Color(200, 0, 255));
  pixels.setPixelColor(7, pixels.Color(200, 0, 255));
  pixels.setPixelColor(8, pixels.Color(200, 0, 255));
  pixels.show();

}
void zadanie3() {


  int val = analogRead(analogPin);
  val = map(brightness, 0, 1023, 0, 255);
  Serial.println(brightness);         
  pixels.setBrightness(brightness);
}

void zadanie4() { 
}
void zadanie5() {
}
void zadanie6() {
}



void loop()
{

  akcja.process();


  akcja.updateInterval(0, 100); // odpalamy akcje dla zadania 2, co 300 ms.
  akcja.updateInterval(1, 150); // odpalamy akcje dla zadania 2, co 300 ms.
  akcja.updateInterval(2, 200); // odpalamy akcje dla zadania 2, co 300 ms.

}
https://www.youtube.com/watch?v=cKjOUSEIbS0
 
Odpowiedź
#2
No, ale na jakim porcie masz wyjście tego "brightness", bo nie za bardzo widać gdzie on ma się wykonać? Z tego, co widzę to w monitorze portu powinno coś się wyświetlić. Ustaw pin procesora oznaczony PWM jako OUTPUT w setup i w zadaniu 3 wyślij wartość odczytaną na ten port PWM i tam podłącz diodę np: czerwoną przez rezystor dla testu potem do docelowego układu z diodami.
 
Odpowiedź
#3
To czeka Cię jeszcze dużo nauki. Pierwszy raz widzę floata jako zmienną sterującą w for, to na pewno przyspiesza, bo na pewno nie dało się i zrobić <(360*50) i uint16_t.
Odpalasz funkcje tego zadania co 100ms (? komentarz mówi co innego), gdzie funkcja trwa dzięki delayom 10x50x360=180s.
Tak napisane funkcje nie będą działać "równocześnie", bo funkcja musi ustalać czy ma coś do zrobienia po 10us trwania w loop i się kończyć, by inne mogły również sprawdzić swoje zadania, zadziałać lub nie i się zakończyć, zapamiętując co robiły, gdzie są i po co. I dopiero wtedy można ich wrzucić kilka w loop i zaobserwować "równoczesne" działanie wszystkich funkcji w loop (z punktu widzenia ludzkiego oka i mózgu).
Jak chcesz sprawdzić ile trwa wykonanie jednej linijki programu, to złap czas start=micros(), po funkcji koniec=micros(), wydrukuj na UART różnice z rzutowaniem na uint32_t.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości