Digispark 4pin

Тема в разделе "Arduino & Shields", создана пользователем Виктор, 27 ноя 2020.

  1. Виктор

    Виктор Нуб

    Здравствуйте.

    Застрял на выполнении следующей задачи:

    К 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()
    {
      }
     
    Последнее редактирование: 27 ноя 2020
  2. b707

    b707 Гуру

    поясните, как это вы ТЕРМИСТОРОМ (датчиком температуры) измеряете уровень в баке?

    Чтобы кто-то стал смотреть ваш код, его надо вставить правильно
     
  3. Виктор

    Виктор Нуб

    Код вставил, спасибо.

    Для самого по началу была загадка, зачем производитель поставил термистор. Там нет движущихся частей, при падении уровня топлива до уровня термистора, меняется сопротивление из-за испарения. Проверено опытным путем.
    В связи с изменяемыми температурными условиями внешней среды приходится при запуске замерять эталонное сопротивление и с ним сравнивать текущее.
    При уровнях значительно выше датчика сопротивление неизменно (при одинаковой температуре окружающей среды).
    При уровнях топлива ниже термистора, нет испарения - датчик сухой, при начале движения топливо попадает на датчик - возникает дельта сопротивления по отношению к замеренному эталону.
    Есть и минус такого решения: при близком к нулевому значению топлива заполаскивания термистора не происходит и нет дельты.

    Код (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()
    {
      }
     
    Последнее редактирование: 27 ноя 2020
  4. b707

    b707 Гуру

    да, встречался с таким методом измерения уровня...
    Только обычно ставят длинный термистор во всю высоту столба жидкости. При пропускании тока через цепь части термистора, находящиеся выше и ниже уровня. нагреваются по разному и из их соотношения можно вычислить высоту столба жидкости
     
  5. Виктор

    Виктор Нуб

    Там большая вибрация. Логика такая: загорелась контрольная лампа - долей. Пропустил уровень ниже диагностируемого - твои проблемы...
     
  6. parovoZZ

    parovoZZ Гуру

    И какой величины эта дельта? Хватает 10-ти разрядного (по факту 8-ми) АЦП?
    В таких схемах уровень напряжения на резисторах измеряют одновременно, что снижает требование к источнику тока (роль которого здесь выполняет банальное сопротивление). Но чтобы была точность хотя бы в 0.5 градусов, необходим 16-ти разрядный АЦП.
     
  7. Виктор

    Виктор Нуб

    Дельта сопротивления возникает на измерении уровня топлива. Если разница по абсолютному значению превышена - зажги диод.
    Температура охлаждающей жидкости измеряется с шагом 10 градусов от 10 до 90, далее 95 и все. АЦП это переваривает с большим запасом.

    Вопрос где я ошибаюсь? По отдельности при работе с пином P2 (A1) всё работает. И топливо при временном присоединении и временной программе показывает и температуру. Как только завожу на P4 (A2) топливо, а на P2 (A1) температуру - схема не выходит в рабочий режим...
     
  8. parovoZZ

    parovoZZ Гуру

    там реально перепад в 10 градусов? Прям холодильник какой-то.
     
  9. Виктор

    Виктор Нуб

    там (на топливе) перепад в 25 из 1023 единиц. Я ставлю пороговую дельту в 12 единиц, этого достаточно для отсеивания неточности измерений.
    Для охлаждающей жидкости общий перепад -20 - +100 градусов.
     
    Последнее редактирование: 27 ноя 2020