Учусь программировать с нуля. Нужна помощь.

Dan_co

✩✩✩✩✩✩✩
1 Май 2020
15
1
Привет
Я только только взял в руки ардуино и начал изучать программирование прям с нуля нулёвого.
Сделал себе простейшую схему с тремя светодиодами, кнопкой и зуммером.
На этой схеме изучаю все простейшие функции, синтаксис и все что нужно с самого начала.
В момент инициализации происходит три коротких пика зуммером, светодиоды переключаются по очереди с кнопки. Хочу сопроводить каждое нажатие кнопки, переключающее режим, коротким звуковым сопровождением, но в разделе LOOP зуммер пищит бесконечно, потому что цикл выполняется бесконечно.

Не понимаю как прервать зуммер и нужно ли это делать в разделе LOOP.
Если кто может - напишите кусочек кода как это сделать, теорию я не понимаю, только примеры((
СПАСИБО.

const int RLED = 8;
const int BLED = 7;
const int YLED = 4;
const int BUTT = 2;
const int ZOOM = 9;
boolean lastButton = LOW;
boolean currentButton = LOW;
int ledMode = 0;
void setup() {
pinMode (RLED, OUTPUT);
pinMode (BLED, OUTPUT);
pinMode (YLED, OUTPUT);
pinMode (BUTT, INPUT);
pinMode (ZOOM, OUTPUT);
digitalWrite (ZOOM, HIGH);
delay(50);
digitalWrite (ZOOM, LOW);
delay(50);
digitalWrite (ZOOM, HIGH);
delay(50);
digitalWrite (ZOOM, LOW);
delay(50);
digitalWrite (ZOOM, HIGH);
delay(50);
digitalWrite (ZOOM, LOW);
}
boolean debounce(boolean last)
{
boolean current = digitalRead(BUTT);
if (last != current)
{
delay(5);
current = digitalRead(BUTT);
return current;
}

}

void setMode(int mode)
{
// Красный
if (mode == 1)
{
digitalWrite(RLED, LOW);
digitalWrite(BLED, LOW);
digitalWrite(YLED, LOW);

}
// Синий
else if (mode == 2)
{
digitalWrite(RLED, HIGH);
digitalWrite(BLED, LOW);
digitalWrite(YLED, LOW);

}
// Желтый
else if (mode == 3)
{
digitalWrite(RLED, LOW);
digitalWrite(BLED, HIGH);
digitalWrite(YLED, LOW);
}

else
{
digitalWrite(RLED, LOW);
digitalWrite(BLED, LOW);
digitalWrite(YLED, HIGH);
}
}
void loop ()
{
currentButton = debounce(lastButton);
if (lastButton == LOW && currentButton == HIGH)
{
ledMode++;
}
lastButton = currentButton;

if (ledMode == 4)
ledMode = 0;
setMode(ledMode);

}
 

Вложения

kalobyte

★★★✩✩✩✩
1 Янв 2020
741
158
isHolded() срабатывает на длинное нажатие, тебе там надо функцию isClick() использовать из той библиотеки
state хранит номер состояния конечного автомата и обрабатывается только при нажатии кнопки
так же туда помещена функция генерации звука


C++:
if (butt1.isHolded())
    {
        if (state == 2)
        {
            state = 0;
        }
        else
        {
            state++;
        }
        
        tone(BEEPER_PIN, 500, 100);
        
        set_mode();
    }

void set_mode()
{
    switch (state)
    {
    case 0: set_select();
        break;
    case 1: set_input();
        break;
    case 2: set_tab();
        break;
    }
}

void set_select(void)
{
    Serial.println("set mode 0 - value and select ctrl+A"); //
    digitalWrite(LED_SELECT_PIN, HIGH);
    digitalWrite(LED_INPUT_PIN, LOW);
    digitalWrite(LED_TAB_PIN, LOW);
}

void set_input(void)
{
    Serial.println("set mode 1 - value and input"); //
    digitalWrite(LED_SELECT_PIN, LOW);
    digitalWrite(LED_INPUT_PIN, HIGH);
    digitalWrite(LED_TAB_PIN, LOW);
}

void set_tab(void)
{
    Serial.println("set mode 2 - value and tabulator "); //
    digitalWrite(LED_SELECT_PIN, LOW);
    digitalWrite(LED_INPUT_PIN, LOW);
    digitalWrite(LED_TAB_PIN, HIGH);
}
воспользуйся библиотекой для кнопок

недавно делал тут одному человеку код и там была как раз такая задача
 
Последнее редактирование:

Dan_co

✩✩✩✩✩✩✩
1 Май 2020
15
1
я уже скачал, я там ничего не понимаю( программирую 2 дня((
 

Старик Похабыч

★★★★★✩✩
14 Авг 2019
1,741
429
Москва
Потому что setMode у тебя вызывается всегда, при каждом прогоне loop, соотв. светодиоды тоже выключенные выключаются, включенные включаются опять.
C++:
void loop ()
{
static int old_ledMode=-1;
   
currentButton = debounce(lastButton);
if (lastButton == LOW && currentButton == HIGH)
{
ledMode++;
}
lastButton = currentButton;

if (ledMode == 4)
ledMode = 0;
if (old_ledMode!=ledMode)
{
setMode(ledMode);
old_ledMode!=ledMode;  
}

}
а теперь добавляй писк как хотел
 

Dan_co

✩✩✩✩✩✩✩
1 Май 2020
15
1
else if (mode == 2)
{
digitalWrite(RLED, HIGH);
digitalWrite(BLED, LOW);
digitalWrite(YLED, LOW);
digitalWrite (ZOOM, HIGH);
delay(50);
digitalWrite (ZOOM, LOW);

все равно пищит бесконечно(
вставил внизу то что ты отправил
 

Dan_co

✩✩✩✩✩✩✩
1 Май 2020
15
1
верхнюю часть сообщения не заметил, спасибо, попробую

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

kalobyte

★★★✩✩✩✩
1 Янв 2020
741
158
нет никаких банков простейших кодов, есть алгоритмы и паттерны проектирования
правда мало где об этом говорят на понятном языке с картинками

а так есть немного алгоритмов и за 2 дня программирования ты ничего не осилиш
это физически невозможно

математика тут тебе вообще не нужна и никаким боком твои школьные знания тебе не помогут
 
  • Лойс +1
Реакции: MrBob

Dan_co

✩✩✩✩✩✩✩
1 Май 2020
15
1
нет никаких банков простейших кодов, есть алгоритмы и паттерны проектирования
правда мало где об этом говорят на понятном языке с картинками

а так есть немного алгоритмов и за 2 дня программирования ты ничего не осилиш
это физически невозможно

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

Dan_co

✩✩✩✩✩✩✩
1 Май 2020
15
1
@Dan_co, На сколько понимаешь возможности языка программирования С++?
Не знаю как ответить на твой вопрос.
если разобраться - можно все что угодно делать
я после видосов с ютюба пришел

UP
кажись вообще ничего не понимаю=))
 
  • Лойс +1
Реакции: MrBob

kalobyte

★★★✩✩✩✩
1 Янв 2020
741
158
просто у меня проблема с теорией
теорией чего? тут нет никаких теорий, просто за 2 дня только синтаксис можно немного понять
причем есть синтаксис языка, а есть синтаксис фреймворка ардуино, где есть много готовых штук и чтобы их использовать и понимать - надо прочитать мануал по этим функциям
мануал там плохой, без примеров кода
 

Wan-Derer

★★★★✩✩✩
Команда форума
31 Июл 2018
1,458
295
Москва
wan-derer.ru
@Dan_co, заголовок темы должен отражать содержимое. До исправления тема будет закрыта для ответов. Если не исправишь, тема будет удалена
 

Dan_co

✩✩✩✩✩✩✩
1 Май 2020
15
1
Для тех, кто любит возиться с новичками.
Всем привет, продолжаю учиться программированию с нуля
Есть несколько вопросов

Первое:
C++:
int8_t data;       

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

}
void loop() {
  if (Serial.available() > 0)
  {
    data = Serial.read();
    Serial.println("Got it");
  }
  }
В монитор порта выводится
Got it
Got it
вместо одного раза.

Второе:
C++:
char data;

void setup ()
{
  Serial.begin(9600);
}

void loop () {
  if (Serial.available() > 0)
  {
    data = Serial.read();
  }

  if (data > 5)
  {
    Serial.println("More");
  }
  else
  {
    Serial.println("nope");
  }
}
Объясните
1) Почему до ввода значения в порт сразу же появляется "Nope";
2) После ввода значения >5 порт пишет "More", и больше не меняется, даже если отправить значение <5;
3) Почему ответы выводятся бесконечно и как сделать так чтобы это происходило один раз. Самый важный вопрос, не могу этого понять на глобальном уровне (как выполнить цикл один раз и на этом закончить, общаться с портом, получать ответы на вводимые значения).

Дай бог терпения отвечающим
Большое спасибо!

P.S. Если напишите код - я пойму лучше и поиграю с ним чтобы изучить=)
 

