ผมต้องการย่อ code ครับทำวิธีไหนได้บ้าง

void setup() {
pinMode(D1,OUTPUT);
pinMode(D2,OUTPUT);
pinMode(D3,OUTPUT);
pinMode(D4,OUTPUT);
}

void loop()

{

digitalWrite(D1,1);
delay(500);
digitalWrite(D1,0);
delay(500);
digitalWrite(D2,1);
delay(500);
digitalWrite(D2,0);
delay(500);
digitalWrite(D3,1);
delay(500);
digitalWrite(D3,0);
delay(500);

digitalWrite(D1,1);
delay(300);
digitalWrite(D2,1);
delay(300);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
delay(300);
digitalWrite(D2,0);
delay(300);
digitalWrite(D3,0);
delay(300);
digitalWrite(D3,1);
delay(300);
digitalWrite(D2,1);
delay(300);
digitalWrite(D1,1);
delay(300);

digitalWrite(D1,0);
digitalWrite(D2,0);
digitalWrite(D3,0);
delay(500);

digitalWrite(D1,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D3,0);
delay(100);
digitalWrite(D2,1);
delay(300);
digitalWrite(D2,0);
digitalWrite(D1,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D3,0);
delay(100);
digitalWrite(D2,1);
delay(300);
digitalWrite(D2,0);
digitalWrite(D1,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D3,0);
delay(100);
digitalWrite(D2,1);
delay(300);
digitalWrite(D2,0);
digitalWrite(D1,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D3,0);
delay(100);
digitalWrite(D2,1);
delay(300);
digitalWrite(D2,0);
digitalWrite(D1,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D3,0);
delay(100);
digitalWrite(D2,1);
delay(300);
digitalWrite(D2,0);
digitalWrite(D1,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D3,0);
delay(100);
digitalWrite(D2,1);
delay(300);
digitalWrite(D2,0);
digitalWrite(D1,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D3,0);
delay(100);
digitalWrite(D2,1);
delay(300);
digitalWrite(D2,0);
digitalWrite(D1,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D3,0);
delay(100);
digitalWrite(D2,1);
delay(300);
digitalWrite(D2,0);

digitalWrite(D1,1);
digitalWrite(D2,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D2,0);
digitalWrite(D3,0);
delay(300);

digitalWrite(D1,1);
digitalWrite(D2,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D2,0);
digitalWrite(D3,0);
delay(300);

digitalWrite(D1,1);
digitalWrite(D2,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D2,0);
digitalWrite(D3,0);
delay(300);

digitalWrite(D1,1);
digitalWrite(D2,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D2,0);
digitalWrite(D3,0);
delay(300);

digitalWrite(D1,1);
digitalWrite(D2,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D2,0);
digitalWrite(D3,0);
delay(300);

digitalWrite(D1,1);
digitalWrite(D2,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D2,0);
digitalWrite(D3,0);
delay(300);

digitalWrite(D1,0);
digitalWrite(D2,0);
digitalWrite(D3,0);
delay(300);

}

เริ่มจาก เก็บ Dx ไว้เป็น array ก่อนครับ แล้วใช้ for วนไปเอาค่า Dx แต่ละชุดมาแทนใน for loop

ผมขอตัวอย่างหน่อยได้ไหมครับ

image

ตรงนี้คือ ทำไมไม่เหมือนกับชุดอื่นครับ แล้วเวลา 300 บ้าง 500 บ้าง บางอันเว้น บ้างอันไหมเว้น on/off อธิบายสเตปการทำงานหลักๆ หน่อยครับว่าต้องการให้มันทำอะไร

ผมต้องการทำไฟวิ่งครับ

char pattern[]={0b0000,
                0b0001,
                0b0011,
                0b0111,
                0b1111,
                0b1110,
                0b1100,
                0b1000};

คืออะไรครับ หมายความว่าไงครับ

เป็นการเก็บ bit ไว้เป็นชุดสำหรับ การเอามารัน led ที่ละชุด ดคล้ายๆ กับที่เราต้องการนั้นละครับ อารมณ์ประมาณนี้

