2016-09-20 9 views
0

Я новичок в arduino, и я хочу делать многопоточное программирование. Я написал код, и мне нужен следующий код для обновления переменной tempsPose, но он не работает (светодиод всегда мигает с той же скоростью).arduino thread update volatile variable

Как я могу изменить следующий код, чтобы обновить переменную «tempsPose» в функции blinkled13, когда эта переменная mofified в функции петли

Большое спасибо за вашу помощь

#include <Thread.h> 
Thread myThread = Thread(); 

int ledPin = 13; 
volatile int tempsPose ; 

void blinkLed13() 
{ 
    \\i would like the value of 'tempspose' to be updated 
    \\ when the value of the variable changes in the blinkLed13 function 
    while(1){ 
    digitalWrite(ledPin, HIGH); 
    delay(tempsPose); 
    digitalWrite(ledPin, LOW); 
    delay(tempsPose); 
    } 
} 


void setup() { 
    tempsPose = 100; 
    pinMode(13,OUTPUT); 
    Serial.begin(9600); 
    myThread.onRun(blinkLed13); 
    if(myThread.shouldRun()) 
    myThread.run(); 
} 

void loop() { 
    for(int j=0; j<100; j++){ 
    delay(200); 
    \\some code which change the value of 'tempsPose' 
    \\this code is pseudo code 
    tempsPose = tempsPose + 1000; 
    } 
    } 

ответ

0

Примеры - это «одноразовые» (без бесконечных циклов), а код if (thread.shouldRun()) thread.run(); находится внутри loop(). Поэтому я полагаю, что он не попадет в loop() вообще в вашем случае.

Например более интерактивный код ('+' добавляет 100мс, '-' вычитает 100мс):

#include <Thread.h> 

Thread myThread = Thread(); 
int ledPin = 13; 
volatile int tempsPose; 

void blinkLed13() { 
    // i would like the value of 'tempspose' to be updated 
    // when the value of the variable changes in the blinkLed13 function 
    static bool state = 0; 

    state = !state; 
    digitalWrite(ledPin, state); 

    Serial.println(state ? "On" : "Off"); 
} 

void setup() { 
    tempsPose = 100; 
    pinMode(13,OUTPUT); 
    Serial.begin(9600); 
    myThread.onRun(blinkLed13); 
    myThread.setInterval(tempsPose); 
} 

void loop() { 
    if(myThread.shouldRun()) myThread.run(); 

    if (Serial.available()) { 
    uint8_t ch = Serial.read(); // read character from serial 
    if (ch == '+' && tempsPose < 10000) { // no more than 10s 
     tempsPose += 100; 
     myThread.setInterval(tempsPose); 
    } else if (ch == '-' && tempsPose > 100) { // less than 100ms is not allowed here 
     tempsPose -= 100; 
     myThread.setInterval(tempsPose); 
    } 
    Serial.println(tempsPose); 
    } 
} 
+0

С учетом указанных выше кода, светодиод 13 не останавливается blinkink (в то время как (1) в функции), но задержка не изменяется со временем – user3052784

+0

Это потому, что он никогда не оставил 'blinkLed13'. Он никогда не попадает в «цикл», чтобы изменить эту задержку. Просто напечатайте эти измененные значения в Serial. Не будет ничего, потому что он застрял в функции 'setup' и' myThread.run() ' – KIIV

+0

Спасибо за ваш комментарий, но я не совсем понимаю, что вы написали. Не могли бы вы показать мне какой-то код. – user3052784