Arduino Uno bilan bir nechta bekor qilish mumkinmi?

Menda muammo bor. Men vosita, old chiroqlar va orqa chiroqlar bilan mashina qilishni xohlayman. Men ularni bir vaqtning o'zida ishlatishni xohlayman, lekin turli datchiklarda.

Bu mening kodim.

const int red1 = 10;
const int red2 = 11;
const int blue1 = 12;
const int blue2 = 13;
const int front1 = 3;
const int front2 = 4;
const int back1 = 5;
const int back2 = 6;
const int enablePWMPin = 9;
const int controlPinA = 8;
const int controlPinB = 7;
int buzzer = A0;

void setup() {
  pinMode(red1, OUTPUT);
  pinMode(red2, OUTPUT);
  pinMode(blue1, OUTPUT);
  pinMode(blue2, OUTPUT);
  pinMode(front1, OUTPUT);
  pinMode(front2, OUTPUT);
  pinMode(back1, OUTPUT);
  pinMode(back2, OUTPUT);
  pinMode(enablePWMPin, OUTPUT);
  pinMode(controlPinA, OUTPUT);
  pinMode(controlPinB, OUTPUT);

  digitalWrite(enablePWMPin, LOW);
  digitalWrite(front1, LOW);
  digitalWrite(front2, LOW);
  digitalWrite(back1, LOW);
  digitalWrite(back2, LOW);
  digitalWrite(red1, LOW);
  digitalWrite(red2, LOW);
  digitalWrite(blue1, LOW);
  digitalWrite(blue2, LOW);
  noTone(buzzer);
}

void loop() {
  digitalWrite(enablePWMPin, HIGH);
  digitalWrite(controlPinA, HIGH);
  digitalWrite(controlPinB, LOW);
  delay(3000);
  digitalWrite(controlPinA, LOW);
  digitalWrite(controlPinB, HIGH);
  delay(3000);
} 

void loop() {
  digitalWrite(red1, HIGH);
  digitalWrite(red2, HIGH);
  digitalWrite(blue1, LOW);
  digitalWrite(blue2, LOW);
  delay(250);
  digitalWrite(red1, LOW);
  digitalWrite(red2, LOW);
  digitalWrite(blue1, HIGH);
  digitalWrite(blue2, HIGH);
  delay(250);
}

void loop() {
  int directionA = digitalRead(controlPinA);
  int directionB = digitalRead(controlPinB);
  if (directionA == HIGH && directionB == LOW) {
    digitalWrite(front1, HIGH);
    digitalWrite(front2, HIGH);
    digitalWrite(back1, LOW);
    digitalWrite(back2, LOW);
  } else if (directionA == LOW && directionB == HIGH) {
    digitalWrite(back1, HIGH);
    digitalWrite(back2, HIGH);
    digitalWrite(front1, LOW);
    digitalWrite(front2, LOW);
  } else {
    digitalWrite(front1, LOW);
    digitalWrite(front2, LOW);
    digitalWrite(back1, LOW);
    digitalWrite(back2, LOW);
  }
}

Men Arduino Uno dan foydalanmoqdaman. Bir vaqtning o'zida barcha voidli ko'chalarni ishga tushira olamanmi?

2
Faqat uni tuzishga urinib, sizni javob bilan ta'minlashi kerak ...
qo'shib qo'ydi muallif Louis Rhys, manba

5 javoblar

Boshqalar aytganidek, sizda bir nechta loop funktsiyasi mavjud emas. Siz nima qilishingiz kerakligi sizning yondashuvingizni o'zgartiradi, shuning uchun siz qilmoqchi bo'lgan har bir narsani ketma-ket blokirovka qilmasdan (masalan, kechiktiruvchi funktsiyalardan foydalanishni olib tashlash) bajarish mumkin. JRobertning ayrim tavsiyalari bo'yicha kengaytirildi, bu vazifalarni qanday qilib "bir vaqtning o'zida bajarishim kerak" degani:

void loop() {

    lights1(); 
    lights2();
    motor();

}

void lights1() {

  static unsigned long lastTime = 0;
  const long interval = 3000;
  static bool state = 0;

  unsigned long now = millis();

  if ( now - lastTime > interval && state == 0) {
    state = 1;
    lastTime = now;
    digitalWrite(enablePWMPin, HIGH);
    digitalWrite(controlPinA, HIGH);
    digitalWrite(controlPinB, LOW);
  }

  if ( now - lastTime > interval && state == 1) {
    state = 0;
    lastTime = now;
    digitalWrite(controlPinA, LOW);
    digitalWrite(controlPinB, HIGH);
  }
}

