Эксперимент 18. Тестер батареек.

Тема в разделе "Arduino & Shields", создана пользователем Pivcheg, 3 ноя 2014.

  1. Pivcheg

    Pivcheg Нуб

    Добрый день.
    В задании для самостоятельного решения, не получается сделать вывод информации на ПК один раз в 10 секунд. Через каждые 10 секунд информация отправляется по многу раз.
    Какое условие нужно, чтобы информация отправлялась только один раз?
    Код (Text):
    // Подключаем библиотеку для работы с жидкокристаллическим экраном (англ. Liquid Crystal Display или просто LCD)
    #include <LiquidCrystal.h>
    // на диоде, защищающем от неверной полярности, падает доля напряжения (англ. voltage drop). Необходимо это учитывать
    #define DIODE_DROP  0.43
    // Объявляем объект, для управления дисплеем. Для его создания необходимо указать номера пинов, к которым он подключен в
    // порядке: RS E DB4 DB5 DB6 DB7
    LiquidCrystal lcd (13, 12, 11, 10, 9, 8);

    void setup ()
    {
      // начинаем работу с экраном. Сообщаем объекту количество строк и столбцов. Опять же, вызывать pinMode не требуется:
      // функция begin сделает всё за нас
      lcd.begin (16, 2);

      Serial.begin (9600);
      Serial.println ("Time \t Voltage \t ms");
      // печатаем сообщение на первой строке
      // lcd.print ("Battery voltage:");
    }

    void loop ()
    {
      unsigned int seconds = millis() / 1000;
      unsigned int ms = millis() % 1000;
      lcd.setCursor (0,0);
      lcd.print (seconds);
      lcd.print (".");
      lcd.print (ms);
      lcd.print (" Secs");
     
      // высчитываем напряжение подключенной батарейки
      float voltage = analogRead (A0) / 1024.0 * 10.0;
      // если напряжение на делителе напряжения было зафиксировано, нужно прибавить напряжение на диоде, т.к. оно было съедено
      if (voltage > 0.1)
        voltage += DIODE_DROP;
      // устанавливаем курсор на колонку 0, строку 1. На деле — это левый квадрат 2-й строки, т.к. нумерация начинается с нуля
      lcd.setCursor (0, 1);
      // печатаем напряжение в батарейке с точностью до сотых долей
      lcd.print (voltage, 2);
      // следом печатаем единицы измерения
      lcd.print (" Volts");

      if (millis() / 1000 % 10 == 1)
      {
      Serial.print (seconds);
      Serial.print ("\t");
      Serial.print (voltage);
      Serial.print ("\t");
      Serial.println (millis());
      }
    }
    Вот что в итоге выводится:
    Код (Text):
    Time      Voltage      ms
    0    4.02    1006
    1    4.19    1014
    1    3.96    1022
    1    4.18    1032
    1    3.98    1040
    1    4.09    1048
    1    4.05    1177
    1    4.10    1190
    1    3.89    1204
    1    4.01    1217
    1    4.10    1230
    1    3.88    1245
    1    3.97    1258
    1    4.09    1271
    1    3.88    1285
    1    3.94    1298
    1    4.08    1312
    1    3.89    1326
    1    3.90    1366
    1    3.87    1380
    1    4.06    1393
    1    3.91    1406
    1    3.85    1420
    1    4.05    1433
    1    3.92    1447
    1    3.82    1461
    1    3.97    1609
    1    3.77    1623
    1    3.92    1636
    1    3.97    1650
    1    3.75    1664
    1    3.88    1677
    1    3.97    1690
    1    3.75    1703
    1    3.85    1718
    1    3.77    1785
    1    3.78    1799
    1    3.95    1812
    1    3.78    1825
    1    3.75    1840
    1    3.95    1853
    1    3.79    1866
    1    3.72    1880
    1    3.93    1893
    1    3.80    1907
    1    3.70    1921
    1    3.92    1934
    1    3.82    1947
    1    3.68    1960
    1    3.89    1975
    1    3.83    1988
    10    3.39    11002
    11    3.30    11029
    11    3.23    11038
    11    3.37    11047
    11    3.17    11057
    11    3.41    11065
    11    3.17    11074
    11    3.40    11083
    11    3.28    11099
    11    3.17    11115
    11    3.24    11130
    11    3.41    11147
    11    3.25    11318
    11    3.19    11333
    11    3.31    11350
    11    3.43    11365
    11    3.36    11380
    11    3.43    11443
    11    3.29    11458
    11    3.20    11473
    11    3.30    11490
    11    3.44    11505
    11    3.39    11521
    11    3.22    11536
    11    3.22    11552
    11    3.38    11568
    11    3.44    11583
    11    3.32    11598
    11    3.45    11645
    11    3.37    11708
    11    3.45    11723
    11    3.34    11739
    11    3.21    11755
    11    3.27    11770
    11    3.35    11848
    11    3.46    11864
    11    3.22    11973
     
     
    Последнее редактирование: 3 ноя 2014
  2. SSnick

    SSnick Гик

    может быть потому, что когда Вы пишите условие if (millis() / 1000 % 10 == 1), то 1 это и 1.1 и 1.001, и 1,9
    поэтому оно срабатывает каждую милисекунду от 1.0000 сек до 1.999 сек
    возможно нужно единицу сделать переменной и дать ей тип нецелого числа
    например
    double A = 1;
    if (millis() / 1000 % 10 == A)
    ну или
    if (millis() / 1000 % 10 == 1.000)
     
  3. ets

    ets Нерд

    Сначала неправильно написал. Сейчас ошибку исправил

    Код (Text):

    // переменная, определяющая,
    // отправлена ли информация
    boolean wasSent = false;

    void setup()
    {
      Serial.begin(9600);
    }

    void loop()
    {
      // если 10 секунд прошло и информация не
      // отправлена, то...
      if (millis() / 1000 % 10 == 1 && !wasSent){
        // ...запоминаем, что отправили
        wasSent = true;
        // и выводим, что нужно
        Serial.println();  
      }
       // в другую (любую) секунду меняем состояние переменой
       else if(millis() / 1000 % 10 == 9 && wasSent){
        wasSent = false;
      }
    }
       
     
  4. ets

    ets Нерд

    Эксперимент показал, что оператор % возвращает только целые значения

    Код (Text):
      double a = millis() / 1000 % 10;
      double b = 1.000;
      if (a == b){
        Serial.println(a);
        Serial.println(b);
      }
    Вывод:
    Код (Text):
    1.00
    1.00
    1.00
    1.00
    1.00
    1.00
    1.00
    1.00
    1.00
    1.00
    1.00
    1.00
    1.00
    1.00
    1.00
    1.00
    1.00
    1.00
    1.00
     
     
  5. Pivcheg

    Pivcheg Нуб

    Всем спасибо, разобрался сам. Переписал условие и все заработало:
    В самом начале где #include объявил переменную
    Код (Text):

    int last_secs = 0;
     
    Само условие:
    Код (Text):

    int current_secs = millis() / 1000;
      if (current_secs - last_secs == 10)
      {
      Serial.print (seconds);
      Serial.print ("\t");
      Serial.print (voltage);
      Serial.print ("\t");
      Serial.println (current_secs);
      last_secs = (10 + last_secs);
      }
    }