// Youssef.ROCHDI Nov 2019
/*Jeu de lumière à registre à décalage 74HC595
8leds , 4 modes
pour changer de mode il faut une impulsion prolongée sur le
bouton poussoir
*/
//********************************
#define SER 2  //entrée série du registre à décalage
#define RCLK 3 //signal d'horloge de transfert des sorties
#define SRCLK 4 //signal d'horloge du registre à décalage
#define BP 8  //bouton poussoir pour passer au mode suivant

int mode_actuel = 0; //mode actuel soit 0, 1 2 ou 3; au début c'est 0
//différents états des sorties pour les quatre modes
byte mode0[8] = {1, 2, 4, 8, 16, 32, 64, 128}; //8 états
byte mode1[8] = {128, 64, 32, 16, 8, 4, 2, 1}; //8 état
byte mode2[8] = {255, 0}; //deux état allumees toutes ou eteintes toutes
byte mode3[8] = {0xF0, 0x0F}; //deux états quart fort allumé et quarté faible eteint ou inverse
void setup() {
  pinMode(SER, OUTPUT); // config en sorties de 2 , 3 et 4
  pinMode(RCLK, OUTPUT);
  pinMode(SRCLK, OUTPUT);
  pinMode(BP, INPUT_PULLUP);//config en entrée PULLUP interne de 8
  digitalWrite(SRCLK, LOW); //signal d'horloge de déacalage à 0
  digitalWrite(RCLK, LOW);//signal d'horloge de transfert à 0

}

void loop() {

  while (digitalRead(BP) == LOW) ; //attendre que le BP soit relâché s'il a été appuié
  switch (mode_actuel) { //selon la valeur de mode_actuel
    case 0:  //mode 0
      for (int i = 0; i < 8; i++) {
        charger(mode0[i]); //charger l'octet mode0[i] dans le registre
        delay(500); //attendre 500ms
        if (digitalRead(BP) == LOW) { //vérifier si BP appuié
          mode_actuel = 1; //si c'est la cas passer au mode 1
          break; //sortie de la boucle for avant sa fin
        }
      }
      break; //fin du cas on va à la fin du switch, et onreboucle (loop)

    case 1:  //mode 1
      for (int i = 0; i < 8; i++) {
        charger(mode1[i]);
        delay(500);
        if (digitalRead(BP) == LOW) {
          mode_actuel = 2;
          break;
        }
      }
      break;
    case 2:  //mode 2
      for (int i = 0; i < 2; i++) {
        charger(mode2[i]);
        delay(500);
        if (digitalRead(BP) == LOW) {
          mode_actuel =3;
          break;
        }
      }
      break;
    case 3:  //mode 3
      for (int i = 0; i < 2; i++) {
        charger(mode3[i]);
        delay(500);
        if (digitalRead(BP) == LOW) {
          mode_actuel = 0;
          break;
        }
      }
      break;
  }

}

//*******************************************
/*
Cette fonction permet de:
charger les bits d'un octet dans le registre à décalage
bit par bit à l'aide de l'entrée SE et l'horloge SRCLK
une fois cet octet chargé dans le bascules du registre à décalage
ils sont transférés vers les bascules de sorties à l'aide de
front montant sur l'horloge RCLK
*/
void charger( byte octet) { //charge octet dans le registre à décalage
  byte mask = 1;
  for (int i = 0; i < 8; i++) { //répeter pour les 8 bits de octet
    //explication
    //extraction de la valeur du bit i dans octet et écrire 1 vers sortie SER si ce bit à 1 ou 0 si ce bit est à 0
    //mask<<i  donne un octet dans le quel 1 est positionné à la position i
    //octet & (mask<<i) donne un octet où tous les bits sont à 0 sauf le ième qui garde sa valeur X (soit 0 soit1)
    // (octet & (mask<<i) )>>i donne un octet où tous les bits sont nuls sauf le premier qui la valeur X
    //donc (octet & (mask<<i) )>>i est égal à 1 si le ième bit de octet est égal à 0, et est égal à 0 si le ième bit est à 0
    digitalWrite(SER, (octet & (mask << i)) >> i); //fait sortir la valeur du ième bit dans octet vers l'entrée du registre
    digitalWrite(SRCLK, HIGH); delay(1); //créer un front montant pour provoquer le décalage
    digitalWrite(SRCLK, LOW); delay(1); //créer un front descendant --> impulsion de 1ms on , 1ms off
  }
  //octet est maintenant chargé dans le registre à décalage
  //il faut le transférer vers les sorties du circuit pour commander les leds
  digitalWrite(RCLK, HIGH); delay(1);//créer un front montant pour provoquer le transfert
  digitalWrite(RCLK, LOW); delay(1);//créer un front montant pour provoquer le transfert
}

