Добавление переключателя для управления интервалом журнала

HI, это код набора весов каротажа. Я хочу добавить переключатель, который меняет время регистрации с установленного времени в 1000 мил на 5000 или 10000 мил в зависимости от положения переключателя. Мне нужна помощь, чтобы преобразовать интервал журнала в значение и как создать аргумент, который будет спрашивать переключатель, в каком положении он находится. Когда я пытаюсь поиграть с интервалом журнала, происходит сбой. Как выразить интервал журнала как переменную???Есть ли проблема с задержками??

//Это базовая рабочая версия
//все равно придется подключить красный провод к 5Вт
//проблема с затемнением ЖК-дисплея
//Индикатор ошибки работает, горит только в случае сбоя, без вспышки - отлично
// связаны время синхронизации и задержка с интервалом регистрации
//короткая вспышка с более длинным интервалом записи

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "RTClib.h"
#include "HX711.h"
HX711 scale(3, 2); 
#include <LiquidCrystal.h>
const int rs = 9, en = 8, d4 = A0, d5 = A1, d6 = A2, d7 = A3;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

// сколько миллисекунд между получением данных и их записью. 1000 мс — это раз в секунду
#define LOG_INTERVAL  1000 // 10000 = 5 минут, 5000 = 1 минута, 1000 = xx миллиметров между записями (уменьшите, чтобы получить больше/быстрее данных)

// сколько миллисекунд перед постоянной записью зарегистрированных данных на диск
// устанавливаем значение LOG_INTERVAL для записи каждый раз (самое безопасное)
// установите значение 10*LOG_INTERVAL, чтобы записывать все данные каждые 10 операций чтения данных, вы можете потерять до
// последние 10 чтений, если питание потеряно, но оно потребляет меньше энергии и работает намного быстрее!

#define SYNC_INTERVAL  LOG_INTERVAL //

uint32_t syncTime = 0; // время последней синхронизации()

#define ECHO_TO_SERIAL   1 // эхо-данные в последовательный порт
#define WAIT_TO_START    0 // Ожидание последовательного ввода в setup()
// цифровые контакты, которые подключаются к светодиодам
#define redLEDpin 6
#define greenLEDpin 7


RTC_PCF8523 rtc;//RTC_DS1307 РТК; // определяем объект «Часы реального времени»

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
// для защиты регистрации данных мы используем цифровой вывод 10 для линии SD CS
const int chipSelect = 10;
// файл журнала
File logfile;
void error(char *str)
{   Serial.print("error: ");
    Serial.println(str);
    digitalWrite(redLEDpin, HIGH);  // красный светодиод указывает на ошибку
    while(1); }
//Масштаб HX711(3, 2); // параметр "усиление" опущен; значение по умолчанию 128 используется библиотекой

void setup(void)
{   Serial.begin(9600);
    Serial.println();
    pinMode(redLEDpin, OUTPUT); // используем светодиоды отладки
    pinMode(greenLEDpin, OUTPUT);
  {     lcd.begin(16, 2);// устанавливаем количество столбцов и строк ЖК-дисплея:
        lcd.print("Zeroing Scales....");// Выводим сообщение на ЖК-дисплей.
  }   
    Serial.print("Initializing SD card...");// инициализируем SD-карту
    pinMode(10, OUTPUT);
    if (!SD.begin(chipSelect)) // проверяем, присутствует ли карта и может ли она быть инициализирована:
    error("Card failed, or not present");
    Serial.println("card initialized.");
    char filename[] = "LOGGER00.CSV"; // создаем новый файл
    for (uint8_t i = 0; i < 100; i++) 
    {
         filename[6] = i/10 + '0';
         filename[7] = i%10 + '0';
         if (! SD.exists(filename)) 
         {     logfile = SD.open(filename, FILE_WRITE); // открываем новый файл, только если он не существует
               break;  // выходим из цикла!
         }
     }
    if (! logfile)
        {    error("couldnt create file");
        }
     Serial.print("Logging to: "); // надо это исправить
     Serial.println(filename);// надо это исправить
     Wire.begin();  // подключаемся к RTC
     if (! rtc.begin()) 
        {    Serial.println("Couldn't find RTC");
              while (1);
        }
     if (! rtc.initialized()) 
        {   Serial.println("RTC is NOT running!");
          rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));// следующая строка устанавливает RTC на дату & время, когда был составлен этот скетч
        }
    logfile.println("Elapsed Mins,Date,Time (h:m:s),Day,Instant,Average");    
    #if ECHO_TO_SERIAL
    #endif //ECHO_TO_SERIAL
    analogReference(EXTERNAL); // Если вы хотите установить для параметра aref значение, отличное от 5 В
       {    Serial.println("HX711 Demo");
            Serial.println("Before setting up the scale:");
            Serial.print("read: \t\t");
            Serial.println(scale.read());      // распечатываем необработанные показания АЦП
            Serial.print("read average: \t\t");
            Serial.println(scale.read_average(20));   // распечатываем среднее значение 20 показаний АЦП
            Serial.print("get value: \t\t");
            Serial.println(scale.get_value(5));   // распечатываем среднее значение 5 показаний АЦП минус вес тары (еще не установлен)
            Serial.print("get units: \t\t");
            Serial.println(scale.get_units(5), 1);  // распечатываем среднее значение 5 показаний АЦП минус вес тары (не установлен), разделенный
            // по параметру SCALE (пока не установлен)
            scale.set_scale(2280.f);  // это значение получается путем калибровки весов с известными весами; подробности см. в README
            scale.tare();         // сбрасываем шкалу на 0
            Serial.println("After setting up the scale:");
            Serial.print("read: \t\t");
            Serial.println(scale.read());                 // распечатываем необработанные показания АЦП
            Serial.print("read average: \t\t");
            Serial.println(scale.read_average(20));       // распечатываем среднее значение 20 показаний АЦП
            Serial.print("get value: \t\t");
            Serial.println(scale.get_value(5));   // распечатываем среднее значение 5 показаний АЦП минус вес тары, установленный с помощью tare()
            Serial.print("get units: \t\t");
            Serial.println(scale.get_units(5), 1);        // распечатываем среднее значение 5 показаний АЦП минус вес тары, разделенное
            Serial.println("");//по параметру SCALE, установленному с помощью set_scale
            Serial.println("OMG its about to start............................");
            Serial.println("");
            Serial.println("Elapsed mins,Date,Time,Instant,Average");
      }

}

