Как использовать корпус переключателя с двумя кнопками, как объединить buttonState1 и buttonState2

import muvium.compatibility.arduino.*; 

public class Class0 extends Arduino{ 

/*
Author: First Name MI. Last Name
Date: June 25, 2021
Title: Arduino Experiment 2
Description: Writing to the Output Pins using the FOR statement

Create a program that will display four different LED sequences having
different transition states repeated at different number of times and 
that the whole program will repeat itself continuously

Apply the concept of using funcions for each of the four LED sequences,
 each of which are to be called upon from the main program.

This time simplify the LED sequence functions using FOR control statements
to achieve the required iterations

Pin modes of each LED pins are to be iterated together using a FOR statement

The circuit:
 * LEDs connected from digital pin 4-11, all with respect to ground.
*/
// ---------------------------------------------------------
// Declaration of Global Variables:
  int led1 = 4; // LED1 connected to digital pin 4
  int led2 = 4; // LED2 connected to digital pin 4
  int led3 = 4; // LED3 connected to digital pin 4
  int led4 = 4; // LED4 connected to digital pin 4
  int switchPin1 = 2; // PushButton connected to digital pin 2
  int switchPin2 = 3; // PushButton connected to digital pin 3
  int buttonState1 = 0; // variable for reading pushbutton status
  int buttonState2 = 0; // variable for reading pushbutton status
// ---------------------------------------------------------
  public void setup() {
    // the setup() method runs once, when the sketch starts
    // initialize the digital pins as outputs;
    
    for (led1 = 4; led1 < 12; led1++) {
      pinMode(led1, OUTPUT); // Configure pin 4 to 11 as outputs
    }
    pinMode(switchPin1, INPUT);// Configure pin 2 as input
    pinMode(switchPin2, INPUT);// Configure pin 3 as input
  }
// ---------------------------------------------------------
  public void loop() {
    // the loop() method runs over and over again,
    // as long as the Arduino has power

    // read the state of pushbutton value
    buttonState1 = digitalRead(switchPin1);
    buttonState2 = digitalRead(switchPin2);

    switch (buttonState1) {
      case (0):
        for (led1 = 7, led2 = 8; (led1 > 3) && (led2 < 12); led1--, led2++) {
        digitalWrite(led1, HIGH); // set the LED on
        digitalWrite(led2, HIGH); // set the LED on
        delay(500); // wait for 500 milliseconds
        digitalWrite(led1, LOW); // set the LED off
        digitalWrite(led2, LOW); // set the LED off
        }
        break;

      case 1:
        for (led1 = 11, led2 = 9, led3 = 7, led4 = 5; (led1 > 9) && (led2 > 7) && (led3 > 5) && (led4 > 3); led1--, led2--, led3--, led4--) {
        digitalWrite(led1, HIGH); // set the LED on
        digitalWrite(led2, HIGH); // set the LED on
        digitalWrite(led3, HIGH); // set the LED on
        digitalWrite(led4, HIGH); // set the LED on
        delay(500); // wait for 500 milliseconds
        digitalWrite(led1, LOW); // set the LED off
        digitalWrite(led2, LOW); // set the LED off
        digitalWrite(led3, LOW); // set the LED off
        digitalWrite(led4, LOW); // set the LED off
        }
        break;
        
      case 2:
        for (led1 = 11, led2 = 10, led3 = 9, led4 = 8; (led1 > 6) && (led2 > 5) && (led3 > 4) && (led4 > 3); led1-=4, led2-=4, led3-=4, led4-=4) {
          digitalWrite(led1, HIGH); // set the LED on
          digitalWrite(led2, HIGH); // set the LED on
          digitalWrite(led3, HIGH); // set the LED on
          digitalWrite(led4, HIGH); // set the LED on
          delay(500); // wait for 500 milliseconds
          digitalWrite(led1, LOW); // set the LED off
          digitalWrite(led2, LOW); // set the LED off
          digitalWrite(led3, LOW); // set the LED off
          digitalWrite(led4, LOW); // set the LED off
          }
          break;

      default:
        for (led1 = 11, led2 = 4; (led1 > 7) && (led2 < 8); led1--, led2++) {
          digitalWrite(led1, HIGH); // set the LED on
          digitalWrite(led2, HIGH); // set the LED on
          delay(500); // wait for 500 milliseconds
          digitalWrite(led1, LOW); // set the LED off
          digitalWrite(led2, LOW); // set the LED off
          }
    }
  }
}

, 👍1

Обсуждение

Java на микроконтроллере? :o. Богохульство :p, @Swedgin

что вы подразумеваете под корпусом выключателя с двумя кнопками? ... чего вы пытаетесь достичь?, @jsotola

Я изменил ваши теги: на этом сайте "переключатель" означает физический компонент, который вы нажимаете пальцем, а не программную конструкцию switch/case., @Majenko

Если вы спрашиваете, как вы можете переключаться на основе комбинированного состояния двух переменных, у вас есть несколько вариантов. В этом конкретном случае вы можете создать значение с битом, представляющим каждое состояние, скажем, биты 0 и 1 будут состоянием кнопок 1 и 2, а затем просто включите это агрегированное значение. Имеет ли это смысл с точки зрения приложения или нет, зависит от того, что вы пытаетесь сделать, а это не очень понятно., @Dave Newton

в setup () почему вы повторяете одно и то же действие 4 раза?, @jsotola

@jsotola ах да, спасибо, что упомянули об этом, я уже удалил ненужное, @Anonymous Question

@AnonymousQuestion нет, он все еще там ... ваш список программ не изменился, @jsotola


1 ответ


1

Я не знаю, что это за код, но это не код Arduino. Похоже, он завернут в какой-то другой класс. Но в реальном коде Arduino...

Чтобы "объединить" ваши два состояния кнопок, полезно думать о них как о двух отдельных битах внутри байта. Байт состоит из 8 битов, и любой из них может быть включен или выключен. Если вы свяжете свои две кнопки с двумя из этих битов, вы можете представить их как одно число в байте.

Например, если вы используете:

uint8_t buttonStates = (digitalRead(switchPin2) << 1) | digitalRead(switchPin1);

вы создаете одну переменную, содержащую оба состояния. Проще говоря, это означает "Прочитайте switchPin2, сдвиньте результат на один бит влево, затем прочитайте switchPin1 и наложите два результата вместе".

Таким образом, результатом является байт, где бит 1-switchPin2, а бит 0-switchPin1.

Таким образом, это дает вам таблицу истинности:

SP1 | SP2 | Variable
----+-----+----------
 0  |  0  | 0b00000000
 1  |  0  | 0b00000001
 0  |  1  | 0b00000010
 1  |  1  | 0b00000011

Это, конечно, числа 0-3 в десятичной системе счисления.

Итак, вы можете использовать переключатель:

switch (buttonStates) {
    case 0: // switchPin1 == 0, switchPin2 == 0
        // do something
        break;
    case 1: // switchPin1 == 1, switchPin2 == 0
        // do something
        break;
    case 2: // switchPin1 == 0, switchPin2 == 1
        // do something
        break;
    case 3: // switchPin1 == 1, switchPin2 == 1
        // do something
        break;
}
,

uint8_t не работает для моего arduino mega в виртуальном макете :((, @Anonymous Question

Тогда не используйте виртуальный макет, что бы это ни было. Этот код будет работать на реальном Arduino. Если вы не используете настоящий Ardunio, то это ваш наблюдательный пункт., @Majenko

Затем @AnonymousQuestion использует другой тип., @Dave Newton

о, это работает, когда я удалил uint8_t спасибо, @Anonymous Question