ขอบคุณครับพี่

เบื้องต้น ช่วงนี้รวมได้ก่อนง่ายๆ เลยครับเพราะเหมือนกัน

ตัวอย่างใช้ for loop ลดรูป

for (int i=0 ; i < 2 ; i++){
digitalWrite(D1,1);
digitalWrite(D2,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D2,0);
digitalWrite(D3,0);
delay(300);
}

โค้ต

#define D1 1
#define D2 2
#define D3 3
#define D4 4

void setup() {
pinMode(D1,OUTPUT);
pinMode(D2,OUTPUT);
pinMode(D3,OUTPUT);
pinMode(D4,OUTPUT);
}

void loop()

{

digitalWrite(D1,1);
delay(500);
digitalWrite(D1,0);
delay(500);
digitalWrite(D2,1);
delay(500);
digitalWrite(D2,0);
delay(500);
digitalWrite(D3,1);
delay(500);
digitalWrite(D3,0);
delay(500);

digitalWrite(D1,1);
delay(300);
digitalWrite(D2,1);
delay(300);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
delay(300);
digitalWrite(D2,0);
delay(300);
digitalWrite(D3,0);
delay(300);
digitalWrite(D3,1);
delay(300);
digitalWrite(D2,1);
delay(300);
digitalWrite(D1,1);
delay(300);

digitalWrite(D1,0);
digitalWrite(D2,0);
digitalWrite(D3,0);
delay(500);

digitalWrite(D1,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D3,0);
delay(100);
digitalWrite(D2,1);
delay(300);
digitalWrite(D2,0);
digitalWrite(D1,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D3,0);
delay(100);
digitalWrite(D2,1);
delay(300);
digitalWrite(D2,0);
digitalWrite(D1,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D3,0);
delay(100);
digitalWrite(D2,1);
delay(300);
digitalWrite(D2,0);
digitalWrite(D1,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D3,0);
delay(100);
digitalWrite(D2,1);
delay(300);
digitalWrite(D2,0);
digitalWrite(D1,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D3,0);
delay(100);
digitalWrite(D2,1);
delay(300);
digitalWrite(D2,0);
digitalWrite(D1,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D3,0);
delay(100);
digitalWrite(D2,1);
delay(300);
digitalWrite(D2,0);
digitalWrite(D1,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D3,0);
delay(100);
digitalWrite(D2,1);
delay(300);
digitalWrite(D2,0);
digitalWrite(D1,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D3,0);
delay(100);
digitalWrite(D2,1);
delay(300);
digitalWrite(D2,0);

digitalWrite(D1,1);
digitalWrite(D2,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D2,0);
digitalWrite(D3,0);
delay(300);

digitalWrite(D1,1);
digitalWrite(D2,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D2,0);
digitalWrite(D3,0);
delay(300);

digitalWrite(D1,1);
digitalWrite(D2,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D2,0);
digitalWrite(D3,0);
delay(300);

for (int i=0 ; i < 2 ; i++){
digitalWrite(D1,1);
digitalWrite(D2,1);
digitalWrite(D3,1);
delay(300);
digitalWrite(D1,0);
digitalWrite(D2,0);
digitalWrite(D3,0);
delay(300);
}

digitalWrite(D1,0);
digitalWrite(D2,0);
digitalWrite(D3,0);
delay(300);

}

ขอบคุณครับ