Pull to refresh

Comments 28

Спасибо, очень интересно. Надо будет где-нибудь применить такой метод индикации. Только таблицу с расшифровкой морганий придется вешать на готовом устройстве, а то через неделю забудется, что там чему соответствует.
в последнее время перешёл на вот такую конструкцию

pause = millis() % 200; // pause will loop from 0 to 199
if(pause == 0)
{
digitalWrite(13,!digitalRead(13));
}
Может тогда так для классики жанра?
if( !( millis() % 200 ) )digitalWrite( 13, !digitalRead( 13 ) );
как вариант. только в последней версии трындуино айди касячок обнаружил, что в одну строчку работать так не будет. нужно соблюдать эту дьявольскую конструкцию с фигурными скобками.
Последняя 1.6.7?
Она еще и с ESP8266 core плохо дружит. Уже сколько народу присылало претензии, что код не хочет компилироваться. При откате на 1.6.5 все собиралось как часы
Кстати, кто мешает фигурные скобки в одну строчку использовать?
if( !( millis() % 200 ) ){ digitalWrite( 13, !digitalRead( 13 ) ); }

Это Си, великий и могучий!
трындуино айди мешает :))
точнее скомпилируется то нормально и зальётся на ура. вот только в цикле эта строчка работать не будет и светодиод естественно не будет моргать. такую фигню заметил в последней версии трындуино айди когда размашистый код марафетил, что бы читать одной строчкой. за более ранние версии ничего сказать не могу. но на поиск касячка потратил время. потому и сказал, что надо придерживаться дьявольской конструкции в предыдущем комменте.
Использовать прерывания в ESP следует осторожно, так как очень часто это вызывает срабатывание злобного сторожевого таймера WDT, который считает, что на обработку встроенных WiFi функций выделяется слишком мало времени.
В NodeMCU это решается вызовом в длинном цикле tmr.wdclr(), который сбрасывает watchdog- счетчик. Но тут нужно быть уверенным, что цикл не станет бесконечным ни при каких условиях.
Даже если бы сброс WDT работал без глюков, это не всегда спасает.
Например, делаю выгрузку LOG-фала с SD-карточки через WEB-сервер.
При размере файла 100-200к WDT гарантированно срабатывает.
Ва подключили SD-карточку непосредстенно к 8266?
Было бы очень интересно увидеть статью на эту тему!
А что там подключать?
Пример есть в ESP8266 Core для Arduino IDE
Внешний SPI там работает:
pinMode(SCK, SPECIAL); ///< GPIO14
pinMode(MISO, SPECIAL); ///< GPIO12
pinMode(MOSI, SPECIAL); ///< GPIO13
ну а CS к любому GPIO

Там даже есть WEB-сервер с файлами на карточке!

Что не попробовал еще, это зарузку программы с карты памяти
Реализация манчестерского кода несколько сложнее, чем описано в данной статье. В ту же тиньку 13 ее еще нужно умудриться запихнуть.
Это правда. Зато появляется возможность общаться на «понятном языке», как это делает Intel и многие другие известные бренды. Азбука Морзе в данном случае видится не лучшим выходом для коммуникации. Хотя… Если будет вменяемое мобильное приложение, способное транслировать мигание светодиода в текстовые сообщения, то какая, по сути, разница?
ну почти ничего, прерывания он все таки обрабатывает

Если память мне не изменяет, ничего он не обрабатывает как раз, иначе немного непонятно, кто гарантирует мне, что моя задержка будет длиться ровно 500 мс. Представим, что я отвратительный программист и по приемке байта в UART устроил себе O(N^4) да еще и с пересылкой этого байта пару сотен раз обратно. А в цикле у меня _delay_ms(500);. Контроллер, дойдя до этой строки, радостно делает NOP много-много раз. А на 250-й миллисекунде ему как раз байт прислали. Если бы прерывания не были бы запрещены, _delay_ms(500) легко могло бы превратиться в _delay_ms(650), а это сулит безумные проблемы с программно реализованными протоколами. Так что, первое, что делает delay, это выдает ASM(«CLI»), чтобы неповадно было.
Ну delay() точно не блокирует прерывания. Все примеры с прерываниями в данной статье это иллюстрируют. Можете убедиться, примеры абсолютно рабочие, хотя там сплошные delay() в цикле.
А кто сказал, что delay делает NOP много раз? За delay() скорее всего отвечает 0-й таймер, который генерит миллисекунды для функции millis()
Может, с июня '14 много что изменилось в стандартной либе, но вот здесь как раз человеку приходится писать неблокирующий delay() для Arduino.
P.S. А что будет, если у меня заняты все таймеры контроллера, но delay я все равно хочу? Там же не RTOS с диспетчером крутится
Вы с delayMicrosecons() не путаете?

void delay(unsigned long ms)
{
	uint16_t start = (uint16_t)micros();

	while (ms > 0) {
		yield();
		if (((uint16_t)micros() - start) >= 1000) {
			ms--;
			start += 1000;
		}
	}
} 

Вот код delay() из ардуины. Где там блокирование прерываний?
p.s. Кстати в той ссылке, что вы привели написано, что один из подходов обхождения «блокировки delay()» это использование прерывания, но это не его метод )))

Его метод очень похож на мой второй-третий пример, только все зашито в функцию, а не прямо в цикле условия
Звуком будет удобнее, чем светом. Займёт также одну ногу. В биосах применяется давно.
С одной стороны вы правы. Звук в Ардуино реализуется встроенной функцией tone() очень просто.
С другой стороны, если все устройства моего умного дома буду периодически (при смене режимов) день и ночь попискивать, то через какое то время со мной, как изготовителем может случиться акт насилия )))
Если тон выбрать басовый, раздражать почти не будет. О вкусах не спорят, но меня мигание раздражает больше.
Ужас какой… куда катится гиктаймс?
Мне кажется хорошо было бы создать какой-нибудь унифицированный led-протокол который можно было бы распознавать с помощью камеры и приложения на телефоне. Тогда любое устройство могло бы сообщать свое состояние целыми строками, и может даже заменить экранчики которые любят ставить на самоделки. Вопрос только в скорости передачи информации таким способом.
И снова — звук. Потому что приложения для распознавания морзянки смартфоном через микрофон уже давно написаны. А через камеру — ещё нет.
делал блок управления насосом в скважине, с контролем уровня в промежуточной емкости, и уровнем сухого хода.
Итого 5 датчиков и две реле.

Чтобы понять какие датчики в каком положении использовал разные мигания светодиодом, быстрее, медленнее. три вспышки пауза и тд.
На момент написания программы восхищался собой — одним светодиодом выведу всю информацию.
Подключил блок — светодиод замигал.
Я долго и упорно пытался вспомнить что же означает
UFO just landed and posted this here
Sign up to leave a comment.

Articles