Geosan

Шрифты 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

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

Монтаж

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

Монтаж

И вот тут, конечно, начинается самое интересное — платы есть, компоненты есть, дальше-то что?

Главный тезис: современные платы паяльником вручную не собирают.

Даже на опытном производстве. Даже десять штук. Это попросту муторно, долго, неэффективно и некачественно. Ручная пайка нарушает главный принцип эффективности работы — монотонность. Ручная пайка — это постоянная, ежесекундная смена инструментов в руках. Если провозиться подольше не является вашей целью, так делать нельзя.

На современных платах абсолютное большинство компонентов — SMD, и более того, когда вы попробуете минимально пристойные методики сборки, вы будете плакать каждый раз, когда будете вынуждены ставить THD-компонент.

SMD-компоненты паяются пастой — смесью из флюса и микронного размера шариков припоя (мы используем Multicore CR36, но это не обязательно).

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

  • пневматическим — компрессором на 4-6 атмосфер (подойдёт любой с ресивером, чтобы обеспечить стабильность давления) и диспенсером типа такого. Диспенсер стоит у китайцев баксов сто и обеспечивает простую вещь — при нажатии педали подаёт в шприц с пастой воздух под заданным давлением в течение заданного времени, выжимая заданное количество пасты. Немного муторно, но среднего размера плату вы заплюёте минут за пятнадцать-двадцать, причём при определённой сноровке можно работать даже с компонентами 0402. Паста для диспенсеров продаётся уже в шприцах, мы используем EFD SolderPlus (точнее, почти не используем, ибо диспенсер минимум 364 дня в году просто покрывается пылью).
  • по трафарету — листу стали или пластика с вырезанными в нём отверстиями контактных площадок, толщиной 100-125 мкм. Трафарет кладётся сверху на плату, на него вываливается шлепок паяльной пасты и размазывается шпателем или просто пластиковой карточкой. В идеале для этого процесса нужен ручной трафаретный принтер, обеспечивающий вертикальное поднимание и опускание трафарета, но в небольших масштабах можно просто закреплять плату и трафарет малярным скотчем на столе. Обработка одной платы занимает, очевидно, всего пару минут.

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

wydtchrcepcswghlapp16zdsv_m.jpeg

Данная часть была бы не столь весёлой — трафарет штука довольно дорогая — если бы не одно чудесное изобретение человечества: режущий плоттер Silhouette Curio, предназначенный для вырезания аппликаций для скрапбуков, но также прекрасно справляющийся с «прозрачками» для проекторов. Последние имеют толщину 100 мкм — думаете, это просто так, совпадение?

Плоттер принимает на вход файлы DXF (причём в бесплатной версии софта; платная добавляет поддержку очень нужного для скрапбуков SVG) и без проблем справляется с компонентами размером вниз до SOIC и 0603. Пассивка 0402 выходит похуже, но ещё приемлемо, а во всяких QFN приходится убирать отдельные ножки и делать сплошную прорезь.

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

После вырезания и намазывания идёт расстановка деталей.

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

Поэтому базовый вариант — расстановка вручную. Самый простой и дешёвый вариант — вакуумный пинцет типа такого, то есть, по сути, ручка с аквариумным компрессором. Ручка имеет сменную иглу на конце и дырку на боку, закрываете дырку пальцем — игла притягивает детали, отпускаете палец — воздух идёт через дырку, деталь отваливается.

В отличие от обычных пинцетов, эта штука позволяет брать компоненты любой формы и с любой поверхности, в том числе прямо из лент, а в отличие от механических вакуумных пинцетов с кнопкой и резиновой грушей внутри, не даёт рывка при отпускании детали. Стоит такой пинцет копейки — меньше 1500 рублей у китайцев, а при желании можно сделать и самому натурально из аквариумного воздушного компрессора. Иголки со временем забиваются паяльной пастой, но без проблем покупаются отдельно, как наборами разного диаметра, так и пакетами одного диаметра по 10-20-50-100 штук.

Обычным пинцетом останется расставить только самые крупные компоненты, вроде процессоров в LQFP-корпусах.

Важный момент: на дворе XXI век, расстановку по бумажной распечатке из CAD’а никто уже не делает.

Для ручной расстановки есть небольшая и крайне полезная программа VisualPlace, которая всасывает в себя герберы, перечень компонентов и их координаты на плате — и показывает вам, где какой компонент должен стоять, а также в какой ориентации:

evkvnpabpeihivvznqryiljfoxa.png

Более того, VisualPlace умеет группировать компоненты по полю value, так что, взяв в руки катушку транзисторов SI2333 и ткнув в группу с ними, вы увидите сразу все места, где они должны стоять.

Авторами утилита писалась явно в первую очередь для себя (и, кстати, они же делают прекрасную маленькую терминалку Termite), поэтому, с одной стороны, она не перегружена ненужным хламом и красивыми иконками, с другой — есть много шероховатостей в понимании единиц измерения (дюймы или миллиметры), точки отсчёта координат в герберах (рекомендую всегда ставить начало на нижний левый угол платы) и т.п. На это иногда накладываются ещё и особенности CAD’ов — например, DipTrace на системе с русской локалью сохраняет числа с десятичным разделителем «,», а VisualPlace ждёт «.» независимо от локали.

Впрочем, подгонка выхлопа CAD под VisualPlace занимает от силы несколько минут, а пользу утилиты переоценить невозможно. Утилита официально бесплатна для коммерческого использования.

Где-то примерно в этот момент вы почувствуете всю прелесть такого подхода к монтажу. Сравните — паяльник:

  • в правую руку паяльник, в левую — припой
  • поставить каплю припоя на одну площадку резистора
  • отложить припой, отложить паяльник
  • вытряхнуть резистор из ленты, перевернуть маркировкой вверх
  • в левую руку пинцет, взять резистор пинцетом, поставить на плату
  • не отпуская резистор, взять в правую руку паяльник, прихватить ту площадку, на которую был нанесён припой
  • отложить пинцет, взять припой
  • прихватить вторую площадку
  • повторить для остальных 146 компонентов

Паста:

  • намазать всю плату пастой
  • взять вакуумный пинцет, расставить все компоненты прямо из лент и поддонов
  • сунуть плату в печку

О, да. После того, как вы расставили компоненты (ставить надо с небольшим усилием, чтобы они впечатались в пасту), приходит пора печки.

Задача печки — нагреть пасту с заданной скоростью до 140-160 градусов (температура активации и испарения флюса), потом до 220-230 (плавление припоя), подержать недолго и охладить.

Строго говоря, на совсем штучных изделиях можно прогревать пасту феном, но это годится только буквально на 5-10 экземпляров, а также подвергает компоненты серьёзному стрессу из-за больших градиентов температур. Печка же греет равномеро и плавно.

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

Собственно, всё. После запекания остаётся на компонентах с мелким шагом проверить ножки на предмет возможных залипаний (вопреки утверждениям в многочисленных руководствах — нет, паяльная паста далеко не всегда сама идеально собирается точно на ножке, если её чуть больше, чем надо, или размазана она сильнее, чем надо — поверхностного натяжения не хватит, чтобы разорвать перемычку между соседними ножками), всё найденное убрать обычным паяльником, на чипах с длинными ногами и мелким шагом, вроде LQFP или TSSOP с шагом 0,5 мм, — с оплёткой для выпайки.

Изменение размера изображения средствами PHP

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

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

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