void loop(void)
{   lcd.begin(16, 2);
    lcd.print("Logging..."); // Выводим сообщение на ЖК-дисплей.
    lcd.setCursor(0,1); // Устанавливает курсор на столбец 1 и строку 0
    lcd.print("LoadCell:   "); // Печатает значение датчика: на ЖК-дисплей
    lcd.print(scale.get_units());


   { delay((LOG_INTERVAL -1) - (millis() % LOG_INTERVAL));// задержка на желаемый промежуток времени между показаниями
    uint32_t m = millis(); // записываем миллисекунды с момента запуска
    #if ECHO_TO_SERIAL
    #endif}
    DateTime now = rtc.now();
    logfile.print(m/60000);           // миллисекунды с момента запуска
    logfile.print(", ");  
    logfile.print(now.year(), DEC);
    logfile.print("/");
    logfile.print(now.month(), DEC);
    logfile.print("/");
    logfile.print(now.day(), DEC);
    logfile.print(" ");
    logfile.print(", ");
    logfile.print(now.hour(), DEC);
    logfile.print(":");
    logfile.print(now.minute(), DEC);
    logfile.print(":");
    logfile.print(now.second(), DEC);
    logfile.print(", ");
    logfile.print(daysOfTheWeek[now.dayOfTheWeek()]);
    logfile.print(", ");    ///
    logfile.print("\t");//
    logfile.print(scale.get_units(), 2);//
    logfile.print(", "); 
    logfile.print("\t");//
    logfile.print(scale.get_units(10), 2);//
    #if ECHO_TO_SERIAL
    Serial.print(m/60000);         // миллисекунды с момента запуска
    Serial.print("  , ");  
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.print("\t Instant:\t");
    Serial.print(scale.get_units(), 2);
    Serial.print(" Average:\t");
    Serial.print(scale.get_units(10), 2);

}
    scale.power_down();              // переводим АЦП в спящий режим
    delay(LOG_INTERVAL);
    scale.power_up();
    #endif //ECHO_TO_SERIAL
    logfile.println();
    #if ECHO_TO_SERIAL
    Serial.println();
    #endif // ECHO_TO_SERIAL

   // Теперь записываем данные на диск! Не синхронизируйте слишком часто — требуется 2048 байт ввода-вывода на SD-карту.
   // что требует много энергии и времени
    if ((millis() - syncTime) < SYNC_INTERVAL) return;
    syncTime = millis();


        {     digitalWrite(greenLEDpin, HIGH);// это был красный светодиод // мигает светодиод, показывая, что мы синхронизируем данные с картой & обновление ФАТ!
              delay(500);// я только что добавил это
              digitalWrite(greenLEDpin, LOW);
        }     // выключаем, если объединенные светодиоды были красными
              delay(LOG_INTERVAL/1);// я только что добавил это
              logfile.flush();
}

, 👍-1

Обсуждение

пожалуйста, добавьте больше деталей, то есть конкретный вопрос, а не «помогите мне», чтобы мы знали, что вы хотите решить., @MichaelT

Пожалуйста, сократите опубликованный код до той части, которая имеет отношение к вопросу., @Mikael Patel


1 ответ


1

Вы можете взять простой переключатель (с двумя состояниями) и подключить один конец к выводу Arduino, а другой — к земле.

Вам придется переписать определение LOG_INTERVAL в переменную. Поскольку вы используете его с функцией millis(), я бы предложил определить его как unsigned long.

В вашей функции setup() вы устанавливаете для pinMode() для этого вывода значение INPUT_PULLUP, чтобы активировать внутренний подтягивающий резистор. Теперь в вашей функции loop() вы считываете пин-код с помощью вызова digitalRead(). В зависимости от этого значения вы можете установить для переменной LOG_INTERVAL нужное значение (с помощью оператора If).

,