[image]

Уроки программирования Arduino

Перенос из темы «Чайные радиоэлектронные вопросы»
 
1 2 3 4 5 6 7 8 9
RU GOGI #15.12.2018 16:44  @Валентин_НН#15.12.2018 12:38
+
-
edit
 
В.Н.> так зачем тогда нужен constrain ?
Чертовы ардуинщики!
RTFM, я за две минуты нашёл чем map от constrain отличается и так и не понял, нахрена этот ужас использовать.
   70.0.3538.11070.0.3538.110
RU Валентин_НН #15.12.2018 18:20  @GOGI#15.12.2018 16:44
+
-
edit
 

Валентин_НН

литератор
★★☆
В.Н.>> так зачем тогда нужен constrain ?
GOGI> Чертовы ардуинщики!
[испуганно икнув]
ты чего ругаешься, отец родной?
   1818
RU GOGI #15.12.2018 19:44  @Валентин_НН#15.12.2018 18:20
+
-
edit
 
В.Н.> ты чего ругаешься, отец родной?
Так прямо в справке на функцию map
Функция map() не ограничивает значение рамками диапазона, как это делает функция constrain(). Contrain() может быть использован до или после вызова map(), если необходимо ограничить допустимые значения заданным диапазоном.
 

map(value, fromLow, fromHigh, toLow, toHigh) | Аппаратная платформа Arduino

Функция пропорционально переносит значение (value) из текущего диапазона значений (fromLow .. fromHigh) в новый диапазон (toLow .. toHigh), заданный параметрами. Функция map() не ограничивает значение рамками диапазона, как это делает функция constrain(). //  arduino.ru
 

Но когда я смотрю, как они в примерах переводят десятибитный результат АЦП в восьмибитный через эту функцию:
void loop()
{
  int val = analogRead(0);
  val = map(val, 0, 1023, 0, 255);
  analogWrite(9, val);
}

а функция эта делает:
long map(long x, long in_min, long in_max, long out_min, long out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

моя рука сама тянется к пистолету.
   64.064.0
RU Balancer #17.12.2018 01:09  @Валентин_НН#15.12.2018 13:44
+
-
edit
 

Balancer

администратор
★★★★★
В.Н.> в примере значения заданы min=0, а max=500. но почему это может привести к выходу за пределы диапазона?

Потому что с аналогового входа могут считываться значения от 0 до 1023 :)
   55
US Mishka #17.12.2018 07:46  @Валентин_НН#15.12.2018 12:46
+
-
edit
 

Mishka

модератор
★★★
В.Н.> Точно?
В.Н.> просто это пример из великого и ужасного Джереми Блума, которого советуют всяким ардуино-новичкам.
В.Н.> выходит, что в данном случае код просто избыточен? я правильно понял?

Есть диапазон возможных теоретических значений. А есть диапазон, которые действителен для каких-то данных условий. Вторые для быстроты не делают первых проверок — часто не хватает мощи встроенных процов. Поэтому внутренние проверки делают только по модели, не проверяя изначальных границ (считается, что не может это фигня выходить за границы). Поэтому делаются простые вычислительные формулки. Там беда случится, если выйдет за пределы начальные.
   63.063.0
RU Валентин_НН #17.12.2018 10:08  @Balancer#17.12.2018 01:09
+
-
edit
 

Валентин_НН

литератор
★★☆
В.Н.>> в примере значения заданы min=0, а max=500. но почему это может привести к выходу за пределы диапазона?
Balancer> Потому что с аналогового входа могут считываться значения от 0 до 1023 :)

Блин, точно ведь [чешет репу]
Вот что значит - ардуинствовать раз в год :( - теряются даже базовые навыки.
надо всё-таки заставлять себя. Ни дня без кода, тыксыть
   1818
RU Валентин_НН #23.01.2019 23:10
+
-
edit
 

Валентин_НН

литератор
★★☆
собрал я ночную подсветку в коридоре - по сигналу от ПИРдатчика светодиод плавно загорается, светит постоянной яркостью и плавно гаснет.
реализовано это без-delay-ным методом. т.е. есть возможность отследить срабатывание другого датчика.
хочу добавить и датчиков и диодов, чтоб они срабатывали по такому-же принципу

я могу тупо размножить существующий код, но это неправильно и некрасиво.
няп, надо блок управления яркостью вынести в отдельный модуль.
я правильно понимаю, что мне надо смотреть в сторону классов? организовать класс, который после получения единицы на вход, будет выдавать текущую яркость в соответствии с тем, что у него внутре прописано.
я догадываюсь, что мою задачу можно решить мноооожеством способов, но, классы подходят?
   1818
RU GOGI #24.01.2019 07:32  @Валентин_НН#23.01.2019 23:10
+
-
edit
 
В.Н.> я догадываюсь, что мою задачу можно решить мноооожеством способов, но, классы подходят?
Решил ООП освоить? :D Да, подходят.
   52.052.0
RU Sandro #24.01.2019 07:54  @Валентин_НН#23.01.2019 23:10
+
-
edit
 

Sandro
AXT

инженер вольнодумец
★★
В.Н.> хочу добавить и датчиков и диодов, чтоб они срабатывали по такому-же принципу
В.Н.> я могу тупо размножить существующий код, но это неправильно и некрасиво.

Размножать нужно не код, а данные :)
Заводишь массив структур с параметрами на каждую точку и вызываешь на каждую функцию обновления. Ну или массив экземпляров классов, принципиальной разницы нет.
   62.062.0
RU Валентин_НН #24.01.2019 08:07  @Sandro#24.01.2019 07:54
+
-
edit
 

Валентин_НН

литератор
★★☆
Sandro> Размножать нужно не код, а данные :)
Sandro> Заводишь массив структур с параметрами на каждую точку и вызываешь на каждую функцию обновления. Ну или массив экземпляров классов, принципиальной разницы нет.
блин, ну точно ведь - массив!
как это самому в голову не пришло? :(

но ладно, с массивами я дело ещё в школе имел. с ними я (скорее всего) совладаю.
а вот классы я ещё не пробовал. попробую их поковырять
   1818
LT AleksejLt #02.02.2019 11:50  @Валентин_НН#24.01.2019 08:07
+
+1
-
edit
 

AleksejLt

опытный

В.Н.> а вот классы я ещё не пробовал. попробую их поковырять

Наверное, больше подойдут структуры - они и проще и больше подходят для хранения данных. По теории ООП, переменый класса должны быть скрыты от публичного доступа.
   66.066.0
+
-
edit
 

Sandro
AXT

инженер вольнодумец
★★
В.Н.>> а вот классы я ещё не пробовал. попробую их поковырять
AleksejLt> Наверное, больше подойдут структуры - они и проще и больше подходят для хранения данных. По теории ООП, переменый класса должны быть скрыты от публичного доступа.

По какой такой теории? ;)
В C++ class и struct отличаются только видимостью элементов по умолчанию. См. стандарт языка.
   52.952.9
+
+1
-
edit
 

AleksejLt

опытный

Sandro> По какой такой теории? ;)

Не придирайся, имелась в виду инкапсуляция :) Понятно, что никто не мешает сделать поля класса публичными, но адепты ООП предадут тебя анафеме.
   66.066.0

  • Валентин_НН [03.02.2019 21:55]: Перенос сообщений в ...del
LR JackSmith #05.02.2019 14:13  @Валентин_НН#23.01.2019 23:10
+
-
edit
 

JackSmith

втянувшийся

В.Н.> хочу добавить и датчиков и диодов, чтоб они срабатывали по такому-же принципу

для этого подойдет простенький диспетчер задач. Через коллбэк-функции указываются функции опроса конкретных датчиков, а интервал указывается в качестве параметра задачи. ООП здесь не нужно. За ООП следует браться только того, как разберетесь с "кучей"(heap).
   52.052.0
RU Валентин_НН #05.02.2019 19:02  @JackSmith#05.02.2019 14:13
+
-
edit
 

Валентин_НН