<?php class SimpleImage { var $image; var $image_type; function load($filename) { $image_info = getimagesize($filename); $this->image_type = $image_info[2]; if( $this->image_type == IMAGETYPE_JPEG ) { $this->image = imagecreatefromjpeg($filename); } elseif( $this->image_type == IMAGETYPE_GIF ) { $this->image = imagecreatefromgif($filename); } elseif( $this->image_type == IMAGETYPE_PNG ) { $this->image = imagecreatefrompng($filename); } } function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) { if( $image_type == IMAGETYPE_JPEG ) { imagejpeg($this->image,$filename,$compression); } elseif( $image_type == IMAGETYPE_GIF ) { imagegif($this->image,$filename); } elseif( $image_type == IMAGETYPE_PNG ) { imagepng($this->image,$filename); } if( $permissions != null) { chmod($filename,$permissions); } } function output($image_type=IMAGETYPE_JPEG) { if( $image_type == IMAGETYPE_JPEG ) { imagejpeg($this->image); } elseif( $image_type == IMAGETYPE_GIF ) { imagegif($this->image); } elseif( $image_type == IMAGETYPE_PNG ) { imagepng($this->image); } } function getWidth() { return imagesx($this->image); } function getHeight() { return imagesy($this->image); } function resizeToHeight($height) { $ratio = $height / $this->getHeight(); $width = $this->getWidth() * $ratio; $this->resize($width,$height); } function resizeToWidth($width) { $ratio = $width / $this->getWidth(); $height = $this->getheight() * $ratio; $this->resize($width,$height); } function scale($scale) { $width = $this->getWidth() * $scale/100; $height = $this->getheight() * $scale/100; $this->resize($width,$height); } function resize($width,$height) { $new_image = imagecreatetruecolor($width, $height); imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight()); $this->image = $new_image; } } ?>

Скачать клаcc SimpleImage

Теперь после того как мы поместили данный файл класса SimpleImage к себе на сервер посмотрим как его можно использовать.

Следующий участок кода загрузит изображение image.jpg, изменить его ширину до 400 пикселей и высоту до 200 пикселей, а затем сохранит как image1.jpg.

<?php include('classSimpleImage.php'); $image = new SimpleImage(); $image->load('image.jpg'); $image->resize(400, 200); $image->save('image1.jpg'); ?>

Если необходимо изменить размеры изображения, основываясь только на ширине и при этом сохранить его пропорции, то сценарий сам выберет необходимую высоту. Для этого необходимо использовать метод resizeToWidth.

<?php include('classSimpleImage.php'); $image = new SimpleImage(); $image->load('image.jpg'); $image->resizeToWidth(250); $image->save('image1.jpg'); ?>

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

<?php include('classSimpleImage.php'); $image = new SimpleImage(); $image->load('image.jpg'); $image->scale(50); $image->save('image1.jpg'); ?>

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

<?php header('Content-Type: image/jpeg'); include('classSimpleImage.php'); $image = new SimpleImage(); $image->load('image.jpg'); $image->resizeToWidth(150); $image->output(); ?>

Автор данного класса Simon Jarvis, на своем сайте предлагает следующий пример для изменения размера изображения загруженного через форму.

<?php if (isset($_POST['submit']) ) { include('classSimpleImage.php'); $image = new SimpleImage(); $image->load($_FILES['uploaded_image']['tmp_name']); $image->resizeToWidth(150); $image->output(); } else { $form = '<form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="uploaded_image" /> <input type="submit" name="submit" value="Upload" /> </form>'; echo $form; }

Вот такой очень маленький, но довольно функциональный получился класс SimpleImage, который очень пригодиться любому разработчику.

Режимы для фрез/сверл/резьбофрез по металлам, ал юминию, дереву, пластикам

 Arduino  Комментарии к записи Режимы для фрез/сверл/резьбофрез по металлам, ал юминию, дереву, пластикам отключены
Авг 152019
 

Режимы для фрез/сверл/резьбофрез по металлам, алюминию, дереву, пластикам

Дерево/Пластики Алюминий (стр.58) Металлы (стр.59) Резьбофрезы (стр.61) Свёрла (стр.62)