Analog Read. Проблема на ровном месте
- Войдите на сайт для отправки комментариев
Нид хелп. Сломал голову, нужна помощь коллективного разума.
Итак, проблема. Есть простая задача: читаем с резистора переменного напряжение и формируем импульс определенной длительности. Код ниже. Все нормально, кроме одного. Когда переменный резистор стоит в нуле (ноль подается на аналоговый вход) код не запускается. В моем случае на мониторе горит 9999 (тестовый вывод). Стоит сдвинуть ручку резистора -все ок, начинает работать. При положении резистора отличном от нуля - все стартует. Более того, при питании по ЮСБ от компа - все стартует! Но, перехожу на внешнее питание - все, попа... Платы -менял. Блоки питания - менял. Повесил резистор на на цифровые выводы (+5 Вольт и 0), пробовал дергать ими. Пофигу...
#include <Arduino.h> #include <TM1637Display.h> // Module connection pins (Digital Pins) #define CLK 3 #define DIO 4 TM1637Display display(CLK, DIO); const int Pin = 2; // выход на реле const int PinPower = 8;// +5 вольт для резистора const int PinGround = 9;// GND вольт для резистора int period = 2000; // установка периода в милисекундах unsigned long t =0; int sensorValue =0; float power =0; float powerold =0; // the setup routine runs once when you press reset: void setup() { // initialize serial communication at 9600 bits per second: pinMode(PinPower, OUTPUT); pinMode(PinGround, OUTPUT); digitalWrite(PinPower, HIGH); digitalWrite(PinGround, HIGH); // Serial.begin(9600); pinMode(Pin, OUTPUT); digitalWrite(Pin, LOW); t = millis(); display.setBrightness(7); // от 0 до 7 display.clear(); //digitalWrite(A0, HIGH); //digitalWrite(A0, LOW); display.showNumberDec(9999); //delay (1000); digitalWrite(PinGround, HIGH); sensorValue = analogRead(A0); digitalWrite(PinGround, LOW); } // the loop routine runs over and over again forever: void loop() { // read the input on analog pin 0: //sensorValue=1000; sensorValue = analogRead(A0); if (sensorValue<10) sensorValue=0; if (sensorValue>1015) sensorValue=1023; power = sensorValue/1023.0; if ((millis()-t)<=period*power) digitalWrite(Pin, HIGH); else digitalWrite(Pin, LOW); if ((millis()-t)>= period) {t = millis();} if (ceil (powerold*100) != ceil (power*100)) {powerold=power; display.showNumberDec(power*100);} delay(10); //Serial.println(sensorValue); //Serial.println(power*100,1); //Serial.println(period*power); //delay(100); // delay in between reads for stability }
Все, мозг сломал. ;-((( Что я делаю не так?!
Совет от начинающего , пока более опытные не подошли ))
Попробуйте закомментировать analogRead(), а sensorValue сделать постоянно =0.
Уберите резистор совсем
Произведите вышенаписанные вами операции ещё раз
Может что-нибудь прояснится...
а можно схему сего устройства, не понятно что творится в строках 9-11 и 35, без схемы не понятно.
Собственно - да, без схемы обсуждать нечего.
В схеме должна быть точно отображена разводка питания.
Не нужна схема.
Косяк в том, что изменение показаний на твоем дисплее происходит только если новое значение power отличается от старого. При инициализации ты присвоил старому значение ноль и затем вывел на дисплей девятки. До тех пор, пока потенциометр стоит на нуле и новое значение power равно нулю, показания на дисплее не меняются. Поэтому, пока потенциометр на нуле, на экране светятся твои девятки. Код работает и ждет пока ты сдвинешь потенциометр.
Как лечить? При инициализации в строке 17 старому значению нужно присвоить не но, а значение, которое не может быть получено ни при каком положении потенциометра. В твоем случае это любое значение, больше единицы. Двойку или 9999. И все заработает.
Аплодисменты самогонщику Игорю.
Не нужна схема.
...
Аплодисменты самогонщику Игорю.
Тогда как объяснить: "Более того, при питании по ЮСБ от компа - все стартует! Но, перехожу на внешнее питание - все, попа... "
Строки 47 и 49.
Если с аналогового входа приходит 0, то и условие никогда не станет true, потому, что millis() и t беззнаковые .
Исходный, не исправленный код должен работать именно так, как он и работает. Если дать напряжение питания при нулевом положении потенциометра, на дисплее должны быть девятки, не так ли?
Если при нулевом положении потенциометра, при включении появляются не девятки, значит скорее всего питание нарастает медленно и в какой - то момент аналоговый вход видит не ноль, а больше. Больше десяти, с учётом обработки в коде.
Независимо от других условий, каждые 10 мс будет выполняться строка 51, и как только напряжение на потенциометре изменится на заданную величину, показания дисплея обновятся.
Независимо от других условий, каждые 10 мс будет выполняться строка 51, и как только напряжение на потенциометре изменится на заданную величину, показания дисплея обновятся.
Ага, спасибо. Похоже, в этой строке и есть проблема. Буду думать как исправить красиво. Обнуление переменных в начале надо убрать, похоже....
Убирать бессмысленно. Они нулевые при инициализации. Просто присвой при инициализации старому значению не ноль, а двойку. Или любое другое значение, которое не может быть вычислено при исполнении кода. А это от нуля до единицы.
Да, я про это же. При старте обе переменные обнулены. Старое значение надо загнать в отличное от нуля. Я про это...