Вопрос по скетчу

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

Я не могу понять нескольких вещей в коде. Вот например :

void loop() {
// put your main code here, to run repeatedly:
val = digitalRead (BUTTON);
if ((val = HIGH) && (old_val = LOW)) {
state = 1 - state;
startTime = millis();
delay (10);

  1. В переменную val попадает значение нажата кнопка или нет. К примеру она нажата, тогда здесь верно if ((val = HIGH) && (old_val = LOW) { . После нее в переменную state попадает каким то образом из выражения if ((val = HIGH) && (old_val = LOW) { то есть state = 1 - 1 и state = 0. Сама переменная state стандартная для ардуино, что она каким то чудом получила в себя данные от оператора if ??
  2. startTime = millis(); Я не могу понять следуюий момент. НАпрмер при первом проходе петли millis отдает значение 300 мл.сек и сравнивает это значение с переменной startTime и получается что оно тоже приобретает значение 300. Тогда зачем их в этой строке вычитают друг из друга. Если с большой долей вероятности результат будет 0 ??

const int LED = 9;
const int BUTTON = 7;
int val = 0;
int old_val = 0;
int state = 0;
int brightness = 128;
unsigned long startTime = 0;

void setup() {
// put your setup code here, to run once:
pinMode (LED, OUTPUT);
pinMode (BUTTON, INPUT);
}

void loop() {
// put your main code here, to run repeatedly:
val = digitalRead (BUTTON);
if ((val = HIGH) && (old_val = LOW)) {
state = 1 - state;
startTime = millis();
delay (10);
}
if ((val = HIGH) && (old_val = HIGH)) {
if (state == 1 && (millis() - startTime) > 500) {
brightness++;
delay(10);

if (brightness > 255) {
brightness = 0;
}
}
}
old_val = val;
if (state == 1) {
analogWrite (LED, brightness);
} else {
analogWrite (LED, 0);
}
}

Первое, что вам нужно понять:

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

1 лайк

Во-первых, если вы хотите обсудить скетч, приводите его ПОЛНОСТЬЮ. Куски что вы цитируете - по-отдельности не имеют смысла, так как переменные возникают ниоткуда.

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

На будущее буду использовать. Не нашел кнопку редактировать.

А сейчас ?



не “на будущее”, а прямо сейчас. Иначе на помощь не рассчитывайте.

Спрошу где нибудь еще. Сначала придумайте кнопку редактировать. Чтобы текст можно было форматировать.

Ты бы сначала читать научился, что тебе перед носом пишут!
Что не понятного тут?

Вы третий раз игнорируетте мой вопрос. ГДЕ КНОПКА РЕДАКТИРОВАТЬ У ПЕРВОГО ТОПИКА. чтобы взять и поменять содержимое и форматировать текст

Справа под сообщением. Возможно в вашем браузере она спрятана под тремя точками * * *
Вообще ни у кого больше проблем с редактированием не возникает, так что, как говорят англичане, “проблема на вашей стороне”.

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

Сравните, например, эту строчку из книжки с тем что у вас в скетче
code2

Обратите внимание, что = и == это СОВСЕМ не одно и то же.

С опечаткой понятно. Возможно когда писал сюда не копировал. И сделал опечатку. В IDE код загрузился в ардуино, соотвественно был скопилирован. Но у меня был вопрос не в работе самого скейтча. А в логике его работы.

Скорее всего у новичков её нет вообще.

Вставьте правильно оформленный код новым сообщением в этой теме.

одной? - она у вас повторяется шесть раз

1 лайк

Нет у меня не звездочек, не другого функционала позволяющего редактирвоать свои же топики.


Хорошо. Отлично. Но суть вопроса не поменялся никак :slight_smile: Я только пару дней назад начал изучать. Понятно что большинство из вас работает с ардуино годами. И режет глаз простые ошибки. НО мне нужен ответ на мой вопрос, а не “замечать ошибки орфографии”

То, что код компилируется - совершенно не означает, что он будет работать так, как задумано.
Например разницу между =и == компилятор ошибкой не считает и вам ее не подскажет.

ваш вопрос с этой опечаткой просто не имеет смысла. Вы обьяснения какой логики хотите - с одинарным или двойным “равно”? - она разная

я понял спасибо. буду впредь аккуратнее и проверять. НО вопрос по логике так и остался у меня.

  1. В переменную val попадает значение нажата кнопка или нет. К примеру она нажата, тогда здесь верно if ((val = HIGH) && (old_val = LOW) { . После нее в переменную state попадает каким то образом из выражения if ((val = HIGH) && (old_val = LOW) { то есть state = 1 - 1 и state = 0. Сама переменная state стандартная для ардуино, что она каким то чудом получила в себя данные от оператора if ??

  2. startTime = millis(); Я не могу понять следуюий момент. НАпрмер при первом проходе петли millis отдает значение 300 мл.сек и сравнивает это значение с переменной startTime и получается что оно тоже приобретает значение 300. Тогда зачем их в этой строке вычитают друг из друга. Если с большой долей вероятности результат будет 0 ??

const int LED = 9;
const int BUTTON = 7;
int val = 0;
int old_val = 0;
int state = 0;
int brightness = 128;
unsigned long startTime = 0;

void setup() {
// put your setup code here, to run once:
pinMode (LED, OUTPUT);
pinMode (BUTTON, INPUT);
}

void loop() {
// put your main code here, to run repeatedly:
val = digitalRead (BUTTON);
if ((val = HIGH) && (old_val = LOW)) {
state = 1 - state;
startTime = millis();
delay (10);
}
if ((val = HIGH) && (old_val = HIGH)) {
if (state == 1 && (millis() - startTime) > 500) {
brightness++;
delay(10);

if (brightness > 255) {
brightness = 0;
}
}
}
old_val = val;
if (state == 1) {
analogWrite (LED, brightness);
} else {
analogWrite (LED, 0);
}
}