Uproszczenie programu ARDUINO

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
markuz
Młodszy majsterkowicz
Posty: 7
Rejestracja: 7 gru 2012, 23:27

Uproszczenie programu ARDUINO

Post autor: markuz » 1 lut 2013, 00:43

Witam

Od niedawna wróciłem do zabawy z mikrokontrolerami, kiedyś zaczynałem od BASCOM teraz postanowiłem pobawić się ARDUINO. Wielu rzeczy jeszcze nie rozumiem ale szybko staram się to nadrobić. Ale mam prośbę do osób bardziej doświadczonych w Arduino. Mianowicie napisałem prosty program (kod poniżej) którego zadaniem jest sterować ośmioma przekaźnikami po przez komunikacje BT oraz wysyłanie informacji z 5 wejść analogowych. Program działa poprawnie ale wydaje mi się że nie do końca jest poprawnie zrobiony po za tym mam jeden problem z którym jeszcze się nie uporałem. Chodzi o ustawienie czasu co jaki ma wysyłać dane z analogowych wejść (w programie ustawiony delay(10) jednak wpływa on również na pozostałą cześć programu czyli na sterowanie przekaźnikami jak można podzielić to w dwa podprogramy które będą chodzić jednocześnie i nie zależnie?

KOD PROGRAMU

const int sensorReadingA1 = A1;
const int sensorReadingA2 = A2;
const int sensorReadingA3 = A3;
const int sensorReadingA4 = A4;
const int sensorReadingA5 = A5;

int sensorA1 = 0;
int sensorA2 = 0;
int sensorA3 = 0;
int sensorA4 = 0;
int sensorA5 = 0;

int outputA1 = 0;
int outputA2 = 0;
int outputA3 = 0;
int outputA4 = 0;
int outputA5 = 0;

void setup()
{
Serial.begin(115200);

pinMode(A0, OUTPUT); //konfi guracja linii A0 jako wyjście
pinMode(6, OUTPUT); //konfi guracja linii 6 jako wyjście
pinMode(7, OUTPUT); //konfi guracja linii 7 jako wyjście
pinMode(8, OUTPUT); //konfi guracja linii 8 jako wyjście
pinMode(9, OUTPUT); //konfi guracja linii 9 jako wyjście
pinMode(10, OUTPUT); //konfi guracja linii 10 jako wyjście
pinMode(11, OUTPUT); //konfi guracja linii 11 jako wyjście
pinMode(12, OUTPUT); //konfi guracja linii 12 jako wyjście

digitalWrite(A0, HIGH); // OFF
digitalWrite(6, HIGH); // OFF
digitalWrite(7, HIGH); // OFF
digitalWrite(8, HIGH); // OFF
digitalWrite(9, HIGH); // OFF
digitalWrite(10, HIGH); // OFF
digitalWrite(11, HIGH); // OFF
digitalWrite(12, HIGH); // OFF

}

void loop()
{

sensorA1 = analogRead(sensorReadingA1);
sensorA2 = analogRead(sensorReadingA2);
sensorA3 = analogRead(sensorReadingA3);
sensorA4 = analogRead(sensorReadingA4);
sensorA5 = analogRead(sensorReadingA5);

outputA1 = map(sensorA1, 0, 1023, 0, 250);
outputA2 = map(sensorA2, 0, 1023, 0, 250);
outputA3 = map(sensorA3, 0, 1023, 0, 250);
outputA4 = map(sensorA4, 0, 1023, 0, 250);
outputA5 = map(sensorA5, 0, 1023, 0, 250);

Serial.print("n;");
Serial.print(outputA3);
Serial.print(";");
Serial.print(outputA2);
Serial.print(";");
Serial.print(outputA4);
Serial.print(";");
Serial.print(outputA1);
Serial.print(";");
Serial.print(outputA5);
Serial.println(";m");
delay(10);

if (Serial.available())
{
switch (Serial.read())
{

case 'w':// ON - Przekaźnik 1
digitalWrite(12, LOW);
break;
case 'a':// OFF - Przekaźnik 1
digitalWrite(12, HIGH);
break;

case 'e':// ON - Przekaźnik 2
digitalWrite(11, LOW);
break;
case 's':// OFF - Przekaźnik 2
digitalWrite(11, HIGH);
break;

case 'r':// ON - Przekaźnik 3
digitalWrite(7, LOW);
break;
case 'd':// OFF - Przekaźnik 3
digitalWrite(7, HIGH);
break;

case 't':// ON - Przekaźnik 4
digitalWrite(9, LOW);
break;
case 'f':// OFF - Przekaźnik 4
digitalWrite(9, HIGH);
break;

case 'y':// ON - Przekaźnik 5
digitalWrite(A0, LOW);
break;
case 'g':// OFF - Przekaźnik 5
digitalWrite(A0, HIGH);
break;

case 'u':// ON - Przekaźnik 6
digitalWrite(10, LOW);
break;
case 'h':// OFF - Przekaźnik 6
digitalWrite(10, HIGH);
break;

case 'i':// ON - Przekaźnik 7
digitalWrite(6, LOW);
break;
case 'j':// OFF - Przekaźnik 7
digitalWrite(6, HIGH);
break;

case 'o':// ON - Przekaźnik 8
digitalWrite(8, LOW);
break;
case 'k':// OFF - Przekaźnik 8
digitalWrite(8, HIGH);
break;


}
}
}


Proszę o pomoc lub jakieś wskazówki w jaki sposób polepszyć programik i jak rozwiązać opisany problem.
Z góry dziękuje za udzieloną pomoc, wskazówki i wytknięte błędy.

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


jarek.m
Młodszy majsterkowicz
Posty: 33
Rejestracja: 16 cze 2012, 17:36

Re: Uproszczenie programu ARDUINO

Post autor: jarek.m » 1 lut 2013, 10:12

Dokładnie chodzi CI o to, że delay(10) blokuje na chwilę wykonywanie całego kodu? Jeśli tak to zamiast tego użyj millis() wg przykładu http://arduino.cc/en/Tutorial/BlinkWithoutDelay.

Arduino due ma możliwość używania Scheduler.startLoop() czyli uruchamianie kilku pętli jednocześnie. Więcej: http://arduino.cc/en/Reference/SchedulerStartLoop
shymon
Majsterkowicz
Posty: 139
Rejestracja: 6 paź 2012, 20:27

Re: Uproszczenie programu ARDUINO

Post autor: shymon » 1 lut 2013, 11:57

markuz pisze:Chodzi o ustawienie czasu co jaki ma wysyłać dane z analogowych wejść (w programie ustawiony delay(10) jednak wpływa on również na pozostałą cześć programu czyli na sterowanie przekaźnikami jak można podzielić to w dwa podprogramy które będą chodzić jednocześnie i nie zależnie?
Rozumiem, że ta wysyłka ma odbywać się ze stałym interwałem czasowym?
W takim razie najlepiej byłoby użyć timera, ustawić go na generowanie przerwania po zliczeniu, a w handlerze albo zmieniać flagę, albo wysyłać te dane - zależy jak dużo tych operacji tam będzie i czy starczy czasu na obsługę całego przerwania.
markuz
Młodszy majsterkowicz
Posty: 7
Rejestracja: 7 gru 2012, 23:27

Re: Uproszczenie programu ARDUINO

Post autor: markuz » 2 lut 2013, 19:34

jarek.m pisze:Dokładnie chodzi CI o to, że delay(10) blokuje na chwilę wykonywanie całego kodu? Jeśli tak to zamiast tego użyj millis()
Ale on też odniósł mi się do całej pętli :(
jarek.m pisze:Arduino due ma możliwość używania Scheduler.startLoop() czyli uruchamianie kilku pętli jednocześnie.
No to było by wyjście :D, ale ściągnąłem bibliotekę Scheduler z strony Arduino wgrałem ją do katalogu bibliotek i wszystko niby OK, pojawiła się w programie w bibliotekach wybieram ją i nadal wszystko niby OK ale jak wrzucę np. ten program przykładowy ze strony arduino:

Kod: Zaznacz cały

[b]#include <Scheduler.h>

int counter = 0;
int counter1 = 0;

void setup()
{
  Scheduler.startLoop(loop1);
}

void loop () {
 analogWrite(9, counter);
 counter++;
 if (counter > 255){
  counter = 0;
 }
 delay(33);
}

void loop1 () {
 analogWrite(10, counter1);
 counter1=counter1+5;
 if (counter1 > 255){
  counter1 = 0;
 }
 delay(10);
 yield();
}[/b]



Przy sprawdzaniu zawsze zatrzymuje się na Scheduler.startLoop() i wywala błąd :(

sketch_feb02a.ino: In function 'void loop1()':
sketch_feb02a:27: error: 'yield' was not declared in this scope


Co jest powodem? :(
Awatar użytkownika
Marhef
Złota rączka
Posty: 1137
Rejestracja: 18 lis 2011, 02:18

Re: Uproszczenie programu ARDUINO

Post autor: Marhef » 4 lut 2013, 00:43

Nie jestem pewien, ale moim zdaniem chodzi o to, że próbujesz wywołać funkcję yield(), której nigdzie nie ma
markuz
Młodszy majsterkowicz
Posty: 7
Rejestracja: 7 gru 2012, 23:27

Re: Uproszczenie programu ARDUINO

Post autor: markuz » 4 lut 2013, 01:12

Marhef pisze:Nie jestem pewien, ale moim zdaniem chodzi o to, że próbujesz wywołać funkcję yield(), której nigdzie nie ma
Też tak myślałem ale występuje ona w każdym przykładzie Arduino s funkcją Scheduler i nie jest nigdzie skonfigurowana.

Kolega CUBE w temacie pokrewnym napisał że to wina leży po stronie procesora ponieważ ja używam 8-bitowych a funkcja Scheduler działa na 32-bitowym procesorze architektury ARM Cortex-M3.
Awatar użytkownika
cube
Złota rączka
Posty: 834
Rejestracja: 2 gru 2012, 17:02

Re: Uproszczenie programu ARDUINO

Post autor: cube » 4 lut 2013, 12:47

Patrząc na listing przykładów tej biblioteki, może być to czego szukasz: http://playground.arduino.cc/Code/Metro
Musisz sam sprawdzić jej działanie, gdyż widzę że ostatnia wersja jest z przed 4 lat i może być problem z ide w wersji 1 i późniejszych. Ale warto spróbować.
Alternatywą może być zewnętrzny zegar RTC i przerwania.

Edit. A tu masz piękny tutorial apropos timerów: http://www.instructables.com/id/Arduino ... /?ALLSTEPS
markuz
Młodszy majsterkowicz
Posty: 7
Rejestracja: 7 gru 2012, 23:27

Re: Uproszczenie programu ARDUINO

Post autor: markuz » 12 lut 2013, 17:35

cube pisze: A tu masz piękny tutorial apropos timerów
OK dzięki timery załatwiły sprawe :)

Temat mozna zamknać
ODPOWIEDZ

Strony partnerskie: