Здравствуйте. Застрял на выполнении следующей задачи: К digispark Китайскому на P4(A2) подключен термистор (~ 2кОм) с балансным сопротивлением (2кОм). По разнице показаний вычисляется падение уровня топлива в баке. Сначала берется эталонное значение, если текущее больше или меньше на дельту, то загорается светодиод на P0. Также с балансным сопротивлением (2 кОм) подключен термистор (~ 2кОм) для измерения температуры охлаждающей жидкости на P2 (A1). Сериями миганий закодирована температура с шагом 10 градусов. При T <= 80, приоритетом является показания датчика топлива, если дельта показаний больше установленной то светодиод светит постоянно. При T >= 90, топливо игнорируется и показывает только температуру. После загрузки скетча, подсоединяю все элементы. +- к бортовой сети, и датчики с резисторами. Digispark не хочет запускаться. Отсоединяю P4 - работает. Поменял Digispark на другую серию - без изменений. Код (C++): const int sensorPinFuel = 2; // Analog input pin !!!P4!!! that senses Vout const int sensorPinTemp = 1; // Analog input pin P2 that senses Vout int sensorValueFuelEtalon = 1; // sensorPin default value int sensorValueFuel = 1; // sensorPin default value int sensorValueTemp = 1; // sensorPin default value int T95 = 722; int T90 = 680; int T80 = 620; int T70 = 530; int T60 = 430; int T50 = 330; int T40 = 245; int T30 = 180; int T20 = 120; int T10 = 80; int POUT1 = 0; // Output Led P0 pin ((P1 pin is on board test red light)) int POUT2 = 0; // Output Led 0 !!!!!!!!!!!!!!!!! // P0 = Output Led(A0); P2 = sensorPinTemp(A1); P4 = sensorPinFuel(A2); int deltaFuel = 12; //delta =100 Ohm delta =12 VOUT int d=1; void setup () { delay(500); // Delay in 500 milliseconds for (int i = 0; i <= 2; i++) { analogWrite(POUT1,255); // Turn the pin on full (100%) delay(1500); // Delay in 1500 milliseconds analogWrite(POUT1,0); // Turn the pin off (0%) delay(750); // Delay in 750 milliseconds } delay(2000); // Delay in 2000 milliseconds sensorValueFuelEtalon = analogRead(sensorPinFuel); // !!!!!!!!!!! Wait for ignition!!!!!!!!! Check: sensorValueFuel = analogRead(sensorPinFuel); // Read Vout on pin5 (Arduino can sense from 0-1023, 1023 is 5V) sensorValueTemp = analogRead(sensorPinTemp); // Read Vout on pin2 (Arduino can sense from 0-1023, 1023 is 5V) if (sensorValueTemp >= T95) { analogWrite(POUT1,255); delay(100); analogWrite(POUT1,0); delay(100); goto Check; }else if (sensorValueTemp >= T90) { for (int i = 0; i <= 1; i++){ analogWrite(POUT1,255); delay(100); analogWrite(POUT1,0); delay(100); analogWrite(POUT1,255); delay(250); analogWrite(POUT1,0); delay(250); } analogWrite(POUT1,255); delay(1500); analogWrite(POUT1,0); delay(500); goto Check; }else d = abs (sensorValueFuel - sensorValueFuelEtalon); if (d >= deltaFuel) { analogWrite(POUT2,255); delay(15000); goto Check; }else analogWrite(POUT2,0); if (sensorValueTemp >= T80) { analogWrite(POUT1,255); delay(333); analogWrite(POUT1,0); delay(250); analogWrite(POUT1,255); delay(100); analogWrite(POUT1,0); delay(100); analogWrite(POUT1,255); delay(333); analogWrite(POUT1,0); delay(250); analogWrite(POUT1,255); delay(1500); analogWrite(POUT1,0); delay(500); goto Check; }else if (sensorValueTemp >= T70) { for (int i = 0; i <= 1; i++){ analogWrite(POUT1,255); delay(250); analogWrite(POUT1,0); delay(250);} analogWrite(POUT1,255); delay(1500); analogWrite(POUT1,0); delay(500); goto Check; }else if (sensorValueTemp >= T60) { analogWrite(POUT1,255); delay(250); analogWrite(POUT1,0); delay(250); analogWrite(POUT1,255); delay(1500); analogWrite(POUT1,0); delay(500); goto Check; }else if (sensorValueTemp >= T50) { for (int i = 0; i <= 4; i++){ analogWrite(POUT1,255); delay(333); analogWrite(POUT1,0); delay(333);} analogWrite(POUT1,0); delay(1500); goto Check; }else if (sensorValueTemp >= T40) { for (int i = 0; i <= 3; i++){ analogWrite(POUT1,255); delay(500); analogWrite(POUT1,0); delay(500);} analogWrite(POUT1,0); delay(1500); goto Check; }else if (sensorValueTemp >= T30) { for (int i = 0; i <= 2; i++){ analogWrite(POUT1,255); delay(600); analogWrite(POUT1,0); delay(600);} analogWrite(POUT1,0); delay(1500); goto Check; }else if (sensorValueTemp >= T20) { for (int i = 0; i <= 1; i++){ analogWrite(POUT1,255); delay(500); analogWrite(POUT1,0); delay(500);} analogWrite(POUT1,0); delay(1500); goto Check; }else if (sensorValueTemp >= T10) { analogWrite(POUT1,255); delay(500); analogWrite(POUT1,0); delay(500); analogWrite(POUT1,0); delay(1500); goto Check; }else analogWrite(POUT1,0); delay(5000); goto Check; } void loop() { }
поясните, как это вы ТЕРМИСТОРОМ (датчиком температуры) измеряете уровень в баке? Чтобы кто-то стал смотреть ваш код, его надо вставить правильно
Код вставил, спасибо. Для самого по началу была загадка, зачем производитель поставил термистор. Там нет движущихся частей, при падении уровня топлива до уровня термистора, меняется сопротивление из-за испарения. Проверено опытным путем. В связи с изменяемыми температурными условиями внешней среды приходится при запуске замерять эталонное сопротивление и с ним сравнивать текущее. При уровнях значительно выше датчика сопротивление неизменно (при одинаковой температуре окружающей среды). При уровнях топлива ниже термистора, нет испарения - датчик сухой, при начале движения топливо попадает на датчик - возникает дельта сопротивления по отношению к замеренному эталону. Есть и минус такого решения: при близком к нулевому значению топлива заполаскивания термистора не происходит и нет дельты. Код (C++): const int sensorPinFuel = 2; // Analog input pin !!!P4!!! that senses Vout const int sensorPinTemp = 1; // Analog input pin P2 that senses Vout int sensorValueFuelEtalon = 1; // sensorPin default value int sensorValueFuel = 1; // sensorPin default value int sensorValueTemp = 1; // sensorPin default value int T95 = 722; int T90 = 680; int T80 = 620; int T70 = 530; int T60 = 430; int T50 = 330; int T40 = 245; int T30 = 180; int T20 = 120; int T10 = 80; int POUT1 = 0; // Output Led P0 pin ((P1 pin is on board test red light)) int POUT2 = 0; // Output Led 0 !!!!!!!!!!!!!!!!! // P0 = Output Led(A0); P2 = sensorPinTemp(A1); P4 = sensorPinFuel(A2); int deltaFuel = 12; //delta =100 Ohm delta =12 VOUT int d=1; void setup () { delay(500); // Delay in 500 milliseconds for (int i = 0; i <= 2; i++) { analogWrite(POUT1,255); // Turn the pin on full (100%) delay(1500); // Delay in 1500 milliseconds analogWrite(POUT1,0); // Turn the pin off (0%) delay(750); // Delay in 750 milliseconds } delay(2000); // Delay in 2000 milliseconds sensorValueFuelEtalon = analogRead(sensorPinFuel); // !!!!!!!!!!! Wait for ignition!!!!!!!!! Check: sensorValueFuel = analogRead(sensorPinFuel); // Read Vout on pin5 (Arduino can sense from 0-1023, 1023 is 5V) sensorValueTemp = analogRead(sensorPinTemp); // Read Vout on pin2 (Arduino can sense from 0-1023, 1023 is 5V) if (sensorValueTemp >= T95) { analogWrite(POUT1,255); delay(100); analogWrite(POUT1,0); delay(100); goto Check; }else if (sensorValueTemp >= T90) { for (int i = 0; i <= 1; i++){ analogWrite(POUT1,255); delay(100); analogWrite(POUT1,0); delay(100); analogWrite(POUT1,255); delay(250); analogWrite(POUT1,0); delay(250); } analogWrite(POUT1,255); delay(1500); analogWrite(POUT1,0); delay(500); goto Check; }else d = abs (sensorValueFuel - sensorValueFuelEtalon); if (d >= deltaFuel) { analogWrite(POUT2,255); delay(15000); goto Check; }else analogWrite(POUT2,0); if (sensorValueTemp >= T80) { analogWrite(POUT1,255); delay(333); analogWrite(POUT1,0); delay(250); analogWrite(POUT1,255); delay(100); analogWrite(POUT1,0); delay(100); analogWrite(POUT1,255); delay(333); analogWrite(POUT1,0); delay(250); analogWrite(POUT1,255); delay(1500); analogWrite(POUT1,0); delay(500); goto Check; }else if (sensorValueTemp >= T70) { for (int i = 0; i <= 1; i++){ analogWrite(POUT1,255); delay(250); analogWrite(POUT1,0); delay(250);} analogWrite(POUT1,255); delay(1500); analogWrite(POUT1,0); delay(500); goto Check; }else if (sensorValueTemp >= T60) { analogWrite(POUT1,255); delay(250); analogWrite(POUT1,0); delay(250); analogWrite(POUT1,255); delay(1500); analogWrite(POUT1,0); delay(500); goto Check; }else if (sensorValueTemp >= T50) { for (int i = 0; i <= 4; i++){ analogWrite(POUT1,255); delay(333); analogWrite(POUT1,0); delay(333);} analogWrite(POUT1,0); delay(1500); goto Check; }else if (sensorValueTemp >= T40) { for (int i = 0; i <= 3; i++){ analogWrite(POUT1,255); delay(500); analogWrite(POUT1,0); delay(500);} analogWrite(POUT1,0); delay(1500); goto Check; }else if (sensorValueTemp >= T30) { for (int i = 0; i <= 2; i++){ analogWrite(POUT1,255); delay(600); analogWrite(POUT1,0); delay(600);} analogWrite(POUT1,0); delay(1500); goto Check; }else if (sensorValueTemp >= T20) { for (int i = 0; i <= 1; i++){ analogWrite(POUT1,255); delay(500); analogWrite(POUT1,0); delay(500);} analogWrite(POUT1,0); delay(1500); goto Check; }else if (sensorValueTemp >= T10) { analogWrite(POUT1,255); delay(500); analogWrite(POUT1,0); delay(500); analogWrite(POUT1,0); delay(1500); goto Check; }else analogWrite(POUT1,0); delay(5000); goto Check; } void loop() { }
да, встречался с таким методом измерения уровня... Только обычно ставят длинный термистор во всю высоту столба жидкости. При пропускании тока через цепь части термистора, находящиеся выше и ниже уровня. нагреваются по разному и из их соотношения можно вычислить высоту столба жидкости
Там большая вибрация. Логика такая: загорелась контрольная лампа - долей. Пропустил уровень ниже диагностируемого - твои проблемы...
И какой величины эта дельта? Хватает 10-ти разрядного (по факту 8-ми) АЦП? В таких схемах уровень напряжения на резисторах измеряют одновременно, что снижает требование к источнику тока (роль которого здесь выполняет банальное сопротивление). Но чтобы была точность хотя бы в 0.5 градусов, необходим 16-ти разрядный АЦП.
Дельта сопротивления возникает на измерении уровня топлива. Если разница по абсолютному значению превышена - зажги диод. Температура охлаждающей жидкости измеряется с шагом 10 градусов от 10 до 90, далее 95 и все. АЦП это переваривает с большим запасом. Вопрос где я ошибаюсь? По отдельности при работе с пином P2 (A1) всё работает. И топливо при временном присоединении и временной программе показывает и температуру. Как только завожу на P4 (A2) топливо, а на P2 (A1) температуру - схема не выходит в рабочий режим...
там (на топливе) перепад в 25 из 1023 единиц. Я ставлю пороговую дельту в 12 единиц, этого достаточно для отсеивания неточности измерений. Для охлаждающей жидкости общий перепад -20 - +100 градусов.