Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <SPI.h>
- #include <SD.h>
- #include <EEPROM.h>
- #include <OneWire.h>
- #include <iarduino_RTC.h> // Подключаем библиотеку iarduino_RTC для работы с модулями реального времени.
- #define SD_SS_pin 10 // подключаем SD карту на 10-й pin. Может быть придётся поменять потом.
- #define num_byte_setup 20 // количество переменных тип long для считывания с SD-карты (сами переменные тоже надо определить !)
- #define block_1_EEPROM 0 // начальный адрес блока переменных в EEPROM (num_byte_setup Х 4 = 80 байт)
- #define block_2_EEPROM num_byte_setup*4+10 // начальный адрес блока адресов термосенсоров в EEPROM (num_byte_setup Х 4 +10 = 90 )
- #define addr_max_boiler block_1_EEPROM + 0 // адрес ячейки памяти EEPROM, откуда брать значение переменной "T_max_boiler" - максимальная температура до которой нагреваем бойлер пелетным котлом
- #define addr_min_boiler block_1_EEPROM + 4 // адрес "T_min_boiler" - минимальная температура при которой пытаемся запустить пелетный котёл при отсутствии других источников тепла
- #define addr_tank_up block_1_EEPROM + 8 // адрес T_tank_up - максимальная температура в верхней части теплоаккумулятора при которой считаем его "заряженным"
- #define addr_tank_med block_1_EEPROM + 12 // адрес T_tank_med - максимальная температура в средней части теплоаккумулятора при которой прекращаем нагрев
- #define addr_tank_down block_1_EEPROM + 16 // адрес T_tank_down - максимальная температура в нижней части теплоаккумулятора при которой устраиваем "тревогу".
- #define num_sensors 5 // общее количество термодатчиков в системе
- OneWire ds(9); // если потребуется вторая шина 1-Wire, то придётся удвоить часть кода
- iarduino_RTC time(RTC_DS1302, 6, 7, 8); // Объявляем объект time для работы с RTC модулем на базе чипа DS1302, указывая выводы Arduino подключённые к выводам модуля RST, CLK, DAT
- // -------блок глобальных переменных----------------
- boolean _F_SD_exist = 0; // флаг наличия SD-карты в ридере
- int TEMPERATURE[num_sensors] = {0}; // массив для показаний термодатчиков
- String last_time_T = ""; // текстовое значение времени, когда крайний раз производилось измерение температуры
- //--------------------------------------------------
- //------------- запись логов на SD-карту-----------------------
- boolean LOG_data(boolean autoLOG, String filename, String filedata) { // функция имеет два режима: автоматическое логирование autoLOG=true и вывод в файл принятых параметров.
- boolean _W1_errors = true; // признак ошибки записи на SD-карту
- boolean _W2_errors = true; // признак ошибки записи на SD-карту
- if (autoLOG) { // если установлен autoLOG
- String filename = "/LOG/" + String(time.gettime("ymd")); // имя директории - "год.месяц.день" в директории \LOG
- String filedata = ""; // в данном случае нам монопенисуально, что пришло в параметрах функции
- if (!SD.exists(filename)) { // если ещё не создан каталог \LOG\текущая дата
- SD.mkdir(filename); // создаём каталог \LOG\текущая дата
- }
- filename = filename + '/' ; // для сохранения данных в директории \LOG\текущая дата\
- for (byte c = 0; c < num_sensors - 1 ; c++) { // чтобы убрать последнюю запятую, только для красоты
- filedata = filedata + String(TEMPERATURE[c] / 100.00) + ", "; // формируем строку для записи в файл (все сенсоры температуры)
- }
- File LOGfile = SD.open(filename + "all_sens.log", FILE_WRITE); // файл сохранения данных "все термосенсоры одним файлом" в директории \LOG\текущая дата
- unsigned long curent_size = LOGfile.size(); // размер файла до записи в него
- LOGfile.println(last_time_T + filedata + String(TEMPERATURE[num_sensors - 1] / 100.00)); // доделываем строку для записи в файл
- unsigned long new_size = LOGfile.size(); // размер файла после записи в него
- LOGfile.close(); // закрываем файл
- if (new_size > curent_size) _W1_errors = _W1_errors & false; // если размер файла не увеличился, то всё плохо
- filedata = " "; // очищаем переменные для следующего этапа
- for (byte c = 0; c < num_sensors; c++) { // цикл перебора всех термосенсоров в системе
- filename = filename ; // к сожалению, ограничение на имя файла 8.3
- if (!SD.exists(filename + "tsens_" + String(c) + ".log")) { // если такой файл создается в первый раз, то пишем в него приветственную речь
- for (byte x = 0; x < 8; x++) { // цикл считывания из EEPROM адреса текущего термосенсора
- filedata = filedata + String(EEPROM.read(block_2_EEPROM + (c * 9) + x )) + " "; // считываем из EEPROM отдельные байты и формируем имя файла
- }
- File LOGfile = SD.open(filename + "tsens_" + String(c) + ".log", FILE_WRITE); // открываем файл для записи
- LOGfile.print(F("Measurement results for the sensor : ")); // пишем в него "приветственную речь"
- LOGfile.println(filedata); // указываем адрес термосенсора, для которого создан этот файл
- LOGfile.close(); // закрываем файл
- }
- filedata = last_time_T + String(TEMPERATURE[c] / 100.00); // стандартная запись в файл : время,данные
- File LOGfile = SD.open(filename + "tsens_" + String(c) + ".log", FILE_WRITE); // открываем файл для записи. Такое усложнение для предотвращения дробления записи при перемене даты
- curent_size = LOGfile.size(); // размер файла до записи в него
- LOGfile.println(filedata); // стандартная запись в файл
- new_size = LOGfile.size(); // размер файла после записи в него
- LOGfile.close(); // закрываем файл
- if (new_size > curent_size) _W2_errors = _W2_errors & false; // если размер файла не увеличился, хоть один раз, то всё плохо.
- filedata = ""; // очищаем переменные для следующего этапа
- }
- filename = ""; // очищаем переменные для следующего этапа
- }
- if (!autoLOG) { // это для "ручного режима" записи LOG-файла
- if (!SD.exists(filename)) { // если файл с таким именем ещё не был создан
- File LOGfile = SD.open(filename, FILE_WRITE); // то открываем новый файл
- LOGfile.print(F("Time and date when LOGfile was started: ")); // пишем в него небольшую заметку.
- LOGfile.println(time.gettime("d-m-Y, H:i:s, D")); // пишем в файл новое установленное время и дату
- LOGfile.close(); // закрываем файл
- Serial.println(F("logfile 1")); // временный тестовый вывод
- }
- File LOGfile = SD.open(filename, FILE_WRITE); // если файл с таким именем уже был создан
- LOGfile.println(filedata); // пишем в него то, что пришло в параметрах функции
- LOGfile.close(); // закрываем файл
- Serial.println(F("logfile 0")); // временный тестовый вывод
- }
- Serial.println(F("end procedure loging")); // временный тестовый вывод
- return (_W1_errors || _W2_errors); // возвращаем признак ошибки записи в любом из блоков
- }
- //------------------конец процедуры-----------------------------
- void setup() {
- Serial.begin(115200);
- time.begin(); // Инициируем работу с модулем RTC DS1302.
- time.period (30); // Указываем обращаться к модулю RTC не чаще, чем один раз в полчаса, в этом промежутке значения вычисляются в библиотеке
- pinMode(SD_SS_pin, OUTPUT); // выход SS для SD-карты.
- byte addr[9] = {0}; // массив для адреса сенсора и его назначения
- long bufer_config[num_byte_setup] = {0}; // временный массив считанных с SD-карты настроек. допустимы переменные размером до 4 байта
- File configFile; // переменная файла
- boolean _F_begin = 0; // флаг начала обработки данных в файле
- String read_symbol = ""; // строка для формирования числового значения из символов в тексте
- byte count_symbol = 0; // счётчик цикла формирования строки String read_symbol
- byte temp_val = 0; // временная переменная чтения байт из файла
- int address = block_1_EEPROM; // устанавливаем начало блока для записи в EEPROM переменных из default.cfg
- //----------------- инициализация SD-карты------------------------
- if (SD.begin(SD_SS_pin)) { // проверяем, есть ли SD-карта в ридере
- _F_SD_exist = 1; // SD-карта присутствует, будем её использовать.
- //if (!SD.exists("LOG")) {
- // SD.mkdir("LOG");
- // }
- //-------------------- установка точного времени-----------------------------------
- if (SD.exists("settime.txt")) { // если на SD-карте присутствует файл \settime.txt
- configFile = SD.open("settime.txt"); // открываем файл
- read_symbol = ""; // строка для формирования числового значения из символов в тексте
- count_symbol = 0; // счётчик цикла формирования строки String read_symbol
- temp_val = 0; // временная переменная чтения байт из файла
- int a[7] = {0}; // массив для значений устанавливаемого времени
- while (configFile.available()) { // пока файл не кончился, читаем
- temp_val = configFile.read(); // присваиваем считанный из файла байт переменной temp_val
- if (temp_val == 0x29) { // если найдено ASCII значение ')' закрывающая скобка
- a[count_symbol] = read_symbol.toInt(); // преобразуем сформированную символьную строку в "цифровое" значение
- read_symbol = ""; // очищаем строку
- time.settime(a[0], a[1], a[2], a[3], a[4], a[5], a[6]); // Записываем время в модуль: 0 сек, 51 мин, 21 час, 27, октября, 2015 года, вторник.
- count_symbol = 0; // подготовка для следующей группы адресов
- }
- if (temp_val == 0x2C) { // если найдено ASCII значение ','
- a[count_symbol] = read_symbol.toInt(); // преобразуем сформированную символьную строку в "цифровое" значение
- read_symbol = ""; // очищаем строку для формирования числового значения из символов в тексте
- count_symbol++; // переходим к следующему элементу
- }
- if (temp_val == 0x30) read_symbol = read_symbol + "0";// если найдено ASCII значение '0', то добавляем в строку символ "0"
- if (temp_val == 0x31) read_symbol = read_symbol + "1";// если найдено ASCII значение '1', то добавляем в строку символ "1"
- if (temp_val == 0x32) read_symbol = read_symbol + "2";// если найдено ASCII значение '2', то добавляем в строку символ "2"
- if (temp_val == 0x33) read_symbol = read_symbol + "3";// если найдено ASCII значение '3', то добавляем в строку символ "3"
- if (temp_val == 0x34) read_symbol = read_symbol + "4";// если найдено ASCII значение '4', то добавляем в строку символ "4"
- if (temp_val == 0x35) read_symbol = read_symbol + "5";// если найдено ASCII значение '5', то добавляем в строку символ "5"
- if (temp_val == 0x36) read_symbol = read_symbol + "6";// если найдено ASCII значение '6', то добавляем в строку символ "6"
- if (temp_val == 0x37) read_symbol = read_symbol + "7";// если найдено ASCII значение '7', то добавляем в строку символ "7"
- if (temp_val == 0x38) read_symbol = read_symbol + "8";// если найдено ASCII значение '8', то добавляем в строку символ "8"
- if (temp_val == 0x39) read_symbol = read_symbol + "9";// если найдено ASCII значение '9', то добавляем в строку символ "9"
- }
- SD.remove("settime.txt"); // удаляем файл \settime.txt
- configFile = SD.open("settime.ok", FILE_WRITE); // делаем метку на флешке, что данные успешно считаны. Создаём файл \SETTIME.OK
- configFile.println(time.gettime("d-m-Y, H:i:s, D")); // пишем в файл новое установленное время и дату
- configFile.println(F("Time & Date was setup Ок")); // пишем в файл \SETTIME.OK небольшую заметку.
- configFile.println(F("To set the clock, you must delete the file \SETTIME.OK from the SD card and create the file \settime.txt")); // Для повторной установки часов необходимо удалить c SD-карты файл \SETTIME.OK и создать файл \settime.txt
- configFile.println(F("(СЕКУНДЫ,МИНУТЫ,ЧАСЫ,ДЕНЬ,МЕСЯЦ,ГОД,ДЕНЬ_НЕДЕЛИ)"));
- configFile.close(); // закрываем файл
- Serial.println(F("Time & Date was setup Ок")); // временный тестовый вывод
- }
- //-------- запись и чтение настроек системы ----------
- if (SD.exists("default.cfg") && !(SD.exists("default.ok"))) { // если на SD-карте присутствует файл настроек и он ещё не был загружен
- configFile = SD.open("default.cfg"); // открываем файл default.cfg для чтения
- while (configFile.available()) { // пока файл не кончился, читаем
- temp_val = configFile.read(); // присваиваем считанный файл переменной temp_val
- if (temp_val == 0x29 && _F_begin == 1) { // ищем закрывающую скобку, конец цикла формирования массива
- _F_begin = 0; // флаг окончания обработки данных в файле
- bufer_config[count_symbol] = read_symbol.toInt(); // преобразуем ранее сформированную символьную строку в "цифровое" значение
- read_symbol = ""; // очищаем строку для формирования числового значения из символов в тексте
- configFile.close(); // закрываем файл. Парсинг закончен.
- //--------------- запись данных в EEPROM -----------------
- for (int x = 0; x < num_byte_setup; x++) { // перебираем последовательно все элементы временного массива
- EEPROM.put(address, bufer_config[x]); // делим long на 4 byte и пишем их в ячейки энергонезависимой памяти
- address = address + 4; // выбираем следующую группу из четырёх ячеек
- }
- }
- if (temp_val == 0x2C && _F_begin == 1) { // если найдено ASCII значение ',' в течении цикла импорта данных, ограниченного символами '(' ')'
- bufer_config[count_symbol] = read_symbol.toInt(); // преобразуем сформированную символьную строку в "цифровое" значение
- read_symbol = ""; // очищаем строку для формирования числового значения из символов в тексте
- count_symbol++; // переходим к следующему элементу временного массива считанных с SD-карты настроек
- }
- if (temp_val == 0x28 && _F_begin == 0) _F_begin = 1; // ищем открывающую скобку, начало цикла формирования массива. Устанавливаем флаг начала обработки данных в файле
- if (temp_val == 0x30 && _F_begin == 1) read_symbol = read_symbol + "0"; // если найдено ASCII значение '0', то добавляем в строку символ "0"
- if (temp_val == 0x31 && _F_begin == 1) read_symbol = read_symbol + "1"; // если найдено ASCII значение '1', то добавляем в строку символ "1"
- if (temp_val == 0x32 && _F_begin == 1) read_symbol = read_symbol + "2"; // если найдено ASCII значение '2', то добавляем в строку символ "2"
- if (temp_val == 0x33 && _F_begin == 1) read_symbol = read_symbol + "3"; // если найдено ASCII значение '3', то добавляем в строку символ "3"
- if (temp_val == 0x34 && _F_begin == 1) read_symbol = read_symbol + "4"; // если найдено ASCII значение '4', то добавляем в строку символ "4"
- if (temp_val == 0x35 && _F_begin == 1) read_symbol = read_symbol + "5"; // если найдено ASCII значение '5', то добавляем в строку символ "5"
- if (temp_val == 0x36 && _F_begin == 1) read_symbol = read_symbol + "6"; // если найдено ASCII значение '6', то добавляем в строку символ "6"
- if (temp_val == 0x37 && _F_begin == 1) read_symbol = read_symbol + "7"; // если найдено ASCII значение '7', то добавляем в строку символ "7"
- if (temp_val == 0x38 && _F_begin == 1) read_symbol = read_symbol + "8"; // если найдено ASCII значение '8', то добавляем в строку символ "8"
- if (temp_val == 0x39 && _F_begin == 1) read_symbol = read_symbol + "9"; // если найдено ASCII значение '9', то добавляем в строку символ "9"
- }
- configFile = SD.open("default.ok", FILE_WRITE); // делаем метку на флешке, что данные успешно считаны.
- configFile.println(F("Data from \DEFAULT.CFG was read succes\r\nDelete this file for update EEPROM again")); // пишем в файл default.ok небольшую заметку-инструкцию. Для повторной записи в EEPROM необходимо удалить c SD-карты файл default.ok
- configFile.close(); // закрываем файл
- Serial.println(F("default.cgf was import succes"));
- }
- //----------------считываем адреса всех датчиков и сохраняем их в файл--------------
- if (!SD.exists("config.ini")) { // если на SD-карте отсутствует файл конфигурации термосенсоров создадим его.
- configFile = SD.open("config.ini", FILE_WRITE); // сохраним все адреса сенсоров в файл для привязки сенсоров
- ds.reset_search(); // сброс счётчика адресов 1-Wire
- while (ds.search(addr)) { // цикл, пока не найдены все сенсоры в системе
- for ( byte i = 0; i < 8; i++) { // перебираем элементы массива адреса сенсора
- configFile.print(addr[i], DEC); // пишем в файл информацию о сенсоре в десятичном формате, HEX сложнее парсить.
- configFile.print(" "); // пишем в файл разделитель байт.
- }
- configFile.print("x,\r\n"); // символ 'x' необходимо заменить в файле /CONFIG.INI на номер сенсора в схеме
- }
- configFile.close(); // закрываем файл, когда обнаружены все сенсоры на шине 1-Wire
- configFile = SD.open("config.ok", FILE_WRITE); // создаём файл-подтверждение, что запись прошла успешно
- configFile.println(F("List sensors was writen to \CONFIG.INI\n\rFor next step - edit \CONFIG.INI and delete this file \CONFIG.OK"));
- configFile.close(); // закрываем файл
- Serial.println(F("config.ini was writen Ок")); // временный тестовый вывод
- }
- //---создали файл с номерами датчиков, следующим шагом надо назначить их соответствие------------
- if (SD.exists("config.ini") && !(SD.exists("config.ok"))) { // если на SD-карте присутствует файл конфигурации термосенсоров и нет файла \CONFIG.OK то парсим \CONFIG.INI
- configFile = SD.open("config.ini"); // открываем файл для чтения
- address = block_2_EEPROM; // устанавливаем начало блока для записи в EEPROM адресов сенсоров
- read_symbol = ""; // строка для формирования числового значения из символов в тексте
- count_symbol = 0; // счётчик цикла формирования строки String read_symbol
- temp_val = 0; // временная переменная чтения байт из файла
- while (configFile.available()) { // пока файл не кончился, читаем
- temp_val = configFile.read(); // присваиваем считанный из файла символ переменной temp_val
- if (temp_val == 0x2C) { // если найдено ASCII значение ','
- addr[count_symbol] = read_symbol.toInt(); // преобразуем сформированную символьную строку в "цифровое" значение
- read_symbol = ""; // очищаем строку
- for (int x = 0; x < 9; x++) { // перебираем последовательно все элементы временного массива
- EEPROM.update((addr[8] * 9) + address + x, addr[x]); // и пишем их в ячейки энергонезависимой памяти
- }
- // address = address + 9; // выбираем следующую группу из девяти ячеек
- count_symbol = 0; // подготовка для следующей группы адресов
- }
- if (temp_val == 0x20) { // если найдено ASCII значение ' '
- addr[count_symbol] = read_symbol.toInt(); // преобразуем сформированную символьную строку в "цифровое" значение
- read_symbol = ""; // очищаем строку для формирования числового значения из символов в тексте
- count_symbol++; // переходим к следующему элементу
- }
- if (temp_val == 0x30) read_symbol = read_symbol + "0"; // если найдено ASCII значение '0', то добавляем в строку символ "0"
- if (temp_val == 0x31) read_symbol = read_symbol + "1"; // если найдено ASCII значение '1', то добавляем в строку символ "1"
- if (temp_val == 0x32) read_symbol = read_symbol + "2"; // если найдено ASCII значение '2', то добавляем в строку символ "2"
- if (temp_val == 0x33) read_symbol = read_symbol + "3"; // если найдено ASCII значение '3', то добавляем в строку символ "3"
- if (temp_val == 0x34) read_symbol = read_symbol + "4"; // если найдено ASCII значение '4', то добавляем в строку символ "4"
- if (temp_val == 0x35) read_symbol = read_symbol + "5"; // если найдено ASCII значение '5', то добавляем в строку символ "5"
- if (temp_val == 0x36) read_symbol = read_symbol + "6"; // если найдено ASCII значение '6', то добавляем в строку символ "6"
- if (temp_val == 0x37) read_symbol = read_symbol + "7"; // если найдено ASCII значение '7', то добавляем в строку символ "7"
- if (temp_val == 0x38) read_symbol = read_symbol + "8"; // если найдено ASCII значение '8', то добавляем в строку символ "8"
- if (temp_val == 0x39) read_symbol = read_symbol + "9"; // если найдено ASCII значение '9', то добавляем в строку символ "9"
- }
- configFile = SD.open("config.ok", FILE_WRITE); // делаем метку на флешке, что данные успешно считаны.
- configFile.println(F("config.ini was import succes. Update EEPROM succes.\n\rDelete this file for update EEPROM again")); // пишем в файл setup.ok небольшую заметку-инструкцию. Для повторной записи в EEPROM необходимо удалить c SD-карты файл setup.ok
- configFile.close(); // закрываем файл
- Serial.println(F("config.ini was import Ок")); // временный тестовый вывод
- }
- }
- else {
- _F_SD_exist = 0; // нет SD-карты, будем дальше работать без неё.
- }
- } // конец инициализации
- boolean T_measuring () { // функция считывания показаний датчиков температуры
- boolean _T_errors = false; // Флаг ошибки при преобразовании температуры
- byte type_s; // тип термосенсора, если будет замена на другой тип во время эксплуатации
- byte data[12]; // массив для хранения "сырых" данных от текущего термосенсора
- byte addr[8]; // массив для хранения адреса текущего термосенсора
- ds.reset(); // начало обмена данными на шине 1-Wire
- ds.skip(); // следующая команда применяется для всех термосенсоров
- ds.write(0x44); // начать конвертацию данных в значение температуры
- last_time_T = String(time.gettime("H:i:s, ")); // время последнего сеанса измерения температуры
- delay(150); // 150 миллисекунд на конвертацию. надо уточнить по даташиту
- for (byte i = 0; i < num_sensors; i++) { // цикл перебора все термосенсоров в системе
- for (byte x = 0; x < 8; x++) { // цикл считывания из EEPROM адреса текущего термосенсора
- addr[x] = EEPROM.read(block_2_EEPROM + (i * 9) + x ); // считываем из EEPROM отдельные байты и заносим в массив
- }
- if (OneWire::crc8(addr, 7) != addr[7]) { // проверяем контрольную сумму считанных из EEPROM байт адреса
- _T_errors = true; // если произошла ошибка при считывании, то устанавливаем флаг ошибки и продолжаем дальше
- if (_F_SD_exist) { // Если SD-карта доступна, то создаём файл с сообщением об ошибке
- File configFile = SD.open("system.err", FILE_WRITE); // делаем метку на флешке, что данные считаны с ошибкой.
- configFile.print(F("Thermosensor ")); // пишем в файл system.err сообщение об ошибке
- configFile.print(i); // номер термосенсора по схеме
- configFile.println(F(" CRC is not valid during reading addr from EEPROM !"));
- configFile.close(); // закрываем файл
- }
- }
- switch (addr[0]) { // первый байт адреса термосенсора указывает на тип сенсора
- case 0x10: // Chip = DS18S20 или старый тип DS1820
- type_s = 1; // устанавливаем признак типа термосенсора
- break;
- case 0x28: // Chip = DS18B20
- type_s = 0; // устанавливаем признак типа термосенсора
- break;
- case 0x22: // Chip = DS1822
- type_s = 0; // устанавливаем признак типа термосенсора
- break;
- default: // если не удалось идентифицировать термосенсор
- _T_errors = true; // ошибка при редактировании адреса в файле \CONFIG.INI, или ошибка чтения данных из EEPROM
- if (_F_SD_exist) { // Если SD-карта доступна, то создаём файл с сообщением об ошибке
- File configFile = SD.open("system.err", FILE_WRITE); // делаем метку на флешке, что произлошла ошибка при работе с термосенсором "i".
- configFile.print("Thermosensor "); // пишем в файл system.err сообщение об ошибке
- configFile.print(i); // номер термосенсора по схеме
- configFile.println(F(" error when editing the address in the file \CONFIG.INI, or the error reading data from the EEPROM."));
- configFile.close(); // закрываем файл
- }
- }
- ds.reset(); // начало обмена данными на шине 1-Wire
- ds.select(addr); // адрес текущего термосенсора
- ds.write(0xBE); // начать чтение данных с термосенсора
- for (byte j = 0; j < 9; j++) { // нам надо получить 9 байт от термосенсора
- data[j] = ds.read(); // массив для "сырых" данных
- }
- int16_t raw = (data[1] << 8) | data[0]; // 16-бит переменная из 2х8
- if (type_s) { // от типа зависит способ преобразования. Если Chip = DS18S20 или старый DS1820
- raw = raw << 3; // то он имеет 9 бит разрешающую способность
- if (data[7] == 0x10) { // "остаток счёта" может дать нам дополнительно 12 бит разрешающую способность
- raw = (raw & 0xFFF0) + 12 - data[6];
- }
- }
- else { // если Chip = DS18B20 или Chip = DS1822. обычно установлена 12 бит разрешающая способность, время преобразования 750 ms при "паразитном" питании
- byte cfg = (data[4] & 0x60); // проверяем, естановлен ли бит низкой разрешающей способности
- if (cfg == 0x00) raw = raw & ~7; // 9 бит разрешающая способность, время преобразования 93.75 ms
- else if (cfg == 0x20) raw = raw & ~3; // 10 бит разрешающая способность, время преобразования 187.5 ms
- else if (cfg == 0x40) raw = raw & ~1; // 11 бит разрешающая способность, время преобразования 375 ms
- }
- TEMPERATURE[i] = int(((float)raw / 16.0) * 100); // массив для измеренных значений температуры всеми термосенсорами
- }
- return _T_errors; // возвращаем флаг о наличии или отсутствии ошибок при работе модуля
- }
- void loop() {
- boolean test = T_measuring(); // делаем "снимок" температуры
- Serial.print("_T_errors = ");
- Serial.println(test); // временный тестовый вывод сообщения о наличии ошибок
- //----------формируем блок данных для записи на карту ----------
- if (_F_SD_exist) { // если присутствует SD-карта
- boolean test1 = LOG_data(1, "00", "00"); // автоматическое логирование показаний сенсоров температуры
- Serial.print("_W_errors = ");
- Serial.println(test1); // временный тестовый вывод сообщения о наличии ошибок
- }
- delay (10000); // период опроса сенсоров 10 секунд
- }
Advertisement
Add Comment
Please, Sign In to add comment