Старик Похабыч

★★★★★✩✩
14 Авг 2019
1,741
429
Москва
По первой части кода:
в конце строки есть символ конца строки. может быть и символ перевода строки. в мониторе порта рядом со скоростью слева есть выбор конца строки.

Вторая часть
1) Код
if (data > 5)
{
Serial.println("More");
}
else
{
Serial.println("nope");
}
Выполняется всегда , вне зависимости от состояния доступности ввода или нет. Собственно это ответ и на 3-ий вопрос

2) в дату ты получаешь не число 5, а символ 5. и код любого вводимого символа буде всегда больше 5
 
  • Лойс +1
Реакции: MrBob

Dan_co

✩✩✩✩✩✩✩
1 Май 2020
15
1
По первой части кода:
в конце строки есть символ конца строки. может быть и символ перевода строки. в мониторе порта рядом со скоростью слева есть выбор конца строки.

Вторая часть
1) Код
if (data > 5)
{
Serial.println("More");
}
else
{
Serial.println("nope");
}
Выполняется всегда , вне зависимости от состояния доступности ввода или нет. Собственно это ответ и на 3-ий вопрос

2) в дату ты получаешь не число 5, а символ 5. и код любого вводимого символа буде всегда больше 5
Я понимаю что он выполняется всегда, каким условием воспользоваться чтобы он не делал так?

Как отправить число 5 а не символ? Указать систему счисления? Поменять тип переменной?
Спасибо.
 

Старик Похабыч

★★★★★✩✩
14 Авг 2019
1,741
429
Москва
1) условие у тебя стоит. но ты не верно расставил программные скобки { и }. вернее даже только }
2) тип данных тут не причем. для простоты сравни не с 5 а с символом '5'. А так есть специальная функция для получения числе. parserInt, см https://doc.arduino.ua/ru/prog/Serial/ParseInt
 
  • Лойс +1
Реакции: MrBob

Dan_co

✩✩✩✩✩✩✩
1 Май 2020
15
1
1) условие у тебя стоит. но ты не верно расставил программные скобки { и }. вернее даже только }
2) тип данных тут не причем. для простоты сравни не с 5 а с символом '5'. А так есть специальная функция для получения числе. parserInt, см https://doc.arduino.ua/ru/prog/Serial/ParseInt
Скажи пож где их нужно поставить?
 

Старик Похабыч

★★★★★✩✩
14 Авг 2019
1,741
429
Москва
Так не пойдет. Ты тут сам подумай.
А я немного помогу
Вот у тебя условие.
if (Serial.available() > 0)
как ты думаешь, что это значит?
и если условие выполняется какой фрагмент кода она выполнит?
 

Dan_co

✩✩✩✩✩✩✩
1 Май 2020
15
1
Так не пойдет. Ты тут сам подумай.
А я немного помогу
Вот у тебя условие.
if (Serial.available() > 0)
как ты думаешь, что это значит?
и если условие выполняется какой фрагмент кода она выполнит?
Если в буфере (?) больше чем ноль бит, то ... ничего, в фигурных скобках у меня присвоение data = значение вводимое в монитор порта и все, скобки закрываются. Получается в этих скобках должен быть код на выполнение? Но дальше у меня так же условия. Нужно if (Serial.available() > 0, data>5), а data = Serial.read(); вынести куда нибудь наверх?
 

Старик Похабыч

★★★★★✩✩
14 Авг 2019
1,741
429
Москва
упростим. условие проще описать так: если в буфере(все верно) порта что то есть и не важно сколько (там не биты, а байты) то делаем то, что в фигурных (операторных) скобках: ты читаешь буфер и его содержимое помещаешь в переменную data
Переменная data есть всегда, если в нее ничего не поместить , то она будет равна '' (это 2 одинарные кавычки, а не 1 двойная)
А потом условие заканчиается.
И начинается другое
f (data > 5)
data изначально больше 5 ? data пустая, значит нет, - выполняется else
и повторный круг loop
как только ты вводишь что то, то это что то помещается в data, и будет всегда больше 5.
И опять по кругу
 

Старик Похабыч

★★★★★✩✩
14 Авг 2019
1,741
429
Москва
как записать 2 условия.
можно так:
if ((a==2)and(b==1))
{
код будет выполняться если a равно 2 и в то же время b равно 1
}
and можно заменить на &
or можно заменить на |
xor на ^
not на !
посмотри разницу между & и && и пр.


другой вариант
if (a==2)
{
код будет выполняться если a равно 2
if (b==1)
{
код будет выполняться если b равно 1 и при этом уже выполняется условие №1
}
код будет выполняться если a равно 2
}