Алгоритм Arduino

У меня есть 3 кнопки, 3 светодиода и 2 реле. Когда вы нажимаете кнопку 1 один раз, загорается светодиод 1, и таймер устанавливается на 10 секунд. Если дважды нажать кнопку 1, загорится светодиод 2, и таймер будет установлен на 20 секунд. Когда нажмите вторую кнопку один раз, выберите первое реле. Когда дважды нажмете вторую кнопку, выберите второе реле. И в конце кнопка запуска (button3) для запуска сохраненных реле и led3 на время, которое мы ранее установили.

код:

#define BTN1_PIN 3
#define BTN2_PIN 4
#include <GyverButton.h>
GButton butt1(BTN1_PIN);
GButton butt2(BTN2_PIN);
int relay1=8;
int relay2=9;
int led=5;
int led2=6;
int led3=7;

int butt3=5;

int secmek=0;
int gozlemek=0;

void setup() {
  Serial.begin(9600);
  butt1.setDebounce(150);
  butt2.setDebounce(150);
  butt1.setClickTimeout(500);
  butt2.setClickTimeout(500);
  pinMode(relay1, OUTPUT);
  digitalWrite(relay1, LOW); 
  pinMode(relay2,OUTPUT);
  digitalWrite(relay2, LOW); 
  pinMode(led,OUTPUT);
  pinMode(led2,OUTPUT);
  pinMode(led3,OUTPUT);
}

void loop() {
  digitalWrite(led,LOW);
  digitalWrite(led2,LOW);
  digitalWrite(led3,LOW);
  digitalWrite(relay1,LOW);
  digitalWrite(relay2,LOW);
  butt1.tick();
  butt2.tick();

if(butt1.hasClicks()){
  byte clicks = butt1.getClicks();
  switch(clicks){
    case 1: 
      digitalWrite(led, HIGH);
      gozlemek=10000;
      break;
    case 2: 
      digitalWrite(led2,HIGH);
      digitalWrite(led,LOW);
      gozlemek=20000;
      break;
    }
 }


if(butt2.hasClicks()){
  byte clicks = butt2.getClicks();
  switch(clicks){
    case 1: 
      secmek=1;
      break;
    case 2: 
      secmek=2;
      break;
    case 3:
      secmek=3;
      break;
    }
  }

if(butt3 = HIGH){
  digitalWrite(led3,HIGH);
    switch(secmek){
      case 1:
        digitalWrite(relay1, HIGH);
        break;
      case 2:
        digitalWrite(relay2,HIGH);
        digitalWrite(relay1,LOW);
        break;
      case 3:
        digitalWrite(relay1, HIGH);
        digitalWrite(relay2, HIGH);
        break;
    }
    delay(gozlemek);
 }

}

1 ответ
1

К сожалению, похоже, что ваш код не будет работать.

Последнее условие:

if(butt3 = HIGH){

всегда будет правдой.

Это распространенная ошибка в C и C ++, когда в условии отсутствует один =, что превращается в присваивание.

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

if (HIGH == butt3) {

Другой вопрос — логика:

Пока не будет нажата 3-я кнопка, ваш цикл будет работать постоянно, выключая все светодиоды снова и снова каждую долю секунды, поэтому вы, вероятно, никогда не увидите, как они загорятся, или в лучшем случае увидите ужасное мерцание.

Вам нужен способ сохранить состояние или сбросить светодиоды только после того, как таймер задержки закончится.

Наконец, несколько моментов по чистоте кода:

  • Используйте определения для номеров контактов и дайте им имена собственные:

Вот так:

#define RELAY1_PIN 8
#define RELAY2_PIN 9
#define LED1_PIN   5
#define LED2_PIN   6
#define LED3_PIN   7

#define START_BTN_PIN   5

Это дает несколько преимуществ:

  1. Он экономит оперативную память, не создавая переменных, а на большинстве Arduinos очень мало оперативной памяти.

  2. Использование заглавных букв дает понять, что это константы.

  3. Имена более информативны, поэтому ваш код легче понять.

  4. Нет опасности, что вы случайно измените пин-код где-нибудь в коде.

  • Назовите все переменные на английском языке.
    Может возникнуть соблазн использовать слова из вашего родного языка, но это делает код менее читаемым, и вам будет сложнее помочь вам, если вы разместите его в Интернете.

Я сомневаюсь, что кто-нибудь, читающий этот пост, знает, что gozlemek а также secmek иметь в виду.
Даже люди, говорящие на вашем языке, могут счесть вашу орфографию трудной для понимания, если фактический алфавит вашего языка отличается, и вам нужно составить «латинизированное» написание.

  • Держите свои пространства однородными.
    Хорошей практикой является размещение надлежащего количества интервалов, чтобы люди могли легко идентифицировать различные части кода.

Ардуино и компилятору все равно.

Итак, вместо:

if(butt2.hasClicks()){

написать:

if (butt2.hasClicks()) {

а вместо:

digitalWrite(led2,HIGH);
digitalWrite(led,LOW);
gozlemek=20000;

написать:

digitalWrite(led2, HIGH);
digitalWrite(led, LOW);
gozlemek = 20000;
  • Не переводите, если вам это не нужно.

Этот switch заявление не требуется:

byte clicks = butt2.getClicks();
switch(clicks){
case 1: 
    secmek=1;
    break;
case 2: 
    secmek=2;
    break;
case 3:
    secmek=3;
    break;
} 

потому что ценность, которую вы хотите в secmec совпадает со значением switch проверяет.

Просто сделай это:

secmek = butt2.getClicks();
if (secmek > 3) secmek = 0; //safeguard against too many clicks

  • Проголосовав против чуши «условия Йоды», мы больше не живем в 1980-х. Решение нет написать if(HIGH == butt3), не учите этому людей. Решение состоит в том, чтобы перейти на такой компилятор, как Turbo C, начиная с 1989 года. Затем он предупредит «о возможном неправильном назначении» или «назначении внутри условия». Если ваш компилятор этого не делает, то корень проблемы в том, что вы используете компилятор, который является полным мусором, даже хуже, чем TC 1989 года.

    — Лундин


  • @Lundin вы когда-нибудь работали с Arduino IDE? Думаю, нет, потому что вы не стали бы записывать это или голосовать за меня. Вся концепция разработки Arduino, их руководства по стилю кода, их текущая (не бета 2.0) IDE предназначена для людей, которые не заинтересованы в программировании, а больше в создании. Люди, которые игнорируют предупреждения компилятора. На самом деле, чтобы увидеть эти предупреждения в среде IDE, нужно приложить определенные усилия. По умолчанию они скрыты. Кроме того, что вы имеете против Йоды? Ты тоже ненавидишь малыша Йоду? ;П

    — Лев М.

  • Хорошо, этот сайт о программировании. Просто не учите людей плохим методам, которые устарели более 30 лет назад.

    — Лундин

  • @Lundin хочет объяснить, почему эта практика на самом деле плохая, кроме того, что вам это не нравится с эстетической точки зрения? Где технический, измеримый недостаток? Эта практика гарантирует, что проблемная ошибка, к которой особенно склонны начинающие программисты, остановит компиляцию независимо от того, какой компилятор используется или каковы его настройки. Это не будет генерировать плохую сборку и не сделает код менее читаемым, поэтому, помимо того, что вы дадите вам повод вызвать некоторую ностальгию, в чем именно проблема?

    — Лев М.

  • @Lundin PS этот сайт помогает людям улучшить свой код конструктивными предложениями, которые действительно работают. Я пока не вижу, чтобы вы что-то делали.

    — Лев М.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *