Светодиодные индикаторы уровня на микросхемах с емейства LM3914, LM3915 и LM3916

 Arduino  Комментарии к записи Светодиодные индикаторы уровня на микросхемах с емейства LM3914, LM3915 и LM3916 отключены
Янв 102020
 

Микросхемы LM3914, LM3915 и LM3916 фирмы National Semiconductors позволяют строить светодиодные индикаторы с различными характеристиками — линейной, растянутой линейной, логарифмической, специальной для контроля аудиосигнала.

57519c8s-960.gif

Структура базовой микросхемы LM3914 семейства представлена на рис. 1. Ее основу составляют десять компараторов, на инверсные входы которых через буферный ОУ подается входной сигнал, а прямые входы подключены к отводам резистивного делителя напряжения. Выходы компараторов являются генераторами втекающего тока, что позволяет подключать светодиоды без ограничительных резисторов. Индикация может производиться или одним светодиодом (режим «точка»), или линейкой из светящихся светодиодов, высота которой пропорциональна уровню входного сигнала (режим «столбик»).
Входной сигнал UBX подают на вывод 5, а напряжения, определяющие диапазон индицируемых уровней, — на выводы 4 (нижний уровень UH) и 6 (верхний уровень UB). Эти напряжения должны быть в пределах от 0 до уровня, на 1,5 В меньше напряжения источника питания, подключаемого к выводу 3.
«Цена деления» индикатора, т. е. увеличение входного напряжения, вызывающее включение очередного светодиода, составляет 0.1 от разности UB-UH.
Индикатор на микросхеме LM3914 работает следующим образом. Пока напряжение на входе UBX меньше, чем на входе UH плюс «цена деления», ни один светодиод не светится. Как только эти напряжения сравняются, включается светодиод HL1, подключенный к выходу 1. В режиме «точка» при увеличении входного напряжения ток по выходу 1 прекращается и появляется ток выхода 2, при этом гашение первого светодиода и включение второго происходит одновременно, свечение как бы «перетекает» из одного светодиода в другой, и не возникает ситуации, когда оба светодиода погашены. В режиме «столбик» включение очередного светодиода, естественно, не вызывает гашения предыдущего. 73919c8s-960.gif

34d19c8s-960.gif

Микросхема LM3914 предназначена для построения индикаторов с линейной шкалой, и все резисторы ее делителя имеют одинаковое сопротивление. У микросхемы LM3915 делитель рассчитан так, что включение каждого последующего светодиода происходит при увеличении напряжения входного сигнала в√2 раз (на 3 дБ), что удобно для контроля мощности УМЗЧ. Микросхема LM3916 специально предназначена для контроля уровня аудиосигнала. Шаг индикации у нее составляет 1 дБ в верхней части шкалы и увеличивается до 3 и 10 дБ в нижней части. В табл. 1 приведены уровни входного сигнала, включающего соответствующий светоди-од, при нормировании на максимальное напряжение 10 В.
Уровни в последней колонке приведены для случая использования микросхемы LM3916 для диапазона индикации -20…+3 дБ.
Микросхемы содержат источник опорного напряжения с номинальным значением 1,25 В. Путем подключения двух внешних резисторов напряжение может быть установлено любой большей величины, не превышающей на 2 В ниже напряжения питания, но не более 12 В. Подключение резисторов и расчет опорного напряжения осуществляется так же, как для микросхемы LM317 (КР142ЕН12):

Uоп = (R2/R1+1)x1,25В + I8R2,

где R1 — сопротивление резистора, подключенного между выводами 7 и 8, R2 — сопротивление резистора, подключенного между выводом 8 и общим проводом, I8 — вытекающий ток вывода 8, составляющий около 100 мкА.
Переключение между режимами «точка» и «столбик» производится управлением по выводу 9. При подключении этого вывода к плюсу источника питания микросхемы (вывод 3) реализуется режим «столбик», если же вывод оставить свободным или подключить к общему проводу — «точка». Порог переключения между режимами примерно на 100 мВ ниже напряжения на выводе питания 3.
Параметры микросхемы LM3914 приведены в табл. 2.

c6519c8s-960.gif

Типовая схема подачи входного сигнала на микросхему показана на рис. 2. Сопротивление резистора R1 выбирают в соответствии с уровнем входного сигнала UMAX, при котором должен включаться верхний светодиод шкалы, по формуле:
R1 = R2(UMAX/1.25-1).

Входное сопротивление микросхемы весьма велико, поэтому в большинстве случаев при расчете номинала резистора R1 его можно не учитывать.
Интересна роль резистора R3, его сопротивление определяет ток через светодиоды. На </b>рис. 3</b> представлены начальные участки выходных характеристик генераторов тока, включающих светодиоды, при различных значениях тока нагрузки источника опорного напряжения lL(REF) (ток вывода 7). Как видно из </b>рис. 3</b>, ток через каждый свето-диод примерно в 10 раз больше тока нагрузки источника опорного напряжения.
Возможна подача опорного напряжения, например, 10 В от внешнего источника (рис. 4). В этом случае диапазон входного напряжения составляет 0… 10 В, а при указанном на схеме сопротивлении резистора R3, так же, как и для варианта по схеме на рис. 2, номинальный ток через светодиоды равен 10 мА.

3a519c8s-960.gif

Установка необходимого напряжения внутреннего источника проиллюстрирована на рис. 5. Как уже указывалось выше, напряжение питания микросхемы должно по крайней мере на 2 В превышать напряжение опорного источника. Если напряжение на выводе 4 микросхемы (UH) установить отличным от нуля, можно получить растянутую линейную шкалу — от UH до UB. Такая схема включения проиллюстрирована на рис. 6. Напряжение на входе UB составляет около 1,2 В, а на входе UH подстроечным резистором R3 это может быть установлено в пределах O…UB. Если его выбрать равным 2/3 от UB, т. е. 0,8 В, а коэффициент передачи делителя R1R2 подстроенным резистором R2 установить 0,08, то диапазон индицируемых уровней составит 10,5… 15 В, точнее первому включившемуся светодиоду соответствует напряжение 10,5 В. последнему — 15 В.

40519c8s-960.gif

Вариант получения аналогичной шкалы в вольтметре для измерения напряжения бортовой сети автомобиля приведен на рис. 7. В этом случае напряжения верхнего UB = 3,6 В и нижнего уровня UH= 2,4 В устанавливаются подстроенным резистором R4, а коэффициент передачи входного сигнала на вход UBX микросхемы, равный 0,24, — резистором R2.
Во всех рассмотренных выше вариантах индикаторов вход 9 управления «столбик/точка» был никуда не подключен, что обеспечивало индикацию в режиме «точка». Если желательна индикация «столбиком», как уже указывалось выше, вход 9 следует подключить к входу для подачи напряжения питания на микросхему (вывод 3). Однако при включении всех десяти светодиодов существенно увеличивается мощность, рассеиваемая на микросхеме, поэтому следует произвести ее контрольный расчет. Тепловое сопротивление корпуса составляет 55 °С/Вт, максимальная температура кристалла — 100 °С, что допускает максимальную мощность 1365 мВт при температуре окружающей среды 25 °С, 1100 мВт — при 40 °С, 730 мВт — при 60 °С. Если задаться током 10 мА через каждый светодиод, то суммарный ток через 10 включенных светодиодов будет 100 мА и при температуре 40 °С напряжение на выходах микросхемы не должно превышать 11 В, а напряжение питания цепей светодиодов — 12,5 В.
Если нужен больший ток через светодиоды, можно уменьшить напряжение питания светодиодов вплоть до 3 В, при этом питание микросхемы можно осуществлять от источника с большим напряжением. В случае, когда применение двух источников по каким-либо причинам неприемлемо, можно последовательно с каждым светодиодом включить ограничительный резистор, как это показано на рис. 8. Для формирования «столбика» можно все све-тодиоды соединить последовательно, а микросхему перевести в режим «точка» (рис. 9). Напряжение питания в этом случае должно определяться исходя из того, что падение напряжения на каждом светодиоде около 2 В, почти столько же должно быть на выходе 10 микросхемы, когда включены все светодиоды.
Последовательное включение свето-диодов в режиме «точка» позволяет получить интересный вариант построения индикатора. В качестве примера на рис. 10 приведена возможная схема устройства. Если светодиоды HL1—HL4 установить желтого цвета свечения (мало), HL5—HL8 — зеленого (норма), HL9, HL10— красного (перегрузка), одного взгляда на индикатор будет достаточно для оценки измеряемого параметра. Число светодиодов в каждой цепочке, число цепочек и цвета светодиодов могут быть и другими, соответствующими поставленной задаче. Такой вариант с использованием микросхемы К1003ПП1 описан автором в статье [1].

60519c8s-960.gif

Напряжение питания микросхемы должно находиться в пределах 3…25 В. Напряжение питания светодиодов должно быть не менее 3 В и не более напряжения питания микросхемы. Источник питания микросхемы в непосредственной близости от нее должен быть зашунти-рован оксидным танталовым конденсатором емкостью не менее 2,2 мкФ или алюминиевым 10 мкФ. Возможно питание цепи светодиодов выпрямленным неотфильтрованным напряжением частотой 50 Гц, однако необходимо подключение к этой цепи такого же блокировочного конденсатора, как и к микросхеме.

При необходимости индикации числа уровней, большего 10, можно использовать несколько микросхем, соединив их каскадно, допустимо соединение до пяти микросхем. Возможный вариант соединения двух микросхем LM3914 приведен на рис. 11, следует обратить внимание на следующее. Источник опорного напряжения микросхемы DA1 работает в обычном режиме и нагружен на резистор R3, что обеспечивает ток 10 мА через подключенные к этой микросхеме светодиоды. Минусовый вывод источника микросхемы DA2 подключен к плюсовому выводу первого источника и обеспечивает между входами UB и UH микросхемы DA2 напряжение 1,2 В, «поднятое» вверх на 1,2 В. Источник микросхемы DA2 нагружен на резистор R4, что задает ток через светодиоды, подключенные к этой микросхеме, той же величины, что и через светодиоды DA1.
Для обеспечения режима «столбик» достаточно выводы 9 каждой микросхемы соединить с выводами 3. Сложнее с режимом «точка», для него необходимо гашение светодиода HL10 при включении любого из светодиодов HL11— HL20. Сигнал о необходимости гашения HL10 поступает с выхода 1 DA2 на вход 9 DA1. Если включен любой из светодиодов HL11—HL20, падение напряжения на HL1 составляет не менее 1 В, поскольку через него проходит или рабочий ток светодиода, или специально формируемый микросхемой DA2 ток порядка 150 мкА (допуск— 60…450мкА), не вызывающий заметного свечения обычных (не супе-рярких) светодиодов. Это падение сравнивается специальным компаратором микросхемы DA1 с напряжением питания светодиодов. Для подачи этого напряжения на второй вход компаратора, соединенный с выводом 11 (выход 9) DA1, служит резистор R5.
Делитель напряжения микросхемы имеет очень хорошую точность, однако для реализации потенциальных возможностей микросхемы следует тщательно подойти к разводке цепей общего провода. Ток вывода 2, который в режиме «столбик» может доходить до 300 мА, не должен протекать по проводникам, через которые подключаются нижний вывод резистивного делителя микросхемы (вывод UH)f источник входного сигнала и минус источника опорного напряжения. В режиме «столбик» по проводнику, соединяющему выводы 9 и 3, не должны протекать токи светодиодов.
Для четкой работы индикатора рекомендуется «цену деления» устанавливать не менее 20 мВ в режиме «столбик» и 50 мВ в режиме «точка».

f0519c8s-960.gif

Схема интересного варианта индикатора двуполярного напряжения приведена на рис. 12. Микросхема DA1 работает практически в стандартном режиме и формирует светящийся «столбик», высота которого пропорциональна положительному входному напряжению.
Микросхема DA2 также работает в режиме «столбик», но включена необычно. Все светодиоды, подключенные к ее выходам, получают питание через резисторы R6—R15 и гаснут при включении соответствующих выходов микросхемы. На нижний вывод UH встроенного делителя подано напряжение -1,32 В со стабилизатора на микросхеме DA3. В результате на верхнем выводе делителя UB микросхемы DA2 формируется уровень около -0,12 В, и при нулевом или положительном напряжении на входе этой микросхемы все выходы микросхемы включены и свето-диоды, подключенные к ее выходам, погашены.
При подаче на вход индикатора отрицательного напряжения, увеличивающегося по абсолютной величине, вначале выключается выход 10 и зажигается светодиод HL11, затем поочередно еще и HL12—HL20, что формирует «столбик», высота которого пропорциональна модулю отрицательного напряжения на входе.
Для обеспечения функционирования микросхем при отрицательных входных сигналах на выводы микросхем 0В для подачи минуса питания подано то же напряжение -1,32 В. Точная подстройка этого напряжения производится резистором R5.
Ток через светодиоды HL1—HL10 определяется резистором R1 и составляет около 10 мА, примерно такой же ток течет через резисторы R6—R15 и обеспечивает необходимую яркость свето-диодов HL11—HL20. Поскольку при включении выходов микросхемы DA2 напряжение на ее выходах составляет около -1 В, ток через резисторы R6— R15 увеличивается почти до 14 мА, что и определяет выбор сопротивления резистора R2.
Схема на рис. 13 иллюстрирует вариант построения вольтметра с растянутой шкалой для измерения отклонения напряжения на входе от номинального +5 В. Цена деления вольтметра — 120 мВ, полный диапазон — 4,46…5,54 В. Выходное напряжение опорного источника 1,2 В делителем R1R2 уменьшается до необходимого 1,08 В, подстроенным резистором R1 устанавливается его точное значение, а резистором R4 — начальное напряжение шкалы Uн.
Индикатор может работать как в режиме «точка», так и в режиме «столбик». Выбор режима осуществляется переключателем SA1. Светодиоды шкалы целесообразно установить разного цвета свечения, например, HL4—HL7 — зеленого; HL3, HL8 — желтого; HL1, HL2, HL9, HL10 — красного, что обеспечит эффективную индикацию отклонения напряжения от +5 В. 58519c8s-960.gif

Схема на рис. 13 также иллюстрирует упоминавшуюся ранее возможность питания светодиодов от нестабилизиро-ванного и нефильтрованного источника питания. Конденсатор С2 служит для обеспечения устойчивой работы микросхемы.
Индикатор по схеме на рис. 14 обеспечивает интересный эффект, который можно назвать «восклицательный знак». Микросхема работает в режиме «точка» и при нулевом напряжении на входе UBX все светодиоды погашены. Входной сигнал в диапазоне 0…1.2 В подается на этот вход микросхемы через резистор R2, вход зашунтирован конденсатором С2. Конденсатор периодически разряжается транзистором VT1, на базу которого подаются импульсы с частотой 1 кГц и длительностью 100 мкс. Напряжение на входе имеет вид импульсов длительностью 900 мкс по основанию с экспоненциально затянутым фронтом с постоянной времени R2C2 = 200 мкс. В результате ярко светится светодиод HL1 (он должен быть установлен ниже HL2) и светодиод, соответствующий входному напряжению. Во время прохождения фронта импульса светятся и промежуточные светодиоды, причем с тем большей яркостью, чем выше по рис. 14 светодиод расположен, и возникает упомянутый выше эффект.
Индикатор, схема которого приведена на рис. 15, при малых уровнях входного сигнала работает в режиме «точка», поскольку транзистор VT1 закрыт и на управляющий вход CfT через делитель R3VD1R4 подается напряжение, примерно на 0,7 В ниже напряжения питания. Когда включается светодиод HL10, открывается транзистор VT1, и напряжение на входе СЯ становится близким к напряжению на выводе +ипит. Микросхема переходит в режим «столбик» и вспыхивает вся шкала, привлекая к себе внимание. Резистор R2 позволяет регулировать яркость свечения светодиодов.
Очевидно, что точку соединения резисторов R5 и R6 можно подключить к любому из выходов микросхемы и переход в режим «столбик» будет происходить при включении соответствующего светодиода. 24519c8s-960.gif

На рис. 16 приведена схема индикатора, работающего в режиме «столбик». Его особенностью является то, что при зажигании светодиода HL10 отрицательный перепад напряжения с выхода 10 микросхемы через конденсатор С2 и резистор R2 проходит на выход источника опорного напряжения +UREF и нагружает его. В результате яркость свечения светодиодов резко увеличивается и, как и в предыдущем варианте включения, привлекает внимание. Длительность вспышки определяется постоянной времени C2R2 и составляет около 50 мс. Так же, как и в варианте по схеме на рис. 15, элементы R2—R4, С2 могут быть подключены к любому из светодиодов индикатора.

c519c8s-960.gif

Как указывалось выше, гашение светодиодов и их зажигание происходят относительно плавно. При необходимости можно обеспечить резкое переключение светодиодов, схема возможного варианта индикатора с резким переключением, работающего в режиме «столбик», приведена на рис. 17— Дополнительные по сравнению со стандартным включением элементы DA2, R2—R5, С2 вводят положительную обратную связь в компараторы микросхемы. Рассмотрим работу индикатора подробнее.
Если на входе UBX микросхемы нулевое напряжение, все светодиоды погашены, микросхема DA2, являющаяся стабилизатором отрицательного напряжения 1,2 В (отечественный аналог — КР142ЕН18А), обеспечивает на резисторе R5 напряжение 1,2 В, а ее потребляемый по входному выводу ток составляет около 110 мА. Этот ток создает падение напряжения на резисторе R2 около 300 мВ, и, поделенное делителем R3R4 до уровня 25 мВ, оно подается на вход UH микросхемы DA1. Это поднимает пороги переключения компараторов, управляющих светодиодами HL1— HL10, на такую же величину.
При повышении входного напряжения включается светодиод HL1. В процессе его включения ток через светодиод HL1 начинает протекать через резистор R5, и потребляемый микросхемой DA2 ток уменьшается. Это уменьшает падение напряжения на R2 и R4 и снижает порог переключения компаратора, замыкая цепь положительной обратной связи, светодиод HL1 включается скачком. При дальнейшем увеличении входного напряжения также скачком поочередно включаются остальные светодиоды. При уменьшении входного напряжения также резко светодиоды будут выключаться, гистерезис каждого порога составит 0,5… 1 мВ. ec519c8s-960.gif

Основное отличие микросхемы LM3915 от ранее рассмотренной LM3914 заключается в номиналах встроенного делителя напряжения, что обеспечивает логарифмическую шкалу индикатора (см. табл. 1 ). Суммарное сопротивление резисторов делителя и точность порогов микросхемы приведены в табл. 3, остальные параметры указанных микросхем совпадают.
Простейший вариант построения логарифмического индикатора мощности, подаваемой на акустическую систему (АС), проиллюстрирован на рис. 18. Входной сигнал с контролируемой АС через делитель напряжения R1R2 подается непосредственно на сигнальный вход UBX микросхемы. Опорное напряжение выбором резисторов R3 и R4 установлено равным 8,65 В, что обеспечивает индикацию указанных на рис. 18 уровней при установке резистора R1 необходимого номинала в соответствии с сопротивлением АС.

76519c8s-960.gif

Индикатор работает в режиме «точка» с током через каждый светодиод около 30 мА. Поскольку на входе индикатора напряжение переменное, светящиеся светодиоды образуют столбик с неравномерной яркостью, по которому можно оценить как среднюю мощность на АС, так и ее амплитудное значение.
Более точный индикатор среднего или амплитудного значения можно построить с использованием выпрямителя входного сигнала. Если микросхема используется при напряжении опорного источника 10 В, пороговое напряжение для уровня -27 дБ составляет 0,447 В (см. табл. 1) и простейший выпрямитель на кремниевом диоде с «пяткой» 0,6 В даст слишком большую погрешность. Схема простого пикового детектора, обеспечивающего удовлетворительную точность в диапазоне до -30 дБ при полной шкале 10 В, приведена на рис. 19. «Пятку» диода компенсирует напряжение UБЭ транзистора VT1.
Для получения большей точности в широком диапазоне входных напряжений необходимо применять активные выпрямители с использованием ОУ. Схема несложного однополупериодного выпрямителя приведена на рис. 20. Конденсатор фильтра С2 заряжается через резистор R3 и разряжается через R2 и R3, поэтому в зависимости от соотношения номиналов этих резисторов устройство может выполнять роль как выпрямителя пикового значения (номиналы указаны на рис. 20), так и среднего (номиналы резисторов R2 и R3 надо поменять местами). Этот выпрямитель вполне работоспособен в диапазоне уровней входного сигнала 60 дБ.

2519c8s-960.gif

Для точного двухполупериодного выпрямления и сглаживания можно использовать выпрямитель среднего значения, схема которого приведена на рис. 21. При установке резисторов R1—R4 с допуском 1 % усиление положительной и отрицательной полуволн различается не более чем на 0,5 дБ. Постоянная времени усреднения определяется произведением R5C2. Небольшая модификация выпрямителя (рис. 22) обеспечивает выделение информации о пиковом значении входного сигнала. Поскольку сглаживающий конденсатор не буферизирован, этот выпрямитель, так же, как и выпрямители по схемам на рис. 19 и 20, можно нагружать только на нагрузку с большим входным сопротивлением. Микросхема LM3915 вполне соответствует необходимому требованию.
Для выпрямления входного сигнала можно применять специализированные микросхемы. a2519c8s-960.gif

Для построения индикаторов с более широким диапазоном, чем 27 дБ, можно применять каскадирование микросхем. Простейший вариант соединения двух микросхем показан на рис. 23. Опорное напряжение микросхемы DA2 устанавливается подстроечным резистором R4 и составляет 10 В, микросхема работает в стандартном режиме. Для микросхемы DA1 опорное напряжение — 316 мВ, оно подстраивается резистором R1. Входной сигнал подается параллельно на входы обеих микросхем DA1 и DA2. Недостатком такого метода соединения микросхем является то, что порог для уровня включения светодиода -57 дБ составляет 14 мВ и может иметь приводящее к значительной ошибке смещение ±10 мВ.
Схема более точного варианта каскадирования микросхем приведена на рис. 24. Опорное напряжение обеих микросхем одинаково и составляет 10 В. Входной сигнал находится в диапазоне 0…10 В и на микросхему DA2 подается непосредственно, а на DA1 — после предварительного усиления в 31,6 раза операционным усилителем DA3. Естественно, что он ограничивается в ОУ DA3 и не может существенно превышать 10 В. Если резисторы R4 и R5 использовать с допуском ±1 %, подстройки коэффициента усиления не потребуется. Однако, смещение нуля ОУ DA3 может внести значительную погрешность, и его коррекция, как правило, необходима. Подстройка нуля может быть единой для ОУ усилителя DA3 и ОУ, входящих в состав выпрямителя входного сигнала.
Принципиально можно соединить три микросхемы LM3915 аналогично рис. 24 и расширить диапазон индикации до 90 дБ, однако при этом придется проявить особую тщательность при усилении сигнала 0,5 мВ. Может потребоваться подстройка нуля в различных каскадах и разделение общего провода цепей питания и сигнала.
Некоторые замечания по установке тока светодиодов. В приведенном на рис. 25 стандартном варианте формирования опорного напряжения выходной ток по выводу 7 складывается из тока делителя R1R2 и тока через внутренний делитель микросхемы, номинальное сопротивление которого составляет 22 кОм. При опорном напряжении 10 В ток через внутренний делитель составляет около 450 мкА, это увеличивает ток через каждый включенный светодиод на 4,5 мА, что следует обязательно учитывать.
На рис. 26 представлена схема раздельной подстройки опорного напряжения (подстроечный резистор R3) и тока через светодиоды (резистор R5). Диапазон регулировки тока через светодиоды для указанных номиналов резисторов составляет 9…28 мА. Аналогичная схема раздельной регулировки для случая соединения двух микросхем приведена на рис. 27.

92519c8s-960.gif

Интересная схема нуль-индикатора на микросхемах LM3915 приведена на рис. 28. Его особенностью является повышение чувствительности по мере приближения к нулевому уровню. Микросхема DA2 работает в обычном режиме при опорном напряжении 1,25 В. При входном сигнале, близком к верхнему уровню шкалы, шаг индикации примерно равен 360 мВ, а при приближении к нулю — около 20 мВ. Для подачи на вход микросхемы DA1 входное напряжение инвертируется каскадом на ОУ DA3, в результате чего и образуется нуль-индикатор. За счет подачи на вход UH обеих микросхем небольшого отрицательного напряжения можно регулировать чувствительность индикатора вблизи нуля и даже менять характер индикации, например, при нулевом напряжении на входе можно добиться или гашения свето-диодов, подключенных к выводам 1 микросхем, или их зажигания.

14319c8s-960.gif

ea519c8s-960.gif

da519c8s-960.gif

52319c8s-960.gif

6 лет Метки: светодиодный индикатор уровня, lm3914

109

Логарифмический индикатор уровня сигнала на LM3915

 Arduino  Комментарии к записи Логарифмический индикатор уровня сигнала на LM3915 отключены
Дек 312019
 

tterEmailOdnoklassnikiVKWhatsApp

Привет друзья! Сегодня расскажу вам про логарифмический индикатор уровня сигнала на LM3915. Подробное описание и работу данной микросхемы я выкладывать не буду, всю эту информацию читайте в паспорте микросхемы.

Питается микросхема, напряжением от 3 до 25 В. Имеет 10 каналов для светодиодов, выходной ток каждого канала до 30 мА. На каждый канал можно цеплять группами, по несколько светодиодов, тогда логарифмический индикатор уровня сигнала будет выглядеть куда интереснее.

Рабочая температура микросхемы от 0 до 70 градусов Цельсия.

Входной сигнал, поступающий на микросхему LM3915 уже усиленный (с акустической системы), поэтому данный индикатор есть индикатор мощности усилителя.

Индикатор уровня сигнала на LM3915. Схема:

Схема индикатора уровня сигнала

Номиналы компонентов:

  • R1,R6 – 10 кОм;
  • R2 – 1 кОм;
  • R3 – 100 кОм;
  • R4 – 1 МОм;
  • R7 – 390 Ом;
  • R8 – 2,7 кОм;
  • C1 – 2,2 мкФ 25 В;
  • C2 – 1 мкФ 25 В;
  • VT1 – 2n3906;
  • VD1 – 1n4148.
  • R5 зависит от сопротивления нагрузки: для 4 Ом — 10кОм, для 8 Ом — 18кОм.

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

Управление режимами осуществляется на 9 ноге, при подаче на нё плюса напряжения питания, включается режим “Столбик”, при отсутствии плюса на 9 ноге, включается режим “Точка”.

Таблица соответствия напряжений и уровня сигнала, загоранию светодиодов:

Светодиод уровень, дБ Напр.,В
1 -27 0,447
2 -24 0,631
3 -21 0,891
4 -18 1,259
5 -15 1,778
6 -12 2,512
7 -9 3,548
8 -6 5,012
9 -3 7,079
10 0 10

Элементы R1,R2,R3,R4,C2,VD1,VT1 представляют собой выпрямитель входного сигнала. Так как с выхода усилителя поступает переменный сигнал и в режиме столбик, светодиоды будут неравномерно загораться, выпрямитель исправит это.

Плата TTGO T-Call

 Arduino  Комментарии к записи Плата TTGO T-Call отключены
Ноя 272019
 

На протяжении многих лет компания LilyGo выпускала платы TTGO, обычно основанные на базе Espressif ESP8266 или ESP32. Вот еще один вариант, который может быть полезен, если конечно в вашей стране еще не отказались от сотовой сети 2G: TTGO T-Call.

Новая плата сочетает в себе WiSoC ESP32 WiFi & Bluetooth и GPRS модуль U-blox SIM800L, а также она оснащена портом USB-C для питания и программирования, вместо более распространенного микро USB порта на этом типе оборудования.

Технические характеристики платы TTGO T-Call (BLINK_V1.3):

  • Модуль беспроводной сети – ESP32-WROVER-B на базе двухъядерного процессора Xtensa ESP32 @ 240 МГц с 520 Кб SRAM встроено в чип, 4 Мб QSPI флэш-памяти, 8 Мб PSRAM
  • Сеть:
    • WiFi 4 802.11 b / g / n (2.4 ГГц) до 150 Мбит / сек
    • Bluetooth 4.2 Classic + LE
    • Сотовая связь – 2G GSM / GPRS через модуль U-blox SIM800L + слот для Nano SIM карты
  • USB – 1x USB-C для питания и программирования (через CP2104)
  • Расширение – 2x 21-контактных разъема с UART, SPI, SDIO, I2C, PWM, I2S, IRGPIO, емкостный сенсорный датчик, ADC, DAC
  • Разное – кнопка сброса, встроенный 40 МГц кварцевый генератор
  • Питание
    • 5 В / 1 A через порт USB-C
    • 2-контактный разъем JST для 3.7 В литиевой батареи, поддержка зарядного тока 500 мА
  • Рабочее напряжение – от 2.7 В до 3.6 В
  • Потребляемая мощность – около 70 мА во время работы; сон: около 300 мкА
  • Размеры – 78.8 x 28.9 x 8.1 мм
  • Вес – 11.77 грамм
  • Диапазон температур – от -40℃ до ~ +85℃

Нажмите, чтобы увеличить

В настоящее время информация о плате ограничена и все, что сейчас доступно, это репозиторий Github со ссылкой на образец Arduino, библиотека для управления GPRS Seeduino, а также таблицы данных и AT-команды для SIM800. Страница Wiki Seeeduino GPRS Wiki может помочь вам начать работу с платой TTGO T-Call.

Сейчас плату ESP32 GPRS можно приобрести на Aliexpress за $14.36 плюс доставка (примерно $5). Плата поставляется с проводами для батареи, 2-мя разъемами и GPRS-антенной с 9-сантиметровым проводом. Опять же, вам нужно будет проверить статус / дорожную карту для 2G в вашем регионе, чтобы убедиться, что данная плата не станет бесполезна для вас, например через несколько месяцев. На сколько известно, сеть 2G в Европе будет продолжать работать в течение многих лет, поскольку это необходимо для обязательной функции e-Call в автомобилях.

Выражаем свою благодарность источнику из которого взята и переведена статья, сайту cnx-software.com.

Шрифты 8 х 8

 Arduino  Комментарии к записи Шрифты 8 х 8 отключены
