Написание библиотек для Arduino IDE
- Войдите на сайт для отправки комментариев
Ср, 10/01/2018 - 15:21
Здравствуйте, решил потренироватся и с протоколами передачи данных и с написанием библиотек, пока баловался с 1-wire, написал библиотеки для DHT11, DHT22 и библиотеку для работы с 1-wire. С DHT22 точно незнаю работает ли, так как нету этого датчика, вроде делал по даташиту. Если есть возможность, то проверьте работает ли с DHT22 и скажите какие есть косяки в коде библиотек.
Не позорился бы ты....
Критика принимается? Короче - всё плохо. Не совсем всё, но читать при помощи digitalRead, при этом пытаясь попасть в маленькие тайминги - идея такая себе. Сравните: https://github.com/Porokhnya/GreenhouseProject/blob/master/Main/DHTSupport.cpp - это чтение с DHT, там читается напрямую из порта, чтобы исключить накладные расходы вызова digitalRead (внутри которой каждый раз делается то же самое - ищется соответствие пина порту и т.п., короче - много муторных ненужных операций).
С OneWire вообще по таймингам всё должно быть очень аккуратно - привередлив этот протокол к ним, аж жуть. Там, строго говоря, надо делать всё на прерываниях и таймерах, и забыть о digitalRead/digitalWrite как о страшном сне.
Такие мысли.
конечно принимается критика, адекватная, а не как у дрочуна одного ))), с тонкостями пока мало знаком, поэтому и спрашиваю как лучше.
---
детсемен, тебя как бы тут тоже не хвалят )))
http://arduino.ru/forum/programmirovanie/trebuetsya-pomoshch-znatokov-si#comment-317362
DIYMan, в том скетче есть такая строчка
так же вроде делать нельзя, может быть КЗ, как я читал?
конечно принимается критика, адекватная, а не как у дрочуна одного ))), с тонкостями пока мало знаком, поэтому и спрашиваю как лучше.
А чего вы хотели? Реакцию Дед-симена очень легко понять. Зачем браться за библиотеки, если не знаком с тонкостями? Кому нужны такие библиотеки?
Это графоманство называется, бумагу марать ради самоудовлетворения...
Зачем браться за библиотеки, если не знаком с тонкостями? Кому нужны такие библиотеки?
Это графоманство называется, бумагу марать ради самоудовлетворения...
Для того что-бы знакомится с тонкостями... )), свои библиотеки никому не предлагаю к использованию, вы если хотите покритиковать то критикуйте, что ненужно делать, а что нужно, а то счас сами самоудовлетворением занимаетесь..
Для того что-бы знакомится с тонкостями... ))
Для того, чтобы знакомиться с тонкостями - надо брать даташит на микроконтрроллер и учиться программировать на более низком уровне используя регистры (тех же портов ввода-вывода). А использовать в своих библиотеках ардуиновские функции типа pinMode(), digitalWrite(), digitalRead() - это обёртка поверх обёртки...
По теме: библиотеки не пишутся от балды. Библиотеки создаются под маштабные проекты. Человек - программист захотел , что бы все уровни проекта были в едином стиле и без всяких "костылей" и "дыр", вот и пишет все, сверху вниз.
согласен, тем сейчас и пытаюсь заниматся.
DIYMan, в том скетче есть такая строчка
так же вроде делать нельзя, может быть КЗ, как я читал?
С чего бы там быть КЗ?
Датчик подключен как монтажное " и " и если на твою единицу выдаст 0 вот и замыкание, должен быть в z состоянии, прижимаешь к нулю и отпускаешь, нужно порт просто перевести в режим приема и линия сама перейдет в 1 так как подтянуто резистором.
Ну вот не поверишь: этот код прекрасно опрашивает DHT и никакого КЗ при этом нет :)
Я поверю, мой код тоже со всем справляется на ура но критика же есть ))), я тоже как у вас делал, а потом вычитал, что это неверно и так делать нельзя.
Где вы это вычитали? В даташите написано, что высокий уровень на линии говорит датчику, что данные с него не требуются - это и делается, собственно. О каком КЗ вы говорите на линии данных - непонятно. Вот выдержка из даташита:
Data-bus's free status is high voltage level. When communication between MCU and DHT22 begin, program of MCU will transform data-bus's voltage level from high to low level and this process must beyond at least 1ms to ensure DHT22 could detect MCU's signal, then MCU will wait 20-40us for DHT22's response.
вот например как устанавливаются входы
Step 2: Microprocessor I / O set to output at the same time output low, and low hold time can not be less than 18ms, then the microprocessor I / O is set to input state, due to the pull-up resistor, a microprocessor/ O DHT11 the dATA data lines also will be high, waiting DHT11 to answer signal, send the signal as shown:
и что такое монтажное "и"
http://easyelectronics.ru/montazhnoe-i.html
вот например как устанавливаются входы
Step 2: Microprocessor I / O set to output at the same time output low, and low hold time can not be less than 18ms, then the microprocessor I / O is set to input state, due to the pull-up resistor, a microprocessor/ O DHT11 the dATA data lines also will be high, waiting DHT11 to answer signal, send the signal as shown:
и что такое монтажное "и"
http://easyelectronics.ru/montazhnoe-i.html
И? Чего вы хотите сказать-то? Написано про подтягивающий резистор, который просто медленнее тянет линию вверх, чем принудительное выставление высокого уровня на линии, вот и всё. Вы бы посмотрели полностью даташит и код, и увидели бы, что линия переводится на ВЫХОД только тогда, когда с датчика уже всё прочитано, и ему надо сказать, что всё - он свободен. Вместо тех двух строчек кода можно тупо подтяжку к питанию сделать, не вопрос - будет РОВНО ТО ЖЕ САМОЕ, ибо В НАЧАЛЕ работы с датчиком мы ВСЁ РАВНО настраиваем линию НА ВЫХОД. И кстати - встроенная подтяжка к питанию также юзается, если вы не заметили.
Вопросы? Или опять будете ссылками, ненужными в контексте обсуждаемого, бравировать? Ещё раз повторюсь: когда DHT отсылает 40 бит - он переходит в low power consumption mode и ничего с линией не делает, о каком КЗ вы говорите?
Я 5 коп. добавлю? Тут Лион прав, не обижайтесь, плз.!
Хороший тон - выставлять 1 переодом в чтение. Значение имеет только в режиме мульти мастера, что понятно. Если у тебя 1 и кто-то ресетит шину - может волшебгый дым выйти.
Для одного мастера - просто полезный стиль.
В даташите указанно, что низкий уровень устанавливается переводом i/o на вход, переводом на выход устанавливается единица подтягивающим резистором, все доказывать вам ниче не хочу, вот еще ссылка с поясненниями, хотите верьте, хотите нет, это с протокол 1-wire, тут принцип тот же
Внимание: ни ведущий, ни ведомые не выставляют на шине "единицу" - это черевато коротким замыканием: если одно устройство выставит на шине "1", а другое – "0"; поэтому как ведущий, так и ведомый могут использовать только два состояния: "на выход в ноль" и "z-состояние" (на вход без подтяжки). Подтяжка к питанию осуществляется резистором (!).
http://avr.ru/beginer/understand/1wire
В даташите указанно, что низкий уровень устанавливается переводом i/o на вход
Где вы такое вычитали? У вас странная интерпретация написанного: "Microprocessor I / O set to output at the same time output low, and low hold time can not be less than 18ms". Переведите плз эту фразу правильно, ок? Я переведу, если вы не осилили: выход МК устанавливается НА ВЫХОД и в это же время там должен быть НИЗКИЙ сигнал, который не может быть меньше 18 мс. Короче - это фрейм старта чтения с датчика, и ЯСНО написано, что нога МК конфигурируется НА ВЫХОД. Не бредьте.
это с протокол 1-wire, тут принцип тот же
Внимание: ни ведущий, ни ведомые не выставляют на шине "единицу" - это черевато коротким замыканием: если одно устройство выставит на шине "1", а другое – "0"; поэтому как ведущий, так и ведомый могут использовать только два состояния: "на выход в ноль" и "z-состояние" (на вход без подтяжки). Подтяжка к питанию осуществляется резистором (!).
http://avr.ru/beginer/understand/1wire
Блин, давайте мух от котлет отдельно, ок? Приплели 1-Wire, которая как раз с монтажным "и", к DHT, который ОДИН на линии. И который, согласно даташиту, после отдачи 40 бит уходит в сон, и с линией можно делать всё что угодно.
Всё смешалось в доме Облонских, блин. Странно, как мой код вообще работает, ни одного DHT ещё не попалил, и ни один порт ардуины? Вот не должен, цуко, судя по словам путающих тёплое с круглым - а работает. Ок, у меня всё неправильно, пойду поглажу по головке бедный DHT, который об этом и не подозревает.
Я 5 коп. добавлю? Тут Лион прав, не обижайтесь, плз.!
Хороший тон - выставлять 1 переодом в чтение. Значение имеет только в режиме мульти мастера, что понятно. Если у тебя 1 и кто-то ресетит шину - может волшебгый дым выйти.
Для одного мастера - просто полезный стиль.
Каким боком это к DHT, поясните? Или это чисто так - потеоретизировать? DHT - один на линии, после стартового фрейма МК читает с линии 40 бит, после отдачи 40 бит DHT ничего с линией не делает, более того, в даташите сказано - если на линии ПОСТОЯННО ВЫСОКИЙ уровень - это поломка DHT. Каким каком при таком раскладе может случиться КЗ - объясните мне, недалёкому? И при чём тут монтажное "и", если мастер при чтении 40 бит НИЧЕГО не делает с линией, а только читает из неё?
Давайте не теоретизировать, а следовать строго рамкам обсуждения, плз. А то вон сюда уже 1-Wire приплели, о чём речь вообще не велась.
Внимательно смотрим на картинку:
Чёрненьким цветом показано, что делает МК, остальное - подтяжка к питанию. В коде сделано РОВНО так же, за исключением того, что после получения данных я не жду подтяжки, а принудительно поднимаю линию, ибо: "DHT will change to low-power-consumption-mode when data collecting finish if it don't receive start signal from MCU again". Что ещё добавить - я не знаю. Думаю даже, что программное поднятие линии вверх работает медленнее, чем подтяжка вытягивает её наверх, ибо - тучу тактов проца надо, чтобы переварить pinMode и digitalWrite. Короче - беды в этих двух строчках ровно ноль целых хер десятых.
а тут че не монтажное и, зачем резистор?
тут по вашей цитате из даташита сказанно
Data-bus's free status is high voltage level. When communication between MCU and DHT22 begin, program of MCU will transform data-bus's voltage level from high to low level and this process must beyond at least 1ms to ensure DHT22 could detect MCU's signal, then MCU will wait 20-40us for DHT22's response.
что когда высокий уровень это свободное состояние шины
вот из даташита как и что делать с выводами.
Step 2
а тут че не монтажное и, зачем резистор?
тут по вашей цитате из даташита сказанно
Data-bus's free status is high voltage level. When communication between MCU and DHT22 begin, program of MCU will transform data-bus's voltage level from high to low level and this process must beyond at least 1ms to ensure DHT22 could detect MCU's signal, then MCU will wait 20-40us for DHT22's response.
что когда высокий уровень это свободное состояние шины
вот из даташита как и что делать с выводами.
Step 2
Млять, уже сил нет: да переведите вы наконец с английского! Как начинается фрейм, цуко! "Microprocessor I/O set to output" - это хер собачий, что ли? Какая разница, когда я буду переводить линию на выход, если датчик отдал данные и отвалился? Где, блять, КЗ? У вас в голове, по ходу. Отстаньте от меня со своим КЗ, с приплетённым не к месту 1-Wire и неумением читать простейшие даташиты. Просто - отстаньте, всё у вас хорошо, а у меня не правильно. Один хер деревянному не докажешь, вам к Логику в компанию надо, есть тут такой петуч.
я то перевел, там указано, что для перевода линии в ноль установите порт как выход, для перевода в высокий уровень - установите порт как вход и с помощью подтягивающего резистора линия перейдет в высокий уровень, резистор там для чего ? ))), вам не объяснили в даташите чем это чревато, значит так делать можно ))), где там сказанно, что нужно переводить линию самому в высокий уровень ???? А знаете почему ? ссылки выше!
даже на картинке "вашей" указанно где контроллер шлет сигнал, а где просто "отпускает" pull up
Мля, вы отлезете? Юзается у меня pull-up, сто лет уже. Вам этого достаточно? К чему вы докопались-то? К несуществующему КЗ? Вы ни одного довода не слышите, не читаете, что вам пишут, от слова "вообще". Я же говорю - чистый Логик, может, это он перелогинился?
Повторюсь, если не доходит с трёх раз: КЗ НЕ БУДЕТ, понимаете? Почему - я писал выше, неоднократно. Почему безопасно переводить линию на выход и писать туда уровни и когда это делается - тоже писал. Вам похер мороз, похоже, а меня от таких невменяшек немного подбешивает, по жизни. Поэтому скажу как на духу - идите нахер со своими говноподелками в виде "библиотек" - вот уж где дичь, так дичь.
пипец, )))) неадекват, звездная болезнь ? ))) у тебя же самого гавноподделка ))), привел свое гавно в пример моему, но свое хвалишь, хоть и говно ), подумай, неадекват, зачем там резистор, тебе же написанно в даташите отпускать линию, а не установить в высокий уровень, в даташите, написанно, или ты это понимаешь как хочется тебе?
---
Вот кусок из твоего гавнокода
тут закомментированны строки или твой мозг не понимает, что такое while ((*PIR & bit) == LOW )
это значит, что ты раннее так же использовал digitalRead(), но сейчас ты стал пиздц умным ))) и у кого-то гавнокод, а у тебя - нет ))), вот и звездная болезнь на лицо..
конечно принимается критика, адекватная, а не как у дрочуна одного ))), с тонкостями пока мало знаком,
все не как не отпустит ? )))) яж тебя имел ввиду, пока ты посты правил и в гугл ходил ))) ладно проехали...
по текущему срачу соглашусь с Дракулой, в общем случае да, в конкректном - пох!!
только если нуб внешнюю подтяжку +5 не поставит, твой код не работает, код приведенный DIYMan сработает.
ща про гогвнокод сочиню....
говнокод номер раз
зачем uint8_t bit ?
говнокод медленно превращается ....
Ну питухи солидарности будут еще долго кукарекать )))
---
bit там тестировалась часть кода, забылось переправить на return
говнокод номер два
приведение float к float зачем ?
тады надо
и почему нет this-> как в коде выше
уже не нужно ? или вообще не нужно ? или еще чего ?
Ну питухи солидарности будут еще долго кукарекать )))
ну что то примерно я и ожидал услышать, сынок тока я сегодня трезв, не зли меня.
bit, float, this там переделывал код и не успел убрать все, это не проблема и от этого поведение самого кода не изменится
Ну питухи солидарности будут еще долго кукарекать )))
---
bit там тестировалась часть кода, забылось переправить на return
ну да, ну да .
даташит до конца непрочитал.... а говнокод выложил.
а че ты питух ожидал услышать когда кукарекаешь ?
я так понимаю замечания (критика) принята ?
эту питушиную критику, ты называешь критикой ?
все не как не отпустит ? )))) яж тебя имел ввиду, пока ты посты правил и в гугл ходил ))) ладно проехали...
у нас в Роccии слово "питух" пишется через "е"
https://ru.wikipedia.org/wiki/Петух
кокое отношение это имеет ко мне ?
ты перешел на личности ?
Вас это коробит ? Оскарбляет ? Вот почитай сначала как ты ко мне обратился, а потом о личностях спрашивай.
Строят из себя творцами от бога ))), выделываются, вместо адекватного ответа, за этот высер тебе спасибо сказать ? )))
"все не как не отпустит ? )))) яж тебя имел ввиду, пока ты посты правил и в гугл ходил ))) ладно проехали..."
говнокод номер три
фукции
и
чего то возвращают, как догадатся что они возпращают ?
даже общепринятое в С сравнение результата с нулем (ой мля я опять по живому) ничего не дает
прокомментируй плиз...
пследнее слово сочетание (мое) " ладно проехали..." ,у нас в России, трактуется как - примерение сторон.
по делу есть что сказать или будем обиды обсуждать ?
скетче с примером написанно, что возвращает getDataDHT()
int
MyOneWire::resetPresence()
так же возвращает ошибки: 250, -60 это таймауты, если 1 значит без ошибок, так написанно потому что тестировалось, поэтому и такие данные.
согласен, надо было указать, что возвращает, я не планировал куда-то это выкладывать, таких библиотек полно, я для себя тренировался.
те издержки, что вы указали это просто следы тестирования, меня больше интересовало правильно ли использовать методы pinMode(), digitalWrite(), digitalRead(). Так, да, много муссора оставил, переделывал под DHT22, от прежнего осталось float и т.д. муссор уберу
ну надо объявить их в дефайны ошибок, а то кто зноет что такое 2 или 3.
ну хорошо с getDataDHT() понятно, а что с resetPresence()
те издержки, что вы указали это просто следы тестирования, меня больше интересовало правильно ли использовать методы pinMode(), digitalWrite(), digitalRead(). Так, да, много муссора оставил, переделывал под DHT22, от прежнего осталось float и т.д. муссор уберу
если чесно, из за этого все и началось...
делаешь свою библу, постулат - не используй других библ.
надо работаль с регистрами порта напрямую, ну конечно если хватает знаний.
ты, извини уж буду на ты, попытался переписать 100 раз переписанную библу, используя библу WIRING, под свой вкус и цвет. криминал который может постигнуть пользователей твоей библиотеки, я озвучил одной строкой, постами выше.
resetPresence возвращает ошибки, если не 1. 250 и -60 это таймауты, такие значение, не должны быть, тестил и так осталось, так и с 0 в getDataDHT(), это приведу в порядок, согласен, набо было сразу так сделать.
Но меня интересовало pinMode, digitalRead, использвание micros() для подсчета времени в цикле, например.
---
я с чужего не переделывал, сделал dht11 и решил попробовать добавить dht22, в массы это запускать не планировал, для изучения делал.
я с чужего не переделывал, сделал dht11 и решил попробовать добавить dht22, в массы это запускать не планировал, для изучения делал.
ну я не хочу срачь опять разводить, но завести ветку с громким названием
"Написание библиотек для Arduino IDE" должно было человека подготовить к критике, но на первый же пост оветил ДедСимен и вас/тебя эта та сильно задело. а ща столько оплиух накидали...
у меня куча СВОИХ библ и под пики,аврки,стмки но я как то стисняюсь их тут или еще где то выкладывать (хотя как говорится они все рабочие) потому что Егений, сто пудово найдет изъян, а еще кто нибудь может послать...
а еще хлеще, вообще запретить ! )))
c детомсименон это старая история )), diyman я написал, что в том коде, что он выложил нашел строчку кода, о которых читал, что так делать нельзя, на что он сам начал неадекватно реагировать, я своими библами не хвастался, а спрашивал что и как улучшить можно, так как понимаю, что писать на обертке от ардуино это тупо, конструктивная критика приветствуется, а не высеры, тип - не позорься и т.п., я не хвастатся пришел, а спрашивал как привильно делать...
ну вот по делу, у тебя код
почему ты так игнорируешь
??
ведь нибудь у тебя внешней подтяжки - датчикв в ауте, так ?
честно, я тоже не совсем понимаю, зачем выставлять HIGH на выход, а потом переводить пин в инпут с подтяжкой, по сути получая тот же HIGT
я бы переписал так
да я делал так вначале, для перестраховки отсутствия подтягивающего резистора, но встроенный 20кОм и датчик не сможет нармально работать на дальних расстояниях ?
это была "задача" в выложеной тобой "библиотеке" ?
ты это, не озвучивал, вилять не принято в приличном обществе....