литератор
★★☆
JackSmith> для этого подойдет простенький диспетчер задач. Через коллбэк-функции указываются функции опроса конкретных датчиков, а интервал указывается в качестве параметра задачи.
иэх... :( это ты сейчас с кем разговаривал?
я сварщик настоящий, а программист и даже ардуинщик - очень понарошечный

JackSmith> ООП здесь не нужно. За ООП следует браться только того, как разберетесь с "кучей"(heap).
да меня не это непонятное ООП интересует, как таковое.
К большому сожалению, я ардуиню очень и очень через раз. соответственно, к следующему разу, когда у меня получается этим вплотную заняться, я забываю все свои прежние достижения. Мне даже приходится вспоминать синтаксис простейших команд.
поэтому я хочу все свои достижения квантовать в какие-то блоки, библиотеки, чтоб в следующий раз можно было брать и пользоваться ими, не вникая, как они внутре устроены.
ничего умней, как использовать эти классы я не придумал
   1919
LT AleksejLt #05.02.2019 20:12  @Валентин_НН#05.02.2019 19:02
+
-
edit
 

AleksejLt

опытный

В.Н.> К большому сожалению, я ардуиню очень и очень через раз. соответственно, к следующему разу, когда у меня получается этим вплотную заняться, я забываю все свои прежние достижения. Мне даже приходится вспоминать синтаксис простейших команд.

А тебе на самом деле нравится этот ужасный С++? Просто может стоит взять WeMos [показать]
?

На нем можно на жабаскрипте или Луа программировать, входов/выходов много, работают как и в Ардуине. И так же можно на С++ писать.
   66.066.0
RU JackSmith #05.02.2019 21:08  @Валентин_НН#05.02.2019 19:02
+
+1
-
edit
 

JackSmith

втянувшийся

В.Н.> К большому сожалению, я ардуиню очень и очень через раз. соответственно, к следующему разу, когда у меня получается этим вплотную заняться, я забываю все свои прежние достижения. Мне даже приходится вспоминать синтаксис простейших команд.

поэтому учить надо не С++ или Си, а Ассемблер. Языки они как мода, приходят и уходят, а ассемблер всегда ОДИН. Вот возьмем следующую программу мигалки для ATtiny:
// blink.c for AVR ATtiny 13/25/45/85

#include <avr/io.h>
#define F_CPU 1000000UL // частота резонатора 1МГц
#include <util/delay.h>
int main(void) {
 // макрос _BV(число) заменяет конструкцию (1 << число)
 DDRB |= _BV(PB0); // аналог pinMode(PB0,OUTPUT); в Wiring
 for (;;) {
  PORTB ^= _BV(PB0); // инвертируем состояние порта PB0
  _delay_ms(1000); // ждем 1 секунду
 }
 return 0;
}


компилятор преобразует ее в следующий ассемблерный код:
 


Здесь, к примеру, функция main() начинается с адреса 22. У всех функций есть адреса. Функции в ассемблере называются подпрограммами. Их можно запустить на выполнение инструкцией "rcall адрес_подпрограммы".

Как всем известно, функции могут принимать параметры. Например func(int foo, int bar) и т.д. Это называют аргументами функции. Но в качестве параметра можно передавать и адрес функции для их последующего выполнения. Такие функции называются коллбэк(callback) функциями.

Теперь о том, как работает планировщик. Допустим у нас есть прерывание таймера, которое вызывается раз в 1 мс. Теперь пишем таблицу с тремя столбцами. В первом столбце пусть будет адрес функции опроса первого датчика, в втором столбце пусть будет интервал вызова данной функции в миллисекундах, в третьем столбце путь будет счетчик в миллисекундах. Во второй строке все тоже самое для второго датчика, в третьей для третьего и т.д.

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

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

Понятно, что если имеется три или четыре датчика, то возиться с планировщиком может и не стоит, но в целом, планировщик здорово облегчает программирование микроконтроллеров.
   55
RU Валентин_НН #05.02.2019 22:55  @JackSmith#05.02.2019 21:08
+
-
edit
 

Валентин_НН

литератор
★★☆
JackSmith> поэтому учить надо не С++ или Си, а Ассемблер.
Эх. Вот именно из-за ассемблера я и на долгие годы забросил все программирование - никак мне не зашли все эти аккумуляторы, стеки и прерывания.
А сейчас уже поздно этим заниматься - к сожалению, просто не хватит времени на изучение. А хочется напрограммировать чего-нить бОльшего, чем просто поблимкать светодиодом.
так что, увы, но все эти машинные коды уже без меня
но за участие - спасибо :)
   1919
RU Валентин_НН #05.02.2019 23:55  @AleksejLt#05.02.2019 20:12
+
-
edit
 

Валентин_НН

литератор
★★☆
AleksejLt> А тебе на самом деле нравится этот ужасный С++?
фигасе :eek: а так можно говорить в приличном обществе? в морду не дадут? :D

AleksejLt> На нем можно на жабаскрипте или Луа программировать, входов/выходов много, работают как и в Ардуине. И так же можно на С++ писать.
да хз. по большому счету, мне всё равно что изучать. на самом деле, исходные знания нулевые.
просто куда не ткнись, все ардуинские чайники программируют на этом своём С. в сети масса уроков-примеров. а если стать на кривую дорожку Java программирования, то где найти плечо, на которое можно будет опереться?
Я немного размышлял на тему, а может мне этот Луа попробовать - вроде Рома там что-то про него хорошее писал. А с другой стороны, существует вероятность оказаться в роли буриданова осла, стоящего между Луа, Явой и С. А там ещё ассемблер из-за угла кокетливо таблицу векторов прерываний кажет.
и куды податься бедному крестьянину? :)
   1919
CA tarasv #06.02.2019 06:35  @Валентин_НН#05.02.2019 23:55
+
-
edit
 

tarasv

аксакал

AleksejLt>> А тебе на самом деле нравится этот ужасный С++?
В.Н.> фигасе :eek: а так можно говорить в приличном обществе? в морду не дадут? :D

Не дадут. Плюсы в их нынешнем виде отличный пример отвратительно спроектированного языка. Даже самые упертые сионисты плюсоводы с этим уже не спорят. В синтаксисе нормально спроектированного языка нельзя совешить открытие, авторы знают о нем все, но в C++ это удалось. Случайно обнаружилось что описания templates полные по Тюрингу, на них можно программировать и эта программа будет выполняться в процессе компиляции.
   71.0.3578.9871.0.3578.98