Окт 272019
 
 byte font[128][8] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0000 (nul) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0001 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0002 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0003 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0004 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0005 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0006 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0007 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0008 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0009 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000A { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000B { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000C { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000D { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000E { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000F { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0010 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0011 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0012 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0013 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0014 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0015 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0016 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0017 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0018 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0019 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001A { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001B { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001C { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001D { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001E { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001F { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0020 (space) { 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00}, // U+0021 (!) { 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0022 (") { 0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00}, // U+0023 (#) { 0x0C, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x0C, 0x00}, // U+0024 ($) { 0x00, 0x63, 0x33, 0x18, 0x0C, 0x66, 0x63, 0x00}, // U+0025 (%) { 0x1C, 0x36, 0x1C, 0x6E, 0x3B, 0x33, 0x6E, 0x00}, // U+0026 (&) { 0x06, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0027 (') { 0x18, 0x0C, 0x06, 0x06, 0x06, 0x0C, 0x18, 0x00}, // U+0028 (() { 0x06, 0x0C, 0x18, 0x18, 0x18, 0x0C, 0x06, 0x00}, // U+0029 ()) { 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00}, // U+002A (*) { 0x00, 0x0C, 0x0C, 0x3F, 0x0C, 0x0C, 0x00, 0x00}, // U+002B (+) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x06}, // U+002C (,) { 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00}, // U+002D (-) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00}, // U+002E (.) { 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x00}, // U+002F (/) { 0x3E, 0x63, 0x73, 0x7B, 0x6F, 0x67, 0x3E, 0x00}, // U+0030 (0) { 0x0C, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00}, // U+0031 (1) { 0x1E, 0x33, 0x30, 0x1C, 0x06, 0x33, 0x3F, 0x00}, // U+0032 (2) { 0x1E, 0x33, 0x30, 0x1C, 0x30, 0x33, 0x1E, 0x00}, // U+0033 (3) { 0x38, 0x3C, 0x36, 0x33, 0x7F, 0x30, 0x78, 0x00}, // U+0034 (4) { 0x3F, 0x03, 0x1F, 0x30, 0x30, 0x33, 0x1E, 0x00}, // U+0035 (5) { 0x1C, 0x06, 0x03, 0x1F, 0x33, 0x33, 0x1E, 0x00}, // U+0036 (6) { 0x3F, 0x33, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x00}, // U+0037 (7) { 0x1E, 0x33, 0x33, 0x1E, 0x33, 0x33, 0x1E, 0x00}, // U+0038 (8) { 0x1E, 0x33, 0x33, 0x3E, 0x30, 0x18, 0x0E, 0x00}, // U+0039 (9) { 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00}, // U+003A (:) { 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x06}, // U+003B (//) { 0x18, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x18, 0x00}, // U+003C (<) { 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00}, // U+003D (=) { 0x06, 0x0C, 0x18, 0x30, 0x18, 0x0C, 0x06, 0x00}, // U+003E (>) { 0x1E, 0x33, 0x30, 0x18, 0x0C, 0x00, 0x0C, 0x00}, // U+003F (?) { 0x3E, 0x63, 0x7B, 0x7B, 0x7B, 0x03, 0x1E, 0x00}, // U+0040 (@) { 0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00}, // U+0041 (A) { 0x3F, 0x66, 0x66, 0x3E, 0x66, 0x66, 0x3F, 0x00}, // U+0042 (B) { 0x3C, 0x66, 0x03, 0x03, 0x03, 0x66, 0x3C, 0x00}, // U+0043 (C) { 0x1F, 0x36, 0x66, 0x66, 0x66, 0x36, 0x1F, 0x00}, // U+0044 (D) { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x46, 0x7F, 0x00}, // U+0045 (E) { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x06, 0x0F, 0x00}, // U+0046 (F) { 0x3C, 0x66, 0x03, 0x03, 0x73, 0x66, 0x7C, 0x00}, // U+0047 (G) { 0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00}, // U+0048 (H) { 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0049 (I) { 0x78, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E, 0x00}, // U+004A (J) { 0x67, 0x66, 0x36, 0x1E, 0x36, 0x66, 0x67, 0x00}, // U+004B (K) { 0x0F, 0x06, 0x06, 0x06, 0x46, 0x66, 0x7F, 0x00}, // U+004C (L) { 0x63, 0x77, 0x7F, 0x7F, 0x6B, 0x63, 0x63, 0x00}, // U+004D (M) { 0x63, 0x67, 0x6F, 0x7B, 0x73, 0x63, 0x63, 0x00}, // U+004E (N) { 0x1C, 0x36, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00}, // U+004F (O) { 0x3F, 0x66, 0x66, 0x3E, 0x06, 0x06, 0x0F, 0x00}, // U+0050 (P) { 0x1E, 0x33, 0x33, 0x33, 0x3B, 0x1E, 0x38, 0x00}, // U+0051 (Q) { 0x3F, 0x66, 0x66, 0x3E, 0x36, 0x66, 0x67, 0x00}, // U+0052 (R) { 0x1E, 0x33, 0x07, 0x0E, 0x38, 0x33, 0x1E, 0x00}, // U+0053 (S) { 0x3F, 0x2D, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0054 (T) { 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x00}, // U+0055 (U) { 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // U+0056 (V) { 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00}, // U+0057 (W) { 0x63, 0x63, 0x36, 0x1C, 0x1C, 0x36, 0x63, 0x00}, // U+0058 (X) { 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x0C, 0x1E, 0x00}, // U+0059 (Y) { 0x7F, 0x63, 0x31, 0x18, 0x4C, 0x66, 0x7F, 0x00}, // U+005A (Z) { 0x1E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1E, 0x00}, // U+005B ([)
{ 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00},   // U+005C (\)
{ 0x1E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1E, 0x00},   // U+005D (]) { 0x08, 0x1C, 0x36, 0x63, 0x00, 0x00, 0x00, 0x00}, // U+005E (^) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF}, // U+005F (_) { 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0060 (`) { 0x00, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x6E, 0x00}, // U+0061 (a) { 0x07, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00}, // U+0062 (b) { 0x00, 0x00, 0x1E, 0x33, 0x03, 0x33, 0x1E, 0x00}, // U+0063 (c) { 0x38, 0x30, 0x30, 0x3e, 0x33, 0x33, 0x6E, 0x00}, // U+0064 (d) { 0x00, 0x00, 0x1E, 0x33, 0x3f, 0x03, 0x1E, 0x00}, // U+0065 (e) { 0x1C, 0x36, 0x06, 0x0f, 0x06, 0x06, 0x0F, 0x00}, // U+0066 (f) { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+0067 (g) { 0x07, 0x06, 0x36, 0x6E, 0x66, 0x66, 0x67, 0x00}, // U+0068 (h) { 0x0C, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0069 (i) { 0x30, 0x00, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E}, // U+006A (j) { 0x07, 0x06, 0x66, 0x36, 0x1E, 0x36, 0x67, 0x00}, // U+006B (k) { 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+006C (l) { 0x00, 0x00, 0x33, 0x7F, 0x7F, 0x6B, 0x63, 0x00}, // U+006D (m) { 0x00, 0x00, 0x1F, 0x33, 0x33, 0x33, 0x33, 0x00}, // U+006E (n) { 0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00}, // U+006F (o) { 0x00, 0x00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x0F}, // U+0070 (p) { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x78}, // U+0071 (q) { 0x00, 0x00, 0x3B, 0x6E, 0x66, 0x06, 0x0F, 0x00}, // U+0072 (r) { 0x00, 0x00, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x00}, // U+0073 (s) { 0x08, 0x0C, 0x3E, 0x0C, 0x0C, 0x2C, 0x18, 0x00}, // U+0074 (t) { 0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x6E, 0x00}, // U+0075 (u) { 0x00, 0x00, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // U+0076 (v) { 0x00, 0x00, 0x63, 0x6B, 0x7F, 0x7F, 0x36, 0x00}, // U+0077 (w) { 0x00, 0x00, 0x63, 0x36, 0x1C, 0x36, 0x63, 0x00}, // U+0078 (x) { 0x00, 0x00, 0x33, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+0079 (y) { 0x00, 0x00, 0x3F, 0x19, 0x0C, 0x26, 0x3F, 0x00}, // U+007A (z) { 0x38, 0x0C, 0x0C, 0x07, 0x0C, 0x0C, 0x38, 0x00}, // U+007B ({) { 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00}, // U+007C (|) { 0x07, 0x0C, 0x0C, 0x38, 0x0C, 0x0C, 0x07, 0x00}, // U+007D (}) { 0x6E, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+007E (~) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} // U+007F };

Регулярные выражения в PHP.

 Arduino  Комментарии к записи Регулярные выражения в PHP. отключены
Окт 262019
 

Регулярные выражения в PHP.

Регулярные выражения позволяют найти в строке последовательности, соответствующие шаблону. Например шаблон «Вася(.*)Пупкин» позволит найти последовательность когда между словами Вася и Пупкин будет любое количество любых символов. Если надо найти шесть цифр, то пишем «[0-9]{6}» (если, например, от шести до восьми цифр, тогда «[0-9]{6,8}»). Здесь разделены такие вещи как указатель набора символов и указатель необходимого количества:

<набор символов><квантификатор><жадность>

Вместо набора символов может быть использовано обозначение любого символа — точка, может быть указан конкретный набор символов (поддерживаются последовательности — упоминавшиеся «0-9»). Может быть указано «кроме данного набора символов».

Указатель количества символов в официальной документации по php называется «квантификатор». Термин удобный и не несет в себе кривотолков. Итак, квантификатор может иметь как конкретное значение — либо одно фиксированное («{6}»), либо как числовой промежуток («{6,8}»), так и абстрактное «любое число, в т.ч. 0» («*»), «любое натуральное число» — от 1 до бесконечности («+»: «document[0-9]+.txt»), «либо 0, либо 1» («?»). По умолчанию квантификатор для данного набора символов равен единице («document[0-9].txt»).

Для более гибкого поиска сочетаний эти связки «набор символов — квантификатор» можно объединять в метаструктуры.

Как всякий гибкий инструмент, регулярные выражения гибки, но не абсолютно: зона их применения ограничена. Например, если вам надо заменить в тексте одну фиксированную строку на другую, фиксированную опять же, пользуйтесь str_replace. Разработчики php слезно умоляют не пользоваться ради этого сложными функциями ereg_replace или preg_replace, ведь при их вызове происходит процесс интерпретации строки, а это серьезно потребляет ресурсы системы. К сожалению, это любимые грабли начинающих php-программистов.

Пользуйтесь функциями регулярных выражений только если вы не знаете точно, какая «там» строка. Из примеров: поисковый код , в котором из строки поиска вырезаются служебные символы и короткие слова а так же вырезаются лишние пробелы (вернее, все пробелы сжимаются: » +» заменяется на один пробел). При помощи этих функций я проверяю email пользователя, оставляющего свой отзыв. Много полезного можно сделать, но важно иметь в виду: регулярные выражения не всесильны. Например, сложную замену в большом тексте ими лучше не делать. Ведь, к примеру, комбинация «(.*)» в программном плане означает перебор всех символов текста. А если шаблон не привязан к началу или концу строки, то и сам шаблон «двигается» программой через весь текст, и получается двойной перебор, вернее перебор в квадрате. Нетрудно догадаться, что еще одна комбинация «(.*)» означает перебор в кубе, и так далее. Возведите в третью степень, скажем, 5 килобайт текста. Получается 125 000 000 000 (прописью: сто двадцать пять миллиардов операций). Конечно же, если подходить строго, там стольких операций не будет, а будет раза в четыре-восемь меньше, но важен сам порядок цифр.

Набор символов

. точка любой символ
[<символы>] квадратные скобки класс символов («любое из»). Например [abcdef]
[^<символы>] негативный класс символов («любое кроме»)
тире обозначение последовательности в классе символов («[0-9]» — цифры)
\d [0-9] Только цифры
\D [^0-9] Кроме цифр
\w [a-z0-9] Буквы и цифры
\W [^a-z0-9] Кроме букв и цифр
\s [ ] Пробельные символы: пробел, табуляция, перевод строки
\S [^ ] Кроме пробельных символов
| (одно|другое) На этом месте может быть один из перечисленных вариантов, например: (Вася|Петя|Маша). Если Вы не хотите, чтобы это попало в выборку используйте (?: … )

Не пользуйтесь классом символов для обозначения всего лишь одного (вместо «[ ]+» вполне сойдет » +»). Не пишите в классе символов точку — это ведь любой символ, тогда другие символы в классе будут просто лишними (а в негативном классе получится отрицание всех символов).

Квантификатор

Квантификатором можно указать как конкретное значение, так и пределы. Если число заданных подпадает под пределы квантификатора, фрагмент выражения считается совпавшим с разбираемой строкой. Синтаксис:

{<количество>}

либо

{<минимум>, <максимум>}

Если нужно указать только необходимый минимум, а максимума нет, просто ставим запятую и не пишем второе число: «{5,}» («минимум 5»). Для наиболее часто употребляемых квантификаторов есть специальные обозначения:

* «звёздочка» или знак умножения {0,}
+ плюс {1,}
? вопросительный знак {0,1}

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

Якоря

^ привязка к началу строки
$ привязка к концу строки

Эти символы должны стоять соответственно в самом начале и в самом конце строки.

Жадность

Вопросительный знак выступает еще и как минимизатор квантификатора:
.*?

<? $str = '[b]жирный текст [b]а тут - еще жирнее[/b] вернулись[/b]'; $to = '<b>$1</b>'; $re1 = '|\[b\] (.*) \[/b\]|ixs'; $re2 = '|\[b\] (.*?) \[/b\]|ixs'; $result = preg_replace($re1, $to, $str); echo "Жадная версия: ".htmlspecialchars($result,null,'windows-1251')."<br />"; $result = preg_replace($re2, $to, $str); echo "Ленивая версия: ".htmlspecialchars($result,null,'windows-1251')."<br />"; ?>

Результат работы примера:

Жадная версия: <b>жирный текст [b]а тут - еще жирнее[/b] вернулись</b> Ленивая версия: <b>жирный текст [b]а тут - еще жирнее</b> вернулись[/b]

Строка шаблона, как вы уже заметили, начинается и заканчивается слэшами. После второго идут параметры:

i регистронезависимый поиск
m многостроковый режим. По умолчанию PCRE ищет совпадения с шаблоном только внутри одной строки, а символы «^» и «$» совпадают только с началом и концом всего текста. Когда этот параметр установлен, «^» и «$» совпадают с началом и концом отдельных строк.
s символ «.» (точка) совпадает и с переносом строки (по умолчанию — нет)
A привязка к началу текста
E заставляет символ «$» совпадать только с концом текста. Игнорируется, если установлен парамерт m.
U Инвертирует «жадность» для каждого квантификатора (если же после квантификатора стоит «?», этот квантификатор перестает быть «жадным»).
e Строка замены интерпретитуется как PHP код.

Функции для работы с регулярными выражениями

  • preg_grep — Возвращает массив вхождений, которые соответствуют шаблону
  • preg_match — Выполняет проверку на соответствие регулярному выражению. Данная функция ищет только первое совпадение!
  • preg_match_all — Выполняет глобальный поиск шаблона в строке
  • preg_quote — Экранирует символы в регулярных выражениях. Т.е. вставляет слэши перед всеми служебными символами (например, скобками, квадратными скобками и т.п.), чтобы те воспринимались буквально. Если у вас есть какой-либо ввод информации пользователем, и вы проверяете его с помощью регулярных выражений, то лучше перед этим заэкранировать служебные символы в пришедшей переменной
  • preg_replace — Выполняет поиск и замену по регулярному выражению
  • preg_replace_callback — Выполняет поиск по регулярному выражению и замену
  • preg_split — Разбивает строку по регулярному выражению

preg_grep

Функция preg_grep — Возвращает массив вхождений, которые соответствуют шаблону

Синтаксис

array preg_grep (string pattern, array input [, int flags])

preg_grep() возвращает массив, состоящий из элементов входящего массива input, которые соответствуют заданному шаблону pattern.

Параметр flags может принимать следующие значения:

PREG_GREP_INVERT
В случае, если этот флаг установлен, функция preg_grep(), возвращает те элементы массива, которые не соответствуют заданному шаблону pattern.
Результат, возвращаемый функцией preg_grep() использует те же индексы, что и массив исходных данных. Если такое поведение вам не подходит, примените array_values() к массиву, возвращаемому preg_grep() для реиндексации.
Пример кода:

// Возвращает все элементы массива, // содержащие числа с плавающей точкой $fl_array = preg_grep("/^(\d+)?\.\d+$/", $array);

preg_match

Функция preg_match — Выполняет проверку на соответствие регулярному выражению

Синтаксис

int preg_match ( string pattern, string subject [, array matches [, int flags [, int offset]]]) Ищет в заданном тексте subject совпадения с шаблоном pattern

В случае, если дополнительный параметр matches указан, он будет заполнен результатами поиска. Элемент $matches[0] будет содержать часть строки, соответствующую вхождению всего шаблона, $matches[1] — часть строки, соответствующую первой подмаске, и так далее.

flags может принимать следующие значения:

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

Поиск осуществляется слева направо, с начала строки. Дополнительный параметр offset может быть использован для указания альтернативной начальной позиции для поиска. Аналогичного результата можно достичь, заменив subject на substr()($subject, $offset).

Функция preg_match() возвращает количество найденных соответствий. Это может быть 0 (совпадения не найдены) и 1, поскольку preg_match() прекращает свою работу после первого найденного совпадения. Если необходимо найти либо сосчитать все совпадения, следует воспользоваться функцией preg_match_all(). Функция preg_match() возвращает FALSE в случае, если во время выполнения возникли какие-либо ошибки.

Рекомендация: Не используйте функцию preg_match(), если необходимо проверить наличие подстроки в заданной строке. Используйте для этого strpos() либо strstr(), поскольку они выполнят эту задачу гораздо быстрее.

Пример кода

<?php // Символ "i" после закрывающего ограничителя шаблона означает // регистронезависимый поиск. if (preg_match("/php/i", "PHP is the web scripting language of choice.")) { echo "Вхождение найдено."; } else { echo "Вхождение не найдено."; } ?>

Пример кода

<?php /* Специальная последовательность \b в шаблоне означает границу слова, следовательно, только изолированное вхождение слова 'web' будет соответствовать маске, в отличие от "webbing" или "cobweb". */ if (preg_match("/\bweb\b/i", "PHP is the web scripting language of choice.")) { echo "Вхождение найдено."; } else { echo "Вхождение не найдено."; } if (preg_match("/\bweb\b/i", "PHP is the website scripting language of choice.")) { echo "Вхождение найдено."; } else { echo "Вхождение не найдено."; } ?>

Пример кода

<?php // Извлекаем имя хоста из URL preg_match("/^(http:\/\/)?([^\/]+)/i", "http://www.htmlweb.ru/index.html", $matches); $host = $matches[2]; // извлекаем две последние части имени хоста preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches); echo "domain name is: {$matches[0]}\n"; ?>

Результат работы примера:

domain name is: htmlweb.ru

preg_match_all

Функция preg_match_all — Выполняет глобальный поиск шаблона в строке

Синтаксис

int preg_match_all (string pattern, string subject, array matches [, int flags [, int offset]])

Ищет в строке subject все совпадения с шаблоном pattern и помещает результат в массив matches в порядке, определяемом комбинацией флагов flags.

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

Дополнительный параметр flags может комбинировать следующие значения (необходимо понимать, что использование PREG_PATTERN_ORDER одновременно с PREG_SET_ORDER бессмысленно):

PREG_PATTERN_ORDER
Если этот флаг установлен, результат будет упорядочен следующим образом: элемент $matches[0] содержит массив полных вхождений шаблона, элемент $matches[1] содержит массив вхождений первой подмаски, и так далее.

Пример кода

<?php preg_match_all("|<[^>]+>(.*)</[^>]+>|U", "<b>example: </b><div align=left>this is a test</div>", $out, PREG_PATTERN_ORDER); echo $out[0][0] . ", " . $out[0][1] . "\n"; echo $out[1][0] . ", " . $out[1][1] . "\n"; ?>

Результат работы примера:

<b>example: </b>, <div align="left">this is a test</div> example: , this is a test

Как мы видим, $out[0] содержит массив полных вхождений шаблона, а элемент $out[1] содержит массив подстрок, содержащихся в тегах.

PREG_SET_ORDER
Если этот флаг установлен, результат будет упорядочен следующим образом: элемент $matches[0] содержит первый набор вхождений, элемент $matches[1] содержит второй набор вхождений, и так далее.

Пример кода

<?php preg_match_all("|<[^>]+>(.*)</[^>]+>|U", "<b>example: </b><div align=\"left\">this is a test</div>", $out, PREG_SET_ORDER); echo $out[0][0] . ", " . $out[0][1] . "\n"; echo $out[1][0] . ", " . $out[1][1] . "\n"; ?>

Результат работы примера:

<b>example: </b>, example: <div align="left">this is a test</div>, this is a test

В таком случае массив $matches[0] содержит первый набор вхождений, а именно: элемент $matches[0][0] содержит первое вхождение всего шаблона, элемент $matches[0][1] содержит первое вхождение первой подмаски, и так далее. Аналогично массив $matches[1] содержит второй набор вхождений, и так для каждого найденного набора.

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

В случае, если никакой флаг не используется, по умолчанию используется PREG_PATTERN_ORDER.

Поиск осуществляется слева направо, с начала строки. Дополнительный параметр offset может быть использован для указания альтернативной начальной позиции для поиска. Аналогичного результата можно достичь, заменив subject на substr()($subject, $offset).

Возвращает количество найденных вхождений шаблона (может быть нулем) либо FALSE, если во время выполнения возникли какие-либо ошибки.

Пример кода

<?php preg_match_all("/\(? (\d{3})? \)? (?(1) [\-\s] ) \d{3}-\d{4}/x", "Call 555-1212 or 1-800-555-1212", $phones); ?>

Пример кода

<?php // Запись \\2 является примером использования ссылок на подмаски. // Она означает необходимость соответствия подстроки строке, зафиксированной // второй подмаской, в нашем примере это ([\w]+). // Дополнительный слеш необходим, так как используются двойные кавычки. $html = "<b>bold text</b><a href=howdy.html>click me</a>"; preg_match_all("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $html, $matches); for ($i=0; $i< count($matches[0]); $i++) { echo "matched: " . $matches[0][$i] . "\n"; echo "part 1: " . $matches[1][$i] . "\n"; echo "part 2: " . $matches[3][$i] . "\n"; echo "part 3: " . $matches[4][$i] . "\n\n"; } ?>

Результат работы примера:

matched: <b>bold text</b> part 1: <b> part 2: bold text part 3: </b> matched: <a href=howdy.html>click me</a> part 1: <a href=howdy.html> part 2: click me part 3: </a>

preg_quote

Функция preg_quote — Экранирует символы в регулярных выражениях

Синтаксис

string preg_quote (string str [, string delimiter])

Функция preg_quote() принимает строку str и добавляет обратный слеш перед каждым служебным символом. Это бывает полезно, если в составлении шаблона участвуют строковые переменные, значение которых в процессе работы скрипта может меняться.

В случае, если дополнительный параметр delimiter указан, он будет также экранироваться. Это удобно для экранирования ограничителя, который используется в PCRE функциях. Наиболее распространенным ограничителем является символ ‘/’.

В регулярных выражениях служебными считаются следующие символы: . \\ + * ? [ ^ ] $ ( ) { } = ! < > | :

Пример кода

<?php $keywords = "$40 for a g3/400"; $keywords = preg_quote($keywords, "/"); echo $keywords; // возвращает \$40 for a g3\/400 ?>

Пример кода

<?php // Выделение курсивом слова в тексте // В данном примере preg_quote($word) используется, чтобы // избежать трактовки символа '*' как спец. символа. $textbody = "This book is *very* difficult to find."; $word = "*very*"; $textbody = preg_replace ("/" . preg_quote($word) . "/", "<i>" . $word . "</i>", $textbody); echo $textbody; ?>

Результат работы примера:

This book is <i>*very*</i> difficult to find.

preg_replace

Функция preg_replace — Выполняет поиск и замену по регулярному выражению

Синтаксис

mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])

Выполняет поиск в строке subject совпадений с шаблоном pattern и заменяет их на replacement. В случае, если параметр limit указан, будет произведена замена limit вхождений шаблона; в случае, если limit опущен либо равняется -1, будут заменены все вхождения шаблона.

Replacement может содержать ссылки вида \\n либо (начиная с PHP 4.0.4) $n, причем последний вариант предпочтительней. Каждая такая ссылка, будет заменена на подстроку, соответствующую n’нной заключенной в круглые скобки подмаске. n может принимать значения от 0 до 99, причем ссылка \\0 (либо $0) соответствует вхождению всего шаблона. Подмаски нумеруются слева направо, начиная с единицы.

При использовании замены по шаблону с использованием ссылок на подмаски может возникнуть ситуация, когда непосредственно за маской следует цифра. В таком случае нотация вида \\n приводит к ошибке: ссылка на первую подмаску, за которой следует цифра 1, запишется как \\11, что будет интерпретировано как ссылка на одиннадцатую подмаску. Это недоразумение можно устранить, если воспользоваться конструкцией \${1}1, указывающей на изолированную ссылку на первую подмаску, и следующую за ней цифру 1.

Пример кода

<?php $string = "April 15, 2003"; $pattern = "/(\w+) (\d+), (\d+)/i"; $replacement = "\${1}1,\$3"; echo preg_replace($pattern, $replacement, $string); ?>

Результатом работы этого примера будет:

April1,2003.

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

Первые три параметра функции preg_replace() могут быть одномерными массивами. В случае, если массив использует ключи, при обработке массива они будут взяты в том порядке, в котором они расположены в массиве. Указание ключей в массиве для pattern и replacement не является обязательным. Если вы все же решили использовать индексы, для сопоставления шаблонов и строк, участвующих в замене, используйте функцию ksort() для каждого из массивов.

<?php // Использование массивов с числовыми индексами в качестве аргументов // функции preg_replace() $string = "The quick brown fox jumped over the lazy dog."; $patterns[0] = "/quick/"; $patterns[1] = "/brown/"; $patterns[2] = "/fox/"; $replacements[2] = "bear"; $replacements[1] = "black"; $replacements[0] = "slow"; echo preg_replace($patterns, $replacements, $string); ?>

The bear black slow jumped over the lazy dog.
Используя ksort(), получаем желаемый результат:

<?php ksort($patterns); ksort($replacements); echo preg_replace($patterns, $replacements, $string); ?>

The slow black bear jumped over the lazy dog.

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

В случае, если параметры pattern и replacement являются массивами, preg_replace() поочередно извлекает из обоих массивов по паре элементов и использует их для операции поиска и замены. Если массив replacement содержит больше элементов, чем pattern, вместо недостающих элементов для замены будут взяты пустые строки. В случае, если pattern является массивом, а replacement — строкой, по каждому элементу массива pattern будет осущесвтлен поиск и замена на pattern (шаблоном будут поочередно все элементы массива, в то время как строка замены остается фиксированной). Вариант, когда pattern является строкой, а replacement — массивом, не имеет смысла.

Модификатор /e меняет поведение функции preg_replace() таким образом, что параметр replacement после выполнения необходимых подстановок интерпретируется как PHP-код и только после этого используется для замены. Используя данный модификатор, будьте внимательны: параметр replacement должен содержать корректный PHP-код, в противном случае в строке, содержащей вызов функции preg_replace(), возникнет ошибка синтаксиса.

Пример кода: Замена по нескольким шаблонам

<?php // Замена по нескольким шаблонам $patterns = array ("/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/", "/^\s*{(\w+)}\s*=/"); $replace = array ("\\3/\\4/\\1\\2", "$\\1 ="); echo preg_replace($patterns, $replace, "{startDate} = \"1999-5-27\";"); ?>

Этот пример выведет:

$startDate = «5/27/1999»;

Пример кода: Использование модификатора /e

<?php // Использование модификатора /e preg_replace("/(<\/?)(\w+)([^>]*>)/e", "'\\1'.strtoupper('\\2').'\\3'", $html_body); ?>

Пример кода: Преобразует все HTML-теги к верхнему регистру

<?php // Конвертор HTML в текст // $document на выходе должен содержать HTML-документ. // Необходимо удалить все HTML-теги, секции javascript, // пробельные символы. Также необходимо заменить некоторые // HTML-сущности на их эквивалент. $search = array ("'<script[^>]*?>.*?</script>'si", // Вырезает javaScript "'<[\/\!]*?[^<>]*?>'si", // Вырезает HTML-теги "'([\r\n])[\s]+'", // Вырезает пробельные символы "'&(quot|#34);'i", // Заменяет HTML-сущности "'&(amp|#38);'i", "'&(lt|#60);'i", "'&(gt|#62);'i", "'&(nbsp|#160);'i", "'&(iexcl|#161);'i", "'&(cent|#162);'i", "'&(pound|#163);'i", "'&(copy|#169);'i", "'&#(\d+);'e"); // интерпретировать как php-код $replace = array ("", "", "\\1", "\"", "&", "<", ">", " ", chr(161), chr(162), chr(163), chr(169), "chr(\\1)"); $text = preg_replace($search, $replace, $document); ?>

preg_replace_callback

Функция preg_replace_callback — Выполняет поиск по регулярному выражению и замену с использованием функции обратного вызова

Синтаксис

mixed preg_replace_callback (mixed pattern, callback callback, mixed subject [, int limit])

Поведение этой функции во многом напоминает preg_replace(), за исключением того, что вместо параметра replacement необходимо указывать callback функцию, которой в качестве входящего параметра передается массив найденных вхождений. Ожидаемый результат — строка, которой будет произведена замена.

Пример кода

<?php /* фильтр, подобный тому, что используется в системах Unix для преобразования в заглавные начальных букв параграфа */ $fp = fopen("php://stdin", "r") or die("can't read stdin"); while (!feof($fp)) { $line = fgets($fp); $line = preg_replace_callback( '|<p>\s*\w|', create_function( // Использование одиночных кавычек в данном случае принципиально, // альтернатива - экранировать все символы '$' '$matches', 'return strtolower($matches[0]);' ), $line ); echo $line; } fclose($fp); ?>

preg_split

Функция preg_split — Разбивает строку по регулярному выражению

Синтаксис

array preg_split (string pattern, string subject [, int limit [, int flags]])

Возвращает массив, состоящий из подстрок заданной строки subject, которая разбита по границам, соответствующим шаблону pattern.

В случае, если параметр limit указан, функция возвращает не более, чем limit подстрок. Специальное значение limit, равное -1, подразумевает отсутствие ограничения, это весьма полезно для указания еще одного опционального параметра flags.

flags может быть произвольной комбинацией следующих флагов (соединение происходит при помощи оператора ‘|’):

PREG_SPLIT_NO_EMPTY
В случае, если этот флаг указан, функция preg_split() вернет только непустые подстроки.

PREG_SPLIT_DELIM_CAPTURE
В случае, если этот флаг указан, выражение, заключенное в круглые скобки в разделяющем шаблоне, также извлекается из заданной строки и возвращается функцией. Этот флаг был добавлен в PHP 4.0.5.

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

Примеры кода

<?php // Получение подстрок из заданного текста // разбиваем строку по произвольному числу запятых и пробельных символов, // которые включают в себя " ", \r, \t, \n и \f $keywords = preg_split("/[\s,]+/", "hypertext language, programming"); ?>
<?php // Разбиваем строку на составляющие символы $str = 'string'; $chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY); print_r($chars); ?>
<?php $str = 'hypertext language programming'; $chars = preg_split('/ /', $str, -1, PREG_SPLIT_OFFSET_CAPTURE); print_r($chars); ?>

В случае, если после открывающей круглой скобки следует «?:«, захват строки не происходит, и текущая подмаска не нумеруется. Например, если строка «the white queen» сопоставляется с шаблоном the ((?:red|white) (king|queen)), будут захвачены подстроки «white queen» и «queen», и они будут пронумерованы 1 и 2 соответственно:

$r="/the ((?:red|white) (king|queen))/"; 0="the white king"; 1="white king"; 2="king"; 

Еще про регулярные выражения:

Полный список команд языка Ардуино

 Arduino  Комментарии к записи Полный список команд языка Ардуино отключены
Окт 172019
 

Полный список команд языка Ардуино

На этой странице представлен список всех (или почти всех) доступных “из коробки” команд для Arduino с кратким описанием и примерами. Часть информации взята из Гугла, в основном некоторые особенности языка, часть получена методом проб и ошибок. Полную информацию о том, как этим пользоваться, можно получить из уроков или официального reference. Также изо всех сил рекомендую вот этот онлайн справочник по C++, из него можно узнать гораздо больше о некоторых особенностях использования операторов и типов данных.

Содержание

  1. Структура скетча
    1. Синтаксис, структура кода
    2. Условия (if, switch)
    3. Циклы (for, while)
  2. Операторы
    1. Запятая ,
    2. Арифметические
    3. Сравнение и логика
    4. Составные операторы
    5. Битовые операции
    6. Указатели и ссылки
  3. Работа с данными
    1. Типы данных, переменные
    2. Структуры
    3. Перечисления
    4. Классы
    5. Массивы
    6. Строки (объект String)
    7. Спецификаторы переменных
    8. Преобразование типов данных
    9. “Символьные” функции
  4. Работа с цифрами
    1. Целые и дробные числа
    2. Математические функции и константы
    3. Псевдослучайные числа
    4. Биты и байты
  5. Ввод-вывод
    1. Цифровые пины
    2. Аналоговые пины
    3. Аппаратные прерывания
    4. Генерация и обработка сигналов
  6. Другое
    1. Работа с Serial
    2. Функции времени
    3. Встроенные макро/константы
    4. Утилиты
  7. Другие операторы и слова

Структура скетча

Синтаксис, структура кода

Arduino проект выходного дня – футболка на светодио дах SK6812

 Arduino  Комментарии к записи Arduino проект выходного дня – футболка на светодио дах SK6812 отключены
Сен 162019
 

Arduino проект выходного дня – футболка на светодиодах SK6812

Добрый вечер! Хотите произвести впечатление на друзей? Или просто шокировать прохожих теплым летним вечером? Сделайте светодиодную футболку! Представляю Arduino проект выходного дня – эксклюзивная светодиодная футболка. Как она будет смотреться, увидите в ролике. А пока фото.

a8ce3f6346f54f69a3407cfa91a530d2.jpg

Я потратил на изготовление этой футболки два вечера, а потом еще неделю игрался, выдумывая различные фигуры для её оживления. Из чего это сделано:

1. Arduino Nano – она маленькая и её очень удобно вшивать в подобные конструкции. Только ножки отпаяйте!
2. 64 светодиода SK6812. Для матрицы 8 х 8. Это RGBW светодиоды с пиксельной адресацией. RGBW – это значит, что в них три кристалла RGB и одна “яичница” белого свечения. Очень яркая!
3. Кнопка для смены эффектов.
4. Аккумулятор 1800 мА.час.
5. Провод МГТФ.
6. Припой, флюс, и 8 часов свободного времени.

Что должно получится:

Носимую матрицу 8 х 8 делаем так – берем лоскут ткани 20 на 20 см. и приклеиваем к ней «Моментом» все 64 светодиода на расстоянии 2,5 см. Обратите внимание – первая строчка из восьми светодиодов яичницей вверх, втора вниз, затем вверх, вниз и.т.д. Если перепутаете замучаетесь соединять… Держаться они очень крепко отодрать можно только с тканью. Дальше соединяем их по схеме:

39b832365bfc436ea859b622528ab30c.jpg
Здесь тоже строго. В скетче описана матрица из светодиодов сигнальные линии, которых соединяются как на схеме. Сверху вниз и поочередно слева направо, затем справа налево.

Питание светодиодов в любом направлении. Питание я делал тоже “змейкой”. Вход первого светодиода подключаем к 12 входу ардуины. Сама ардуина пришита на этот же лоскут. Маленькая Nano, без ножек её под футболкой почти не видно.

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

В конструкции ещё есть кнопка для смены эффектов и аккумулятор. Они пока в заднем кармане.

Теперь о скетче. Писать, рисовать очень просто. В ролике на футболке у моей помощнице Екатерины сначала поочередно зажигаются буквы – KATRINDETKA. Ниже проиллюстрировано как написать букву K. Первая строчка буквы – 11100011. 1 – светодиоды светятся, 0 – нет.

Виндусовым калькулятором в режиме программиста переводим бинарный код в HEX получаем 0xE3.

В скетче (файл LEDS_64_panel.h) смотрим на строчку:

const uint8_t DIG_0[] PROGMEM = { 0xE3, 0xE7, 0xEE, 0xFC, 0xFC, 0xEE, 0xE7, 0xE3, }; //k

Это буква К, все восемь строчек. Первая строчка как раз 0xE3. Мне кажется дальше всё понятно.

1d92ca1bb8ce489a9188d2b0e980a5ae.jpg

Это отображение картинки в байтах. Но можно и бинарном коде без перевода в HEX. Ищите ниже массив:

const uint8_t SQUARE_1[PIXEL_NUM] PROGMEM = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, };

Это квадрат на футболке. На видео после нажатия кнопки. Он описывается просто в двоичном коде. Можно изменить цвет и яркость фона или рисунка.

BACK_COLOUR
MAIN_COLOUR

Можно изменить частоту кадров

SHOW_DELAY
TETRIS_DELAY

Схема очень простая, скетч тоже. Работа очень кропотливая! Зато результат невероятно красивая техно одежда. Видео не передает и десятую долю вау эффекта.

Как работают светодиоды с пиксельной адресацией, рассказывать не буду. Просто сделайте красивую вещь!

Хороших вам выходных!
Скетч LEDS_64_panel.h

p.s. Очень удобно для рисования использовать редактор шрифтов, коих в интернете немерено. Мне понравился этот. Он же на последней картинке за калькулятором. Генерит строчки в С.

И ещё — будут нужны библиотеки: Adafruit_NeoPixel и PinChangeInt. Найдёте у Ады ладно?

Добавлено 09.06.2017
Скетч для цветной матрицы. Скачать.
и ролик с демонстрацией

Теги:

ЧИТАЮТ СЕЙЧАС

Китайский повышающий блок

 Arduino  Комментарии к записи Китайский повышающий блок отключены
Сен 092019
 

Здравствуйте. Имеется идея изготовления повышающих dc-dc преобразователей, которые продаются на Ali-express, в домашних условиях.

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

Схему нашёл на просторах ютуба у одного человека на канале, добра ему.

Помогите определить номинал C1, C2, C7, C8, C9, C10

tl494.jpg

Изготовление плат

 Arduino  Комментарии к записи Изготовление плат отключены
Авг 212019
 

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

Итак, вводная – надо собрать дюжину плат с SMD-деталями типоразмера 0603 и Bluetooth-модулем на CC2541. Плату я нарисовал в DipTrace, заказал в Резоните изготовление собственно плат, а в OSH Stencils – трафарета из полиимидной пленки. Детали куплены частично на алиэкспрессе (собственно сами Bluetooth-модули), а частично – в Чип-и-Дипе и Электронщике. И вот со всей этой фигней мы попытаемся взлететь 🙂

paste-printer

По-хорошему, нужен трафаретный принтер, который натягивает трафарет и правильно позиционирует его относительно платы, и есть даже неплохие “самодельные” варианты – но для кустарных условий сойдет и такое приспособление из обрезков других плат той же толщины.

paste-ready

Паста размазывается чем-нибудь типа шпателя или пластиковой карты, при небольшом навыке это делается довольно быстро и непринужденно – на 12 плат у меня ушло меньше 10 минут.

placing

Расстановка деталей – довольно муторный этап, особенно, если делать это обычным пинцетом – но с перерывами я расставил две сотни деталей за два часа. Для сравнения – у самого-самого простого “любительского” установщика типа какого-нибудь Liteplacer заявленная производительность составляет 500-600 деталей в час (хотя с учетом времени на его программирование этот процесс занял бы примерно то же время).

Ручную расстановку можно ускорить, если пользоваться вакуумным пинцетом – только не фигней с резиновой грушей, которыми завален Чип-и-Дип, а чем-то вроде авторучки с прицепленным к ней аквариумным компрессором – не надо вытряхивать детали из ленты, а потом долго и мучительно переворачивать резисторы. Хотя если честно – я подумываю, из чего бы сколхозить ручной манипулятор для установки SMD-компонентов, мне кажется, это могло бы быть еще удобнее.

into-the-oven

Дальше загружаем платы в печку.

oven-running

Это обычная бытовая электродуховка, снабженная специальным контролером, который обеспечивает “правильный” температурный профиль. Цикл пайки занимает несколько минут.

oven-done

В течение еще нескольких минут платы остывают.

boards

Готово! Остается запаять лишь пару разъемов.