Уроки Arduino для начинающих, #2.1, Основы языка C
HTML-код
- Опубликовано: 19 авг 2024
- 🐾Желающим оказать материальную поддержку.
www.donationale...
🐾Уроки Arduino для начинающих, #2.1, разбираемся с типами данных, переменными и прочей не интересной ерундою.
🐾Блокнот программиста Arduino:
arduinolab.pw/w...
#программирование #arduino #ардуино #уроки
Спасибо, мне лично очень нравится ваше объяснение, все подробно, большое спасибо за видео, лайк!
Вообще это очень важные и интересные темы!Спасибо что вы снимаете про них!
Очень нравится подача материала, надеюсь на продолжение.
Спасибо за ваш труд.
И снова СУПЕР! ! ! так держать) ждем продолжения.
Супер! то что нужно. Продолжай. Я хоть уже и знаю основы, но новое для себя тоже нахожу. А дальше думаю будет для меня вообще все новое. Жду продолжения.
17:01 Думаю, правильнее сказать, что их отличие в том что цикл while выполняется пока условие истинно, в то время как цикл for привязан к счетчику, опять же количество итераций цикла for гораздо проще отследить, не используя дополнительные переменные, в отличие от цикла while, где какой-либо счетчик придётся создавать отдельно. Если вы точно знаете сколько раз вам потребуется выполнить какое-то действие, используйте for, в ином случае - while.
Дополню немного. В цикле switch условие default можно не заканчивать операндом break, в отличие от case. Не помню как в Arduino IDE, а во взрослой среде разработке AVR Studio если пропустишь break, то компилятор будет ругаться.
По циклу if. У него может быть несколько else. Например
if(a == 0){
Serial.println(F("0"));
}
else if (a == 1){
Serial.println(F("1"));
}
else if (a == 2){
Serial.println(F("2"));
}
Получается эдакий switch. Но в отличие он него в цикле if программа будет проходить по всем else if в не зависимости нашли совпадение ранее или нет.
По переменным. Если в цикле объявить переменную, то она будет сохранять свое состояние только в нем. Если же необходимо сохранять состояние переменной всегда, то объявлять ее нужно с операндом static.
void TimeIntervals(){
static unsigned long LoopLCDLightTime;
if(millis() > (LoopLCDLightTime + 10000)){ // Выключение подсветки экрана
Serial.println("Light LCD off");
LoopLCDLightTime = millis();
lcd.noBacklight();
lcd.noDisplay();
}
}
}
Очень хорошо что приводите примеры из С++ , каждый Ардуинщик рано или поздно захочет придти к нему.
Это С, а не С++
@@JekaM5 откуда в С ООП? Это самый что ни на есть С++
@@lvanovlvan Где в этом видео ООП? В данном конкретном видео примеры на С.
@@JekaM5 Ардуино IDE = C++, библиотеки - суть классы, классы == ООП. Хотя и язык ардуино - производная от С++.
Спорить не собираюсь, можешь оставаться при своем мнении.
@@lvanovlvan Я прекрасно знаю, что в Arduino IDE есть C++ c ООП, классами, наследованием и т.д. Смотри внимательно, на какой комментарий я изначально отвечал. Это был комментарий Дениса Лазовского - "Очень хорошо что приводите примеры из С++". Мой ответ на его комментарий: в ЭТОМ ВИДЕО нет примеров из С++, это обычный С. Про Arduino IDE, Wiring, и библиотеки я ни слова не сказал, это ты уже сам додумал. Ещё раз: исходный код, который мы видим в этом видео - на языке С.
*Хорошие уроки👍🏼👍🏼👍🏼*
Спасибо, приятно было вспомнить начальный курс программиста))
Отлично Мастер! Продолжай в том же духе. Только не останавливайся, побольше про С++ , это основа, это фундамент для всех, дальнейших уроков. У тебя все получится!
С и С++ это разные языки.
Спасибо!
Сэр да вы профэшионал СПАСИБО очень доступно 👍👍👍👍💪💪💪💪✨🎇🎆🥇🏅🥇
Хорошо объяснил!
Отличное видео.
Молодец!!!!!!
Спасибо большое за пояснение, очень нравится такие уроки..., продолжение следует?
Еще есть чит, можно свой код вставлять в ISR0, будет выполнятся примерно 1000 раз в секунду. Только его найти надо в глубинах Ардуины еще )
Просто это прерываение есть, настроено, а как использовать неочевидно.
го следующий урок как свои библиотеки в среду добавлять и объявлять, как из них ключевые слова получить и тд
Было бы хорошо что бы выкладывались примеры что бы загрузить и изучить
arduinolab.pw/wp-content/uploads/2018/12/arduino_notebook_rus_v1-1.pdf
Ничерта не понял, но очень интересно))
Глеб! Есть ещё прога flprog.ru/
Супер! я самоучка, но уже более сложные программы пишу, и некоторых моментов не знал, например про uint8_t (причем искал инфу в интернете, такого четкого объяснения ни разу не видел). И про define не знал, тоже думал что аналог const. Вот только не понял: какие это есть недостатки у define? А то я пока использую const для объявления портов, стоит ли перейти на define? И какие у него еще функции? А по поводу цыклов: я бы не увлекался ими, ведь они делают код не прозрачным..
А как насчёт уроков по ESP32 с его приколами. Инфы рускоязычной на просторах интернета по нему практически 0, а хотелось бы. А так уроки не плохие, но этого добра уже хватает в сети.
Вот например сейчас пытаюсь вкурить тему, чем делать задержки в скетче. В ESP8266 delay(), позволяет выполнятся основной прошивке модуля, а циклы по времени нет. На ардуинках наоборот, это вредная функция. А как обстоят дела с ESP32, вообще не понятно. И так со многими приколами данного девайса.
Поддерживаю! Нужна инфа по ESP32! От человека разбирающегося в мануалах.
P.S. Материал в уроке хорошо подан.
Что у вас за история с delay()? Функция работает одинаково для авр\8266 при условии что мы используем сдк есп8266 для ардуино ide.
@@oscarwilde8949 Уже вроде как подхожу близко к истине, но трудности с переводом от гугла. На сколько я понял, то делай в отличии от врайт по миллис , даёт возможность исполнять основные задачи контроллера , что полезно для дела. А в ардуинке от этого один вред.
Нашол пример реализации многозадачности, но он в ESP-IDF написаный. А там как таковой delay() нету, а писанина ближе к машинному коду.
Ещё нашол пример, где нерадотает delay(1);, попробывал у себя, всё работает, может исправили. Суть была в том, что типа при таком условии процик проверяет очередь задач и при их отсутствии продолжает не задерживаясь.
Вообщем оочень много мелких непонятностей, а в целом глобально всё как бы понятно.
Убил 1.5 суток на разбор полётов по EEPROM. Всё раборает, но только до исчезновения питания. А оказалось что просто нужно дописывать EEPROM.commit(); и EEPROM.end();. И читать писать лучше через get и put. Хотя в просторах нета пишут что нельзя так и в примерах библиотеки про это ни слова.
@@oscarwilde8949 была проблема с переполнением буфера сериалпорта, решил задержкой в 10 миллис. Вопрос, а сколько надо для Serial.printf()? и зависит ли это от количества передаваемых бит?
@@oscarwilde8949 Есчё сталкнулся, что с функции прерывания нельзя сгонять за хлебом в другую функцию, да и в ней самой пивка не попьёшь, 300 миллис и у процыка начинается стресс, в связи с чем он тупо перегружается.
Спасибо! Начинаю нимного понимать. Если можно пожалуйста вы не могли бы объяснять как в первом видео примеры. Как у вас было" эта функция такая,она нужна на пример для работы с реле". так еще более понятно. Спасибо!
Нет никакой специальной функции для работы с реле... Просто работайте с портами ввода-вывода (пинами).
сделайте урок по матричной клавиатуре которая будет не тормозить и поддерживать любое одновременное количество нажатий не меньше 10шт.
Момент про пины и define. Правильно понимаю, что подставленные значения занимаю память в которой лежит программа, а не оперативную?
Если простыми словами, то дефайн это указание редактору перед компиляцией заменить все значения, на указанные в дефайне. Это макрос препроцессора перед компиляцией. Как при этом расходуется память... в теории лишняя оперативная память не тратится.
"Правильно понимаю, что подставленные значения занимаю память в которой лежит программа, а не оперативную?"
Нет. При объявлении любой переменной сразу же выделяется необходимое место в оперативке. Как раз для того что бы не выделялась оперативная память и не было лишних строк кода в памяти программ для этого и используют "Дефайн".
один дефайн позволяет менять одну и ту же константу во многих местах кода @@oscarwilde8949
Директива #define вообще не занимает никакой памяти. Она обрабатывается препроцессором до компиляции. И компилятору отдаётся код уже без #define, все значения директив #define уже подставлены в программе в нужных местах.
define это макрокоманда, выполняется на этапе компиляции и просто заменяет весь текст в программе по названию define на его значение.
То есть было:
#define PI 3.14
float a = PI;
Во время компиляции это замениться на
float a = 3.14;
Вроде как не интересная ерунда, но это не так, кое что для себя подметил. Префикс unsigned часто встречал их в коде, но сам не использовал так как не знал что они делают. Также int8_t и uint_16t, читал статьи на вики и других ресурсах, также не понял. А тут все просто и доступно, с живыми примерами. Еще есть префиксы для переменных, и что они делают?
Есть префиксы и каждый гуглится\яндексится, вот например по запросу unsigned arduino в яндексе, вы не поверите, по первой ссылке ткнул и там прямо статья начинается с "Тип данных unsigned int - беззнаковое целое число, также как и тип int (знаковое) занимает в памяти 2 байта. Но в отличие от int, тип unsigned int может хранить только положительные целые числа в диапазоне от 0 до 65535". В целом этот способ подходит, чтобы узнать зачем нужны const\static\volatile
Это не префиксы, это типы данных. Можно набрать в гугле "язык программирования С, типы данных" и почитать. Но есть особенности из-за восьмибитного микроконтроллера (AVR), который применяется в ардуине. Например целочисленный тип данных int для компьютерного процессора имеет размер 4 байта (32 бит), а для AVR всего 2 байта (16 бит). Поэтому придумали типы с явным указанием количества бит: int8_t, int16_t, int32_t и другие.
Как сделать копию программы (скетч) который уже залит в Arduino
Программирование - нудятина?) Да ну, наоборот самая классная часть!
Спасибо за Вашу работу.
Я уже немного освоился в ардуино (очень немного) :). У меня вопрос такого плана. возможно ли на плате ардуино запрограммировать один из пинов, таким образом, чтобы он стал двунаправленной шиной передачи данных RX/TX ?
Извините, но вроде по С++ полно обучалок. Интереснее бы по обмену данных Ардуина и комп (питон какой-нибудь), или что-то такое, вставки на ассемблере, энергосбережение... хотя думаю в вашем курсе оно и будет что-то такое ))
ruclips.net/user/results?search_query=%D1%81%2B%2B+%D1%83%D1%80%D0%BE%D0%BA%D0%B8+%D0%B4%D0%BB%D1%8F+%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D1%85
Когда смотришь уроки вроде всё понятно, но когда начинаешь сам что то писать, упираешься в какую нибудь ошибку и все, ступор.
это нормально.
При виде ошибки нужно не впадать в панику, а внимательно прочитать её (если не знаете английского - есть переводчики). Если не понимаете, что написано в ошибке - гугл и сообщество поможет.
продолжай
Как это нудятина?) Это вообще-то самое главное
С чего вдруг? Сначала рассказывать про всякие модули, а затем рассказать людям, как программировать? Т.е. до этого информация доносилась для тех, кто не знает даже про типы данных?)))
Не, за уроки уважение, просто я немного логики не понял)
Внатуре, противоречие на лицо, возможно много вопросов задавали в коментах домашние автоматизаторы без базовых знаний по программированию.
О чём тут ты сам себе объесняеш или кому
Очень полезная "нудятина"
@@user-yd6xd4zw8l имеется
нихера не понятно. отписка
Я не понимаю вас, пишите для начинающих а обьясняете как прлфесионалам
как вы сами в туалет ходите, вообще не понимаю.
Полная шляпа.