void lights2() {

  static unsigned long lastTime = 0;
  const long interval = 250;
  static bool state = 0;

  unsigned long now = millis();

  if ( now - lastTime > interval && state == 0) {
    state = 1;
    lastTime = now;
    digitalWrite(red1, HIGH);
    digitalWrite(red2, HIGH);
    digitalWrite(blue1, LOW);
    digitalWrite(blue2, LOW);
  }

  if ( now - lastTime > interval && state == 1) {
    state = 0;
    lastTime = now;
    digitalWrite(red1, LOW);
    digitalWrite(red2, LOW);
    digitalWrite(blue1, HIGH);
    digitalWrite(blue2, HIGH);
  }

}

void motor() {
  int directionA = digitalRead(controlPinA);
  int directionB = digitalRead(controlPinB);
  if (directionA == HIGH && directionB == LOW) {
    digitalWrite(front1, HIGH);
    digitalWrite(front2, HIGH);
    digitalWrite(back1, LOW);
    digitalWrite(back2, LOW);
  } else if (directionA == LOW && directionB == HIGH) {
    digitalWrite(back1, HIGH);
    digitalWrite(back2, HIGH);
    digitalWrite(front1, LOW);
    digitalWrite(front2, LOW);
  } else {
    digitalWrite(front1, LOW);
    digitalWrite(front2, LOW);
    digitalWrite(back1, LOW);
    digitalWrite(back2, LOW);
  }
}

Ushbu yondashuv barcha uch funktsiyalarni bir vaqtning o'zida bajarilishini simulyatsiya qiladi. Har bir funktsiya bir vaqtning o'zida ishlaydi. Biroq, kechikish yorug'lik1/2 funktsiyalaridan olib tashlanganligi sababli, ular kutish muddati davomida to'xtash o'rniga tezda tugaydi. Bu vosita (lar) ning ishlashiga imkon beradi va chiroqlar hammasi bir vaqtning o'zida yonib-o'chib turadi.

2
qo'shib qo'ydi

Siz nima qilmoqchisiz? Ushbu ko'chadan bir vaqtning o'zida ishlashi kerakmi (mumkin emas)? Yoki boshqasidanmi? Agar "haqiqiy tezkor" etarlicha yaxshi bo'lsa, siz "bir vaqtning o'zida" juda yaqin bo'lishingiz mumkin. Sizga kerak

  • Har bir loop funktsiyasini yangi, noyob nom bering;
  • Dastlabki ikkita ko'chadan har biriga 5 (5) funktsiyalar uchun kechikish() sda bo'linadi;
  • Funktsiyalarning har birini kerakli darajada ishga tushirish uchun SimpleTimer kabi taymer kutubxonasidan foydalaning.
  • va faqat loop() funktsiyasidan foydalanib, SimpleTimer ning ".run ()" funksiyasini chaqirib, hamma narsani saqlab qoling.

DigitalRead() va digitalWrite() chaqiruvlarini to'g'ridan-to'g'ri o'qish va o'qish yoki sozlashni istagan portga va bitga yozib, individual funktsiyalarning tezligini yaxshilashingiz mumkin.

1
qo'shib qo'ydi

Men ularni bir vaqtning o'zida bajarishni istayman, lekin boshqa ko'chadan.

Birinchidan, siz bir vaqtning o'zida faqat bir narsani qilishingiz mumkin. Xullas, shunday bo'ldi.

Ikkinchidan, bir nechta loopni ketma-ket (bir vaqtning o'zida) ishlatish uchun juda oson:

void loop1(void) {...}
void loop2(void) {...}
...

void loop(void) {
  loop1(); //run loop1
  loop2(); //run loop2
  ...
  loopn(); //run loopn
}

U ishlayaptimi, bu ko'chalarni qanday kodlaganligingizga bog'liq bo'ladi.

1
qo'shib qo'ydi

Yo'q, qilolmaysiz.

Faqatgina C/C ++ ning bir nechta o'xshash funktsiyalarga ega bo'lishi emas, balki u (jfpoilpretning sharhi kabi) tuzilmaydi. Bundan tashqari, Arduino dunyosida dastur oqimiga mos kelmaydi - eskizlar - Sizda eng yuqori (foydalanuvchi tomonidan foydalanish mumkin) darajadagi ikkita usul mavjud: void setup() va void loop() . setup dasturning boshida aynan bir marta ishlaydi. Buning ortidan loop ga aylantirildi (shu sababli ism). O'zingizning maqsadli dastur oqimingizni amalga oshirish uchun o'z kodingizni to'g'ri tarzda qayta ishlashingiz kerak, ya'ni o'z funktsiyalaringizni loop dan chaqiring. www.arduino.cc saytida o'qishingiz mumkin.

1
qo'shib qo'ydi

Bir vaqtning o'zida bir nechta loopni bekor qilish uchun Arduino Due kengashiga kerak. Bu #include kutubxonasiga mos keladigan yagona kengash

see : https://www.arduino.cc/en/Tutorial/MultipleBlinks

1
qo'shib qo'ydi