Азбука Ардуино

Модератор: Gnat

Аватара пользователя
SmartAvit
Сообщения: 707
Зарегистрирован: Пн мар 25, 2019 12:10 am
Откуда: Москва

Азбука Ардуино

Сообщение SmartAvit » Пн фев 03, 2020 10:28 am

MOT, Правильно! :good:
А теперь попробуйте вместо переменных поставить оператор подмены #define и посмотрите как изменится размер скетча.
С уважением Владимир.

Аватара пользователя
Andrey.I
Сообщения: 1734
Зарегистрирован: Вт июл 02, 2013 1:21 pm
Откуда: Москва
Контактная информация:

Азбука Ардуино

Сообщение Andrey.I » Пн фев 03, 2020 10:15 pm

Ошибка нашлась, странно, что её при компиляции не видно. Наверное подобные вещи трудно найти, если при написании программы ошибся.
Так же публикую и прячу потом правильный ответ гляну. :)
Изображение

Изображение
С уважением, Андрей

Аватара пользователя
Andrey.I
Сообщения: 1734
Зарегистрирован: Вт июл 02, 2013 1:21 pm
Откуда: Москва
Контактная информация:

Азбука Ардуино

Сообщение Andrey.I » Пн фев 03, 2020 10:21 pm

Глянул, вроде как правильно.
SmartAvit писал(а):
Пн фев 03, 2020 10:28 am
#define и посмотрите как изменится размер скетча.
...а тут без изменений, что то не так?
С уважением, Андрей

Аватара пользователя
MOT
Сообщения: 2278
Зарегистрирован: Сб дек 16, 2017 7:58 pm
Откуда: Россия, Северный Кавказ, Краснодарский край, г.Армавир

Азбука Ардуино

Сообщение MOT » Пн фев 03, 2020 11:25 pm

Andrey.I писал(а):
Пн фев 03, 2020 10:15 pm
Ошибка нашлась, странно, что её при компиляции не видно.
Andrey.I, Андрей я не знаю как в этом компиляторе (может он упрощённый какой-нибудь), но по идее должно быть предупреждение и при согласии дальше компилировать происходит "явное преобразование или сужение типов". Если я не прав - Владимир SmartAvit поправит меня. :)
С уважением, Виктор Евгеньевич
Accept Corp.

Аватара пользователя
SmartAvit
Сообщения: 707
Зарегистрирован: Пн мар 25, 2019 12:10 am
Откуда: Москва

Азбука Ардуино

Сообщение SmartAvit » Вт фев 04, 2020 11:39 pm

Как вы правильно заметили Arduino IDE отслеживает только ошибки синтаксиса скетча, а если вы напишите - byte a = 1000; то Arduino IDE ошибку не заметит, а в случае byte a = 100: будет ошибка.

А теперь рассмотрим числовые переменные и арифметические операции с ними.

В не так давно мы рассматривали пример в котором переменная увеличивала свое значение на 100, Period = Period +100 при прохождение этой строки в скетче переменная увеличивается на 100 (было 200 стало 300 далее при следующем цикле 400, 500 и т.д.)

Строка начинается с переменной Period далее идет знак присвоения значения, далее идет число или выражение Period +100 которое присваивается переменной Period, в результате в следующем цикле переменная Period имеет значение на 100 больше.

Знак равно в данном случае выполняет операцию присваивания, он присваивает переменной Period новое значение, определяемое тем, что находится между знаком равенства и точкой с запятой Period +100.

В нашем случае переменной (Period), будет присвоено (=) значение определяемое как значение старого значения +100.

Надеюсь я доступно объяснил операцию присвоения переменной нового значения.

Давайте попробуем при помощи Arduino преобразовать температуру из Цельсия в Фаренгейт для чего исходное значение температуры нужно умножить на 9 далее разделить на 5 и прибавить 32.

void setup()
{
Serial.begin(9600); // Настройка скорости порта
int temp_C = 256;// Присвоение значения переменной название переменной можно записывать так для наглядности
int temp_F = temp_C *9/5+ 32;
Serial.println(temp_F); // Вывод в окно Serial Monitor значения вычисления
}
void loop()
{}

Попробуйте написать скетч для обратного преобразования градусов - Фаренгейт в Цельсия

Обратите внимание на строчку

int temp_C = 256;

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

int temp_C;

temp_C = 256;

также и в этой строке

int temp_F = temp_C *9/5+ 32;

или

int temp_F;

temp_F = temp_C *9/5+ 32;

Первый вариант более продвинутый )

Каждая переменная объявляется всего один раз

int temp_C;

int temp_F;

в нашем случае это переменные int c именем temp_C и temp_F

Но самим переменным можно сколько угодно присваивать новые значения

temp_C = 256;
temp_C = 2;
temp_C = -1000;
temp_C = С+1;

Для понимания приоритета выполнения арифметических вычислений можно написать так
temp_F= ((temp_C*9)/5)+32;

