Ви не увійшли.
Общесоюзная система управления железными дорогами "Экспересс" работала, на простецких ДВК и СМ-ЭВМ, лучше чем ее апгрейд на новiтнix суперкомпьютерах.
Я думаю, что это просто беспокоят старые раны.
На погоду...
Хороший компьютер, мой ноутбук хуже. Только, что на нем "крутить", и зачем? Качественного ПО нет даже за деньги, ну не считая большие деньги.
Ну не скажите...
- там работает внутри Linux (один из вариантов Linux)...
- для Linux полно качественного ПО ... гораздо больше (если говорить о качественном) чем под Windows...
- на таком компьютере можно делать любой сложности встраиваемые (embedded) системы
- и вовсе не только игрушечного уровня Uno/Nano, но уже и серьёзные проекты промышленного, внедренческого и т.д. уровней.
Важно, и для меня неожиданно, что это устройство работает под управлением того же Arduino IDE (для отладки, загрузки, проверки ...).
Кроме того, существует целый спектр (и по развитости, мощности - и по стоимости) устройств ... от минимального Nano и до вот таких устройств.
Работает ли кто, имеет ли кто опыт работы, кроме вот тех давних свистелок и перделок a'la Uno/Nano, со старшими моделями, поддерживаемыми разработкой в Arduino IDE?
Такие, например, как Intel Edison:
Хотя Arduino IDE платы стоят на AliExpress порядка $145 ... но это и совсем другой компьютер:
Хотя, там, в Arduino IDE перечне контроллеров, есть великое множество, целый спектр промежуточных моделей.
NEW_NOOB пише:А как сбросить таймер millis? Нужно что бы он считал не с начала включения ардуино, а с начала включения лампы.
А зачем сбрасывать millis? Можно запомнить его текущее значение, дальше думайте сами.
При этом ещё держать в уме, что примерно через 50 дней millis превратится в ноль через переполнение.
И это событие нужно как-то ловить и анализировать, если собираться работать дольше 50 дней.
Заранее СПАСИБО
Я вам давно уже показал ваше решение в 3 строчки, на другом форуме: http://arduino.ru/forum/programmirovanie/pomogite-s-protokolom-0#comment-352616
Заранее ПОЖАЛУЙСТА
как ето реализовиать
Как вам уже подсказали, какими-то стандартными средствами библиотеки вы это не сделает.
Но вам можно это сделать вручную анализируя состояние (нажата-отжата) клавиш ... по крайней мере "0" и "C".
У вас классическая задача switch-автомата...
1. Уберите все свои while() - у вас loop() есть как цикл для switch анализа.
2. Поставьте в конце loop(), после switch фиксированную задержку ... скажем delay( 100 ), и забудьте про время, а считайте числа циклов (по 0.1 сек.) прошедшие с какого-то события...
одиночное нажатие на кнопку «удалить»(C) должно удалять один символ;
удержание кнопки в течение двух секунд должно очищать экран;
удержание кнопки «0» должно выводить на дисплей точку, для работы с
десятичными дробями;
не могу понять как в коде задать удержания клавиш
3. при нажатии "C" устанавливает boolean признак bC.
4. и считаете число циклов (nC) при bC == true ...
5. если bC сбросится в false при nC < 20, то удаляете 1 символ: сдвигаете курсор на позицию влево + записываете туда пробел
6. а вот если nC > 20, а bC всё ещё true - чистите весь экран
7. при нажатии "0" записываете на индикатор "0", но взводите признак b0 = true, и если на следующем цикле loop() клавиша "0" всё ещё нажата - затираете "0" на индикаторе + ставите "." + переводите программу (boolean признак) в режим ввода дробной части.
Вот где-то такую логику строите...
Ничего там особенно "военного" нет!
UNICODE - это чисто теоретическая таблица, присвоение кодов символов самым замысловатым языкам ... например, музыкальным нотам. Код UNICODE - всегда 4 байта. Но нигде, ни в одном языке и ОС в таком виде не используется ... не для того предназначается.
UTF-32 - способ кодирования UNICODE значений, каждый символ кодируется как uint32_t.
UTF-16 - способ кодирования UNICODE значений, каждый символ кодируется uint16_t. Это то, как UNICODE понимается в Windows - сдостаточно старый способ представления UNICODE.
UTF-8 - способ кодирования UNICODE значений последовательностью байт переменной длины (это очень важно!) - каждый символ (код UNICODE) представляется как последовательность байт длиной от 1 до 6 (первоначально) байт ... позже, в угоду совместимости с Windows в стандарте было решено не использовать 5 и 6 байтные последовательности (но многим POSIX-ОС это не указ) - это новая кодировка UNICODE, первоначально придуманая авторами UNIX для операционной системы Plan 9 (~2004г.).
Здесь есть ещё один аспект, который я сразу забыл отметить - связанный с порядком байт в компьютере: BE или LE (big-endian или little-endian) - какой байт в 16 или 32 бит int считается младшим (в порядке адресации байт). Это очень важно при обменах: обменах между процессорами разных архитектур, сетевых обменах TCP/IP и т.д.
BE: IBM 360/370/390, Motorola 68000, SPARC ... + все сетевые обмены всех протоколов TCP/IP
LE: Intel x86, USB, конфигурация PCI, таблица разделов GUID (для идентификации дисков и др. целей)
Кстати ... я не знаю BE/LE относительно процессоров AVR, на которых собраны Arduino?
Поэтому и кодировки UTF-16 тут же развалились на 2 новых: UTF-16LE (это Windows wchar_t, как я понимаю) и UTF-16BE.
А относительно UTF-8 ещё можно дополнить:
- для UTF-8 нет проблемы порядка байт ... в том числе и при сетевых обменах;
- UTF-8 - самосинхронизирующийся код: при обрыве потока текста в любом месте, после его восстановления легко восстанавливается начало очередного символа (по формату 1-го байта).
Ардуино IDE и КА у заказчика. Какие варианты? Что то поменяется - буду только рад.)
Не ... ну, если "бабло молотим" - так только на пользу ... и флаг в руки: "сто старушек - сто рублей!"
Но вот если для себя делать, и что-то посложнее чем простейший управляющий контроллер (это тоже имеет право быть, но сейчас о другом ... например об обмене с хост-компьютером через Serial) - то всё становится совершенно не так весело.
2. Вот такие примеры, как выше - они очень соответствуют тому, что пишут во всех книгах и статьях по языку C.
А вот такая запись:
uint32_t x;
В ряде случаев, это будет куда содержательнее для читающего (да и пишущего тоже ... через 2 недели после написания), чем просто:
int x;
И поможет избежать очень досадных и тяжёлых ошибок ... типа таких:
if( x < 0 ) { ... };
Olej пише:Если кто-то сталкивался с проявлениями этих проблем - поделитесь.
А я поделюсь то, что от себя знаю.Нужно было выводить кириллицу в кассовый аппарат. Дабы было всё красиво, написал перекодировщик UTF-8 в CP-866. Проблем не было.)
Вот об этой глупости ... фиче, простите, я и говорю: когда каждый сам для себя пишет перекодировщик... : на каждый чих и на каждую кодовую таблицу - пишем свой перекодировщик.
Только при смене операционной системы (Windows на Linux, или наоборот) или модели оконечного устройства (другой "кассовый аппарат") - всё это посыпется!
Olej пише:Описание API avr-libc на русском языке (хоть и несколько горбатом) см. здесь.
Ага. Пошлите, еще, новичка к Atmel Software Framework, он еще богаче чем avr-libc.
А чего же не послать?
В библиотеках есть множество достаточно элементарных вещей, которые:
1. Очень упрощают написание кода ... например вместо 20 штук последовательно друг за другом вызовов:
Serial.print(...);
// ... и ещё так же 25 раз ...
Serial.println(...);
Записать:
char msg[ 80 ];
sprintf( msg, "%s%d%x%x%x", "это будет ", n, " штук HEX чисел:", x1, x2, x3 );
println( msg );
(я бы мог это записать ещё проще, без промежуточного буфера msg, через printf() ... но это будет уже действительно посложнее).
2. Вот такие примеры, как выше - они очень соответствуют тому, что пишут во всех книгах и статьях по языку C. А отсутствие того, что написано во всех книжках, Arduino IDE - будет вызывать смущение в уме.
И это ещё важнее.
А я поделюсь то, что от себя знаю.
Я скопирую сюда то, что писал на совсем другом форуме:
DarkGenius пише:Первый байт означает какая кодировки и какая версия, второй собственно код символа, если ты пишешь тут двухбайтный код символа в десятичной системе, это о многом говорит. Всё есть в сети, а если тебе лень разбиратся не засоряй форум.
Кириллица в Юникоде
Windows-1251Всё не совсем так просто... И для корректной работы с символьными строками с этим нужно разобраться:
UNICODE - это чисто теоретическая таблица, присвоение кодов символов самым замысловатым языкам ... например, музыкальным нотам. Код UNICODE - всегда 4 байта. Но нигде, ни в одном языке и ОС в таком виде не используется ... не для того предназначается.
UTF-32 - способ кодирования UNICODE значений, каждый символ кодируется как uint32_t.
UTF-16 - способ кодирования UNICODE значений, каждый символ кодируется uint16_t. Это то, как UNICODE понимается в Windows - сдостаточно старый способ представления UNICODE.
UTF-8 - способ кодирования UNICODE значений последовательностью байт переменной длины (это очень важно!) - каждый символ (код UNICODE) представляется как последовательность байт длиной от 1 до 6 (первоначально) байт ... позже, в угоду совместимости с Windows в стандарте было решено не использовать 5 и 6 байтные последовательности (но многим POSIX-ОС это не указ) - это новая кодировка UNICODE, первоначально придуманая авторами UNIX для операционной системы Plan 9 (~2004г.).
В языка C/C++ для представления локализованных символов введен (стандарт C89, позже C99) тип данных wchar_t - широкие символы. И вот тут начинается неразбериха ... в разных ОС wchar_t имеют разные представления: в Windows - uint16_t, в Linux и других новых ОС - uint32_t ("чистый" UNICODE). Никакого отношения wchar_t к UTF-8 не имеют!
Кодировки, кодовые страницы: CP-866, CP-1251, KOI-8r, ... и ещё 1001 шт. - это прошлый, ... или даже позапрошлый день... когда все иноязычные символы представлялись 1-м байтом.
Все способы кодирования UNICODE - UTF-8, UTF-16, UTF-32 - к кодовым страницам никакого отношения не имеют, они в единой кодировке представляют все возможные в природе символы.
Все новые языки программирования: Python, Go, Swift, Kotlin, Tust ... - используют кодировку UTF-8 по умолчанию.
Но для аппаратного обмена (индикаторы, дисплеи, светодиодные панели, ...) нужно преобразовывать любое представление в 1-байтовое. И вот это (как это делать) заслуживает детального обсуждения.
С какой целью копирую?
Возможно, кого-то заинтересует до конца разобраться с этими проблемами ... или поэкспериментировать для уточнения.
Вообще то, Arduino IDE (пишут) использует по умолчанию UTF-8 кодировку UNICODE.
Для англоязычных символов (как пишут во всех примерах кода) это не имеет никакого значения.
Но для русскоязычных символов это порождает проблемы, с которыми хотелось бы разобраться.
Когда вообще возникают (могут) русскоязычные символы в Arduino?
1. При выводе на индикаторы ... LCD 1602, например, или TFT (об этих проблемах галдёж на форумах Arduino стоит года с 2011-го )
2. Обмен по вводу-выводу через Serial
3. Обмен с ОС, самописными программами, или Processing на хост-компьютере (и здесь в Linux и Windows будут принципиально разные вещи ... но в чём? насколько? и какими неприятностями выражаться?)
4. При самых разных сетевых обменах
Если кто-то сталкивался с проявлениями этих проблем - поделитесь.
А я поделюсь то, что от себя знаю.
Справочник по ядру Ардуино, на русском, есть здесь: https://doc.arduino.ua/ru/prog/ . А по билиотекам гуглите и читайте исходники и документацию на https://www.arduino.cc/reference/en/.
Кроме того, стандартная библиотека avr-libc намного шире, чем то, что доступно из описаний Arduino. Но всё это доступно для использования в коде скетча.
Описание API avr-libc на русском языке (хоть и несколько горбатом) см. здесь.
radio-active пише:нехрена
научитесь правильно писать сначала.
ни хрена?
Подсказали в другом месте, может кому пригодится:
Но там же подсказали и гораздо интереснее:
Если printf Вам нужен только для вывода в поток (как в Вашем примере), то ещё удобнее делать это (выводить в поток) сразу, без запроса буфера. Например,
// Эти три строки пишем в начале файла #include <stdio.h> static int serial_fputchar(const char ch, FILE *stream) { Serial.write(ch); return ch; } static FILE *serial_stream = fdevopen(serial_fputchar, NULL); void setup(void) { stdout = serial_stream; // эта строка первая в setup // // А ТЕПЕРЬ ТУПО ПОЛЬЗУЕМСЯ printf // Serial.begin(115200); int a = 8; // Печатаем a в разных видах printf("a=%d, a=%02d, a=%04d, a=%05d, a=%06d\n", a, a, a, a, a); } void loop(void){}
Пользуйтесь!
Подсказали в другом месте, может кому пригодится:
sprintf искаропки не поддерживает форматный вывод с плавающей точкой. Используй dtostrf() или dtostre().
Пример:
#include <alloca.h>
void setup() {
Serial.begin( 9600 ); // устанавливаем последовательное соединение
}
void reply( boolean lng ) {
unsigned long time = millis();
char *msg = (char*)alloca( 80 );
if( !lng )
sprintf( msg, ".%lu", time % 1000 );
else
sprintf( msg, "%02lu:%02lu.%03lu",
( time / 1000 ) / 60,
( time / 1000 ) % 60, time % 1000 );
Serial.println( msg );
}
void loop() {
if( Serial.available() > 0 ) // есть доступные данные
reply( '?' == Serial.read() );
Serial.flush();
delay( 300 );
}
Результат:
00:01.802
00:03.916
00:06.332
.450
.358
00:15.669
00:18.685
00:45.133
01:40.422
Получается, что sprintf() функция есть, форматы %d, %s и т.д. - успешно работают. А формат %f/%e - нет. Почему? Хотя в описании форматов для printf() из avr-libc эти форматы (%f/%e) есть.
Подсказали в другом месте, может кому пригодится:
sprintf искаропки не поддерживает форматный вывод с плавающей точкой. Используй dtostrf() или dtostre().
Сделаю так:
...
uint32_t i = 1000;
double s = 1.2345;
char msg[ 40 ];
sprintf( msg, "%d => %8.2f", i, s );
Serial.println( msg );
...
Результатом будет:
1000 => ?
Получается, что sprintf() функция есть, форматы %d, %s и т.д. - успешно работают. А формат %f/%e - нет. Почему? Хотя в описании форматов для printf() из avr-libc эти форматы (%f/%e) есть.
Более того, формат %8.2f определил даже ширину позиции вывода (8), знак '?' отстоит на это число позиций (менял-проверял).
Как можно форматировать строки?
Arduino Tinkercad - симулятор Arduino (не только программного кода, но и схемотехники проекта) от компании Autodesk - мэтра CAD-систем, владельца торговой марки AutoCad.
Иногда, когда нет под рукой живого Arduino, это быстрый способ набросать проект. А иногда это - более быстрый способ отмакетировать проект, чем собирать его на проводах на макетке.
Здесь можете почитать краткое введение в предмет, более чем достаточное, чтобы начать работать с Tinkercad:
Tinkercad симулирует работу электронных схем и контроллера, но при этом он является эмулятором ардуино, реализуя практически все базовые функции Arduino IDE — от среды редактирования и компилятора до монитора порта и подключения библиотек.
Вот как это выглядит (что там у меня на картинке за проект - не важно):