Возможно ли читать данные с порта, без delay, но строго циклично по времени? Дёргать ногу умею и практически постоянно использую, но вот опрос аналогового сигнала применить не могу.
На сколько строго? Если в loop вписать Код (C++): if время с последнего опроса > Т то считать данные сохранить время последнего опроса то получится опрашивать вывод мк в цикле и без delay, НО если есть другие процедуры, которые работают в loop, то они могут внести задержку. Более правильный вариант это использовать таймер, но в таком случае было бы правильнее написать ещё свою процедуру чтения вывода (digital.read написана неоптимально для скорости). Извиняюсь, не сразу вычитал, что проблема с аналоговым выводом. В принципе, всё выше остаётся в силе с добавкой, что отцифровка тоже занимает время. Если сигнал меняется медленно по отношению к времени измерения АЦП и время преобразования АЦП сравнимо с вашим периодом Т, то готовность АЦП можно использовать как таймер.
Я не ясно выразил мысль, с аналогового только чтение. Грубо говоря, я не могу совместить Код (C++): { // БЕЗ DELAY // здесь будет код, который будет работать постоянно // и который не должен останавливаться на время между переключениями свето unsigned long currentMillis = millis(); //проверяем не прошел ли нужный интервал, если прошел то if(currentMillis - previousMillis > interval) { // сохраняем время последнего переключения previousMillis = currentMillis; // если светодиод не горит, то зажигаем, и наоборот if (ledState == LOW) ledState = HIGH; else ledState = LOW; // устанавливаем состояния выхода, чтобы включить или выключить светодиод digitalWrite(ledPin, ledState); } } и опрос датчика Код (C++): uint16_t lux = lightMeter.readLightLevel(); Serial.print("Light: "); Serial.print(lux); Serial.println(" lx"); // стандартный люксометр.
А в чем проблема?Он у Вас и так будет опрашиваться циклично в loop.Если есть еще действия в loop то плюс время на их выполнение-несколько микросекунд.Это для Вас критично?Здесь код не асинхронный поэтому по другому никак.
мне нужно набрать пакет данных, и далее использовать эти данные, как калибровку, а поступающие в процессе работы, как выявление предела (максимально и минимального). --- Должно быть я совсем загнался.
Вопрос был Всё просто Код (C++): #include <LiquidCrystal.h> LiquidCrystal lcd(7, 8, 9, 10, 11, 12); int analogInput = 0;//номер пина с которого читаем float value = 0.0; float volt = 0.0; //значение в вольтах void setup() { pinMode(analogInput, INPUT); lcd.begin(16, 2); } void loop() { value = analogRead(analogInput);//читаем значение на А0 volt = (value * 5.0) / 1024.0; //преобразуем в вольты если надо lcd.setCursor(0, 1); //курсор на место lcd.print("INPUT V= "); //выводим текст lcd.print(volt); //и значение } В void loop() можно оставить только value = analogRead(analogInput);//читаем значение на А0 а потом с этим value делать всё что угодно.Всё будет выполнятся в цЫкле loop.Или я не понял вопроса?
Можно изчо короче Код (C++): int analogInput = 0;//номер пина с которого читаем float value = 0.0; float volt = 0.0; //значение в вольтах void setup() { pinMode(analogInput, INPUT); Serial.begin(9600); } void loop() { value = analogRead(analogInput);//читаем значение на А0 Serial.println(value);//и выводим в порт }
Так у вас уже как-бы всё есть. Код переключения светодиода без delay есть. Его можно немного упростить используя логические операции. Код (C++): { // БЕЗ DELAY // здесь будет код, который будет работать постоянно // и который не должен останавливаться на время между переключениями свето unsigned long currentMillis = millis(); //проверяем не прошел ли нужный интервал, если прошел то if(currentMillis - previousMillis > interval) { // сохраняем время последнего переключения previousMillis = currentMillis; // переключаем светодиод ledState = !ledState; digitalWrite(ledPin, ledState); } } Ну а место, куда вставить кусок кода для опроса датчика зависит от необходимой вам логики работы. Возможны три варианта: 1. Датчик опрашивается при каждом прохождении цикла loop. 2. Датчик опрашивается одновременно с переключением светодиода. 3. Датчик опрашивается по своей задержке.
Товарищи, спасибо всем, кто откликнулся! Не буду вводить вас в заблуждение, пока не работает железка, думать о начинке бессмысленно (а для меня и вредно). Заменю датчик или хотя бы на фоторезистор изменю схему, напишу хоть сколько нибудь алгоритма, и в случае лёгкой контузии подниму тему вновь.
Не так страшен delay как его боятся.На самом деле это отличный инструмент на своем месте.Когда надо чтоб железака замерла и не шеволилась.При регистрации в GSM сети например или антидребезг.
согласен, в большинстве случаев задержка не сильно влияет на работу. Но всё же, лучше не замораживать в данном устройстве.
Объясните почему?Delay такая же операция как и любая другая которую Вы будете делать в коде-обработка считанного результата в Вашем случае.Да и нет delay в тех примерах что я вам показал.
Я в общем имел ввиду о задержки. Но в данном детекторе лучше вообще отказаться, по сути, я возлагаю ответственность на обнаружение искрения и искрообразования в камере.
Выбираем режим сна и уходим в SLEEP. В Delay железяка работает и шумит в АЦП. Хотя, для некоторых методов оцифровывания сигнала это даже полезно.