Это сообщение редактировалось 06.02.2019 в 06:57
RU Валентин_НН #06.02.2019 09:12  @tarasv#06.02.2019 06:35
+
-
edit
 

Валентин_НН

литератор
★★☆
AleksejLt>>> А тебе на самом деле нравится этот ужасный С++?
В.Н.>> фигасе :eek: а так можно говорить в приличном обществе? в морду не дадут? :D
tarasv> Не дадут. Плюсы в их нынешнем виде отличный пример отвратительно спроектированного языка. Даже самые упертые сионисты плюсоводы с этим уже не спорят.
чертовы гуки! ©
я давно уже догадывался, что мне подсунули никуда не годный инструмент. Потому что только этим можно объяснить то, что у меня по сию пору нет плавно разгорающейся и плавно гаснущей подсветки в коридоре и в прилегающем к нему туалете. и в бане у тёщи до сих пор температуру приходится смотреть на термометре, а не на экране смартфона.
всё, решено! Отныне я Java-программист! :)

а вообще-то надо-бы как-нить узаконить свои отношения с этим программированием. на какие-нить платные онлайн курсы записаться настоящие. Потому-что самодеятельное бесплатное ковыряние похоже на какой-то онанизм в таблетках бег на месте. что-то делал - делал, потом отложил, потом забил, потом забыл. потом опять всё сызнова.
а так, раз деньги плОчены, придется заниматься.
единственное, меня смущает, что эти все курсы - оне, наверное для молодежи. А я уж кагбэ не совсем мальчик :)

Чебурашка идет в школу на английском языке с русскими субтитрами
Чебурашка идет в школу на английском языке. Советский мультфильм с русскими субтитрами.
   1919
Это сообщение редактировалось 06.02.2019 в 10:42
CA tarasv #06.02.2019 21:24  @Валентин_НН#06.02.2019 09:12
+
-
edit
 

tarasv

аксакал

В.Н.> всё, решено! Отныне я Java-программист! :)

Я бы для Arduino не заморачивался, а писал на том C который в родной IDE. Там нет тяжелых мест из современного C++ да и не нужны они под Arduino.
   71.0.3578.9871.0.3578.98
RU Валентин_НН #06.02.2019 21:56  @tarasv#06.02.2019 21:24
+
-
edit
 

Валентин_НН

литератор
★★☆
В.Н.>> всё, решено! Отныне я Java-программист! :)
tarasv> Я бы для Arduino не заморачивался, а писал на том C который в родной IDE. Там нет тяжелых мест из современного C++ да и не нужны они под Arduino.

[исступленно рвет свежераспечатанную книжку "философия Java" от Эккеля Брюса, в шестьсот страниц] - ага! Врешь - не возьмешь! Какой-то новомодной Явой хотели меня соблазнить! Нет! только Си и его плюсы смогут привести меня к познанию Дзен!
   1919
CA tarasv #06.02.2019 23:35  @Валентин_НН#06.02.2019 21:56
+
-
edit
 

tarasv

аксакал

В.Н.> [исступленно рвет свежераспечатанную книжку "философия Java" от Эккеля Брюса, в шестьсот страниц] - ага! Врешь - не возьмешь! Какой-то новомодной Явой хотели меня соблазнить! Нет! только Си и его плюсы смогут привести меня к познанию Дзен!

Базовый синтаксис у всех трех (и еще C#) общий. Я будучи чистым сишником (и немного плюсы) достаточно быстро начал писать на java когда стало надо.
   71.0.3578.9871.0.3578.98
RU Валентин_НН #07.02.2019 08:54  @tarasv#06.02.2019 23:35
+
-
edit
 

Валентин_НН

литератор
★★☆
В.Н.>> [исступленно рвет свежераспечатанную книжку "философия Java" от Эккеля Брюса, в шестьсот страниц]
tarasv> Базовый синтаксис у всех трех (и еще C#) общий. Я будучи чистым сишником (и немного плюсы) достаточно быстро начал писать на java когда стало надо.

[вздыхает, лезет в мусорную корзину, начинает склеивать книгу обратно] :)

я это всё понимаю. надо просто заставить себя начать этим заниматься - проскочить какую-то начальную мертвую точку - какую-то боязнь/неуверенность, штоле.
был-бы какой-нить знакомый в реале, с кем можно было-б консультироваться - было-бы гораздо проще.
Женя Тевг, негодяй, поселился где-то в х@ево-кукуево. Нет штоб поселиться где-нить в Кировских лесах. я б к нему кажные выходные мотался на учебу с ящиком тушенки. :D
   1919
1 2 3 4 5 6 7 8 9

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru