Первая программа

Всем привет. Написал свою первую программу, которая считает от ноля до пяти и обратно. Подскажите на сколько код корректный? Где и что можно улучшить? Так то всё работает. И ещё вопрос, почему в цикле for изменение указывается в условии, а в цикле while в самом цикле? Заранее спасибо.

#include <GyverOLED.h>

GyverOLED<SSD1306_128x32, OLED_NO_BUFFER> oled;

int x = 0;  //объявление переменной

void setup() {
  oled.init();           // инициализация
  oled.clear();          // очистка
  oled.setScale(3);      // масштаб текста (1..4)
  oled.home();           // курсор в 0,0
  oled.print("Старт!");  // написать "Старт!"
  delay(1000);           // подождать секунду

  while (x < 5) {       // цикл выполняется, пока x меньше 5
    oled.clear();       // очистка
    oled.home();        // курсор в 0,0
    oled.print(x);      // написать результат
    delay(1000);        // подождать секунду
    x++;                // изменение переменной на одну единицу
    if (x == 5) break;  // цикл прерывается, когда x=5
  }

  for (x > 4; x >= 0; x--) {  // цикл выполняется, пока x больше 4
    oled.clear();             // очистка
    oled.home();              // курсор в 0,0
    oled.print(x);            // написать результат
    delay(1000);              // подождать секунду
    if (x == 0) break;        // цикл прерывается, когда x=0
  }

  oled.clear();        // очистка
  oled.home();         // курсор в 0,0
  oled.print("Всё!");  // написать "Всё!"
}
void loop() {
}

а если замаркировать 21 и 29 строку, работает?

1 лайк

А это что за конструкция?

Да, работает.

Пытался описать условия для обратного отсчёта, чтоб дойдя до ноля программа не начинала считать от 255. Тащемта 21 и 29 строки там появились по той же причине.

А почему там, где должно быть присвоение начального значения, у вас стоит оператор сравнения?

Это костыли. Конкретно в этом коде они не нужны - достаточно правильно указать условия

1 лайк

Тогда как правильно указать условия, так? for (x = 5; x >= 0; x--)

Именно так )

По большому счету там for() не нужен, достаточно и while()

Тут нет “условий” во множественном числе, условие одно - в центре, x>=0. В цикле for только одно условие.
А первый член в скобке это не условие, а присваивание.

1 лайк

Фу таким быть! С чего? Это выражение может быть каким угодно, совершенно не обязательно присваиванием. Хоть Serial.print туда засунь :slight_smile:

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

Если у него нет побочных эффектов. А если есть, то может и влиять, почему нет?

Вот, кстати,

примерчик с побочным эффектом
#define printVarLn(x) do { Serial.print(#x "="); Serial.println(x); } while (false)

//
// Проверка связи с внешним модулем (его готовности принимать информацию)
// Внешний модуль, соединён с pin и ожидает на нём высокого уровня.
// Увидев высокий уровень, он должен приготовиться к приёму информации и,
// по готовности, но не ранее, чем через 150мкс после получения высокого уровня,
// (это время работы pinMode с небольшим запасом) положить пин в низкий уровень. 
// Если он это сделает в течение timeout мс, всё нормально. Если нет, то функция 
// вернёт false (внешний модуль не доступен или не готов)
//
bool handShaking(const uint8_t pin, const uint32_t timeout = 256) {
   pinMode(pin, OUTPUT);
   const uint32_t start = millis();
   digitalWrite(pin, HIGH);
   for (pinMode(pin, INPUT_PULLUP); digitalRead(pin) && millis() - start < timeout; yield());
   return ! digitalRead(pin);
}

void setup(void) {
   Serial.begin(9600);
   printVarLn(handShaking(10));
}

void loop(void) {}
1 лайк