// массив символов var image = { '0': [0x7C, 0x8A, 0x92, 0xA2, 0x7C], '1': [0x00, 0x42, 0xFE, 0x02, 0x00], '2': [0x42, 0x86, 0x8A, 0x92, 0x62], '3': [0x44, 0x82, 0x92, 0x92, 0x6C], '4': [0x10, 0x30, 0x50, 0xFE, 0x10], '5': [0xE4, 0xA2, 0xA2, 0xA2, 0x9C], '6': [0x3C, 0x52, 0x92, 0x92, 0x0C], '7': [0x80, 0x86, 0x98, 0xE0, 0x80], '8': [0x6C, 0x92, 0x92, 0x92, 0x6C], '9': [0x60, 0x92, 0x92, 0x94, 0x78], 'k': [0xFE, 0x08, 0x08, 0x14, 0x22], 'm': [0x3E, 0x20, 0x1C, 0x20, 0x1E], '/': [0x02, 0x0C, 0x10, 0x60, 0x80], 'h': [0xFE, 0x10, 0x10, 0x10, 0x0E] }; // массив пинов для подключения светодиодов var led = [A8, A6, A7, B1, B10, B13, B14, B15]; // радиус колеса в метрах var wheelRadius = 0.165; // количество пустых столбцов между буквами var spaceColomns = 1; // текст для отображения var toShow = ''; // угол отображения текста в радианах var tetta = 0.1; // счетчик обновления текста var update = 0; // длина окружности колеса var circle = 2 * 3.14159 * wheelRadius; // ставим триггер на срабатывание датчика линии, подключенного к пину B3 setWatch(function(e) { // период вращения колеса в секундах var dT = e.time - e.lastTime; // линейная скорость велосипеда в метрах в секунду var speed = circle / dT; // обновляем текст для отображения каждые 5 оборотов if (update++ % 5 === 0) { // переводим из метров в секунду в километры в час toShow = Math.round(speed * 3.6) + 'km/h'; } // угловая частота колеса var omega = speed / wheelRadius; // временной период отображения текста var wordPeriod = tetta / omega; // временной период отображения одной колонки символа var colomnPeriod = wordPeriod / (toShow.length * (spaceColomns + 5) - spaceColomns); // выводим текст на POV дисплей show(toShow, colomnPeriod); }, B3, { edge: 'rising', repeat: true }); // функция отображения текста на дисплее function show(word, colomnPeriod) { var w = 0; var i = 0; var pause = 0; // показываем каждый столбец "пикселей" в символах с периодом colomnPeriod var id = setInterval(function () { // если требуется сделать паузу между символами if (pause-- > 0) { // гасим все пиксели colomn(0x00); } else { // иначе показываем столбцы пикселей colomn(image[word[w]][i++]); } // когда показали все столбцы в символе if (i === 5) { i = 0; // задаем паузу после символа pause = spaceColomns; // когда показали все символы в строке, гасим пиксели и отключаем таймер if (++w === word.length) { colomn(0x00); clearInterval(id); } } }, colomnPeriod); // функция включения нужных пикселей в столбце function colomn(col) { for (var j = 0; j < 8; ++j, col >>= 1) { digitalWrite(led[j], !(col & 1)); } } }