Сложная задача попробуйте самостоятельно сделать скетч в котором будет идти циклическое преобразование температуры из Цельсия в Фаренгейт от абсолютного нуля с шагом в 10 градусов и данные будут выводится в окно Serial Monitor.
С уважением Владимир.

Аватара пользователя
Andrey.I
Сообщения: 1734
Зарегистрирован: Вт июл 02, 2013 1:21 pm
Откуда: Москва
Контактная информация:

Азбука Ардуино

Сообщение Andrey.I » Ср фев 05, 2020 1:20 am

Попробовал на практике полученные знания реализовать. Остался кусочек ленты RGB (делал на даче подсветку), блок питания 12В 5А нашелся в хозяйстве, подкупил транзисторы IRF520. Спаял, за недолгое время, транзисторный ключ на три канала. Сему ключа содрал с китайского модуля
Изображение
и подключил к Ардуинки. Заработало! Можно сказать лабораторную работу провел. :)
Скетч
int pin1 = 8;
int pin2 = 9;
int pin3 = 10;

void setup()
{

pinMode(pin1,OUTPUT);
pinMode(pin2,OUTPUT);
pinMode(pin3,OUTPUT);
}

void loop()
{

digitalWrite(pin1,HIGH);
digitalWrite(pin2,LOW);
digitalWrite(pin3,LOW);

delay(500);
digitalWrite(pin2,HIGH);
delay(500);
digitalWrite(pin1,LOW);
delay(500);
Было бы не плохо регулировать яркость, тогда на RGB ленте можно сделать плавные переходы одних цветов в другие.


Лента яркая, камеру телефона засвечивает.
SmartAvit,
С задачкой думаю к завтрашнему вечеру справлюсь, сегодня уже отдыхать надо. :)
С уважением, Андрей

Аватара пользователя
Andrey.I
Сообщения: 1734
Зарегистрирован: Вт июл 02, 2013 1:21 pm
Откуда: Москва
Контактная информация:

Азбука Ардуино

Сообщение Andrey.I » Ср фев 05, 2020 10:37 am

Скетч под спойлером неверный. вечером поправлю.
С уважением, Андрей

Аватара пользователя
SmartAvit
Сообщения: 707
Зарегистрирован: Пн мар 25, 2019 12:10 am
Откуда: Москва

Азбука Ардуино

Сообщение SmartAvit » Ср фев 05, 2020 12:32 pm

Andrey.I, Круто получилось, как дойдём до урока ШИМ будет плавный переход и больше цветов можно будет получить
С уважением Владимир.

Аватара пользователя
SmartAvit
Сообщения: 707
Зарегистрирован: Пн мар 25, 2019 12:10 am
Откуда: Москва

Азбука Ардуино

Сообщение SmartAvit » Ср фев 05, 2020 7:28 pm

В языке С++ очень много команд которые понимает Arduino, давайте рассмотрим некоторые из них и как они работают в скетче.

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

Если же нам нужно выполнение определенных строк программы при определенных условиях мы можем использовать команду if .

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

int Led = 13;
int Period = 10;

void setup()
{
pinMode(Led, OUTPUT);
}

void loop()
{
digitalWrite(Led, HIGH);
delay(Period);
digitalWrite(Led, LOW);
delay(Period);
Period = Period + 10;
if (Period > 500) // Если период больше 500
{
Period = 10; // Присваиваем периоду значение 10
}
}

Проверяется условие если переменная if (Period > 500) больше 500 выполняются команды в фигурных скобках, переменной Period = 10; снова присваивается значение 10 и цикл повторяется с начала пока значение переменной Period не станет снова больше 500.

Операторы можно использовать

< меньше
> больше
<= меньше или равно
>= больше или равно
== равно
!= не равно

Урок простой надеюсь всем всё понятно.

Попробуйте самостоятельно сделать этот скетч с переменной частотой мигания для шести светодиодов.
С уважением Владимир.

Аватара пользователя
Andrey.I
Сообщения: 1734
Зарегистрирован: Вт июл 02, 2013 1:21 pm
Откуда: Москва
Контактная информация:

Азбука Ардуино

Сообщение Andrey.I » Ср фев 05, 2020 10:28 pm

Andrey.I писал(а):
Ср фев 05, 2020 10:37 am
Скетч под спойлером неверный. вечером поправлю.
Теперь верный :)
int pin1 = 8;
int pin2 = 9;
int pin3 = 10;

void setup()
{

pinMode(pin1,OUTPUT);
pinMode(pin2,OUTPUT);
pinMode(pin3,OUTPUT);
}

void loop()
{

digitalWrite(pin1,HIGH);
digitalWrite(pin2,LOW);
digitalWrite(pin3,LOW);

delay(500);
digitalWrite(pin2,HIGH);
delay(500);
digitalWrite(pin1,LOW);
delay(500);
digitalWrite(pin3,HIGH);
delay(500);
digitalWrite(pin2,LOW);
delay(500);
digitalWrite(pin1,HIGH);
delay(500);
digitalWrite(pin3,LOW);
}
С уважением, Андрей

Аватара пользователя
BazilVV
Сообщения: 639
Зарегистрирован: Пт сен 15, 2017 11:34 am

Азбука Ардуино

Сообщение BazilVV » Чт фев 06, 2020 12:06 am

SmartAvit писал(а):
Ср фев 05, 2020 7:28 pm
Попробуйте самостоятельно сделать этот скетч с переменной частотой мигания для шести светодиодов.
А я на этом остановился, дальше не пошел, это еще не разглядывал :( . Написал себе алгоритм (похожий на ваш) но мигает не так как прошу, длинный скетч, но кое что получается. Времени маловато и спать хочется :D .
Василий Васильевич. Моя галерея.
ЗЫ: Я сторонник жесткой модерации в тематических ветках.

Аватара пользователя
Andrey.I
Сообщения: 1734
Зарегистрирован: Вт июл 02, 2013 1:21 pm
Откуда: Москва
Контактная информация:

Азбука Ардуино

Сообщение Andrey.I » Чт фев 06, 2020 2:05 am

SmartAvit писал(а):
Вт фев 04, 2020 11:39 pm
попробуйте самостоятельно сделать скетч в котором будет идти циклическое преобразование температуры из Цельсия в Фаренгейт от абсолютного нуля с шагом в 10 градусов и данные будут выводится в окно Serial Monitor.
Попробовал
Изображение
Если объявлена переменная int очень быстро число доходит до граничного значения и начинают выводится отрицательные значения температуры по Фаренгейту. Как раз этот момент у меня на скриншоте.
С переменной лонг попробовал, там ждать долго, два с лишним миллиарда всё таки :) но если шаг сделать 1000000, то как раз быстренько до обнуления дойдем. :) Попробовал усложнить задачку, выводить так, чтобы каждому значению С соответствовало своё значение F, получилось.
С уважением, Андрей

Аватара пользователя
Andrey.I
Сообщения: 1734
Зарегистрирован: Вт июл 02, 2013 1:21 pm
Откуда: Москва
Контактная информация:

Азбука Ардуино

Сообщение Andrey.I » Чт фев 06, 2020 9:17 am

BazilVV писал(а):
Чт фев 06, 2020 12:06 am
А я на этом остановился, дальше не пошел
Василий Васильевич, догоняйте, а то кто будет подсказывать, если вдруг что не получиться. :beer: :)
Парни, если, кто просто читает и думает, что всё понятно и всё получится. Будьте уверены, это не так. Обязательно нужна практика, нужно пробовать самостоятельно делать, чтобы прошло через руки и голову. Это также, как с усилителем Юрия Васильевича, пока читаешь всё понятно, а как только начинаешь делать куча вопросов.
С уважением, Андрей

Аватара пользователя
Andrey.I
Сообщения: 1734
Зарегистрирован: Вт июл 02, 2013 1:21 pm
Откуда: Москва
Контактная информация:

Азбука Ардуино

Сообщение Andrey.I » Пт фев 07, 2020 12:23 am

SmartAvit писал(а):
Ср фев 05, 2020 7:28 pm
Попробуйте самостоятельно сделать этот скетч с переменной частотой мигания для шести светодиодов.
Владимир, я правильно Вас понял? Так должно получится?


Скетч:
int Led_1 = 13;
int Led_2 = 12;
int Led_3 = 10;
int Led_4 = 9;
int Led_5 = 8;
int Led_6 = 7;
int Period = 10;

void setup()
{
pinMode(Led_1, OUTPUT);
pinMode(Led_2, OUTPUT);
pinMode(Led_3, OUTPUT);
pinMode(Led_4, OUTPUT);
pinMode(Led_5, OUTPUT);
pinMode(Led_6, OUTPUT);
}

void loop()
{
digitalWrite(Led_1, HIGH);
delay(Period);
digitalWrite(Led_1, LOW);
delay(Period);
digitalWrite(Led_2, HIGH);
delay(Period);
digitalWrite(Led_2, LOW);
delay(Period);
digitalWrite(Led_3, HIGH);
delay(Period);
digitalWrite(Led_3, LOW);
delay(Period);
digitalWrite(Led_4, HIGH);
delay(Period);
digitalWrite(Led_4, LOW);
delay(Period);
digitalWrite(Led_5, HIGH);
delay(Period);
digitalWrite(Led_5, LOW);
delay(Period);
digitalWrite(Led_6, HIGH);
delay(Period);
digitalWrite(Led_6, LOW);
delay(Period);
Period = Period + 10;
if (Period > 200) // Если период больше 200
{
Period = 10; // Присваиваем периоду значение 10
}
}
С уважением, Андрей

Аватара пользователя
SmartAvit
Сообщения: 707
Зарегистрирован: Пн мар 25, 2019 12:10 am
Откуда: Москва

Азбука Ардуино

Сообщение SmartAvit » Пт фев 07, 2020 4:10 am

Andrey.I, Андрей отлично, все правильно и видео с треком отличное. :good:
С уважением Владимир.

Ответить

Вернуться в «Усилители»