Добрый день. Есть готовый проверенный скетч с ESp32 нужно адаптировать его на Arduino nano.
Было сделано: закомментировано все что связано с вафлей, и команды по еепром для ESR32 // EEPROM.begin и // EEPROM.commit(); код откомпилировался и залит в плату. работает все кроме считывания импульсов с #define PULSE 10. Проект уже в железе можно оперативно все проверить. Код не большой и не сложный но я больше аппаратчик(
Вознаграждение оцениваю в 1000р и надеюсь на дальнейшее сотрудничество, за твердую монету по договоренности)
могу помочь с написанием скетча. fridgetester@mail.ru
от 2 тыс. руб.
ваша ссылка на код битая
выложите код
#include <TM1637Display.h> // Библиотека для работы с индикатором
#include <EEPROM.h> // Библиотека для работы с энергонезависимой памятью
#include "GyverEncoder.h" // Библиотека для работы с энкодером
#include <OneWire.h> // Для работы с датчиком температуры
//#include "WiFi.h" // Библиотека работы с сетью вайфай
//#include <HTTPClient.h> // Библиотека для работы с http
#define CLK 2 // Пин clk первого индикатора
#define DIO 3 // Пин dio первого индикатора
#define CLK2 4 // Пин clk второго индикатора
#define DIO2 5 // Пин dio второго индикатора
#define ENCODER_A 6 // Пин энкодера A
#define ENCODER_B 7 // Пин энкодера B
#define ENCODER_BUTTON 8 // Пин энкодера кнопка
#define PUMP 9 // Пин помпы насоса
#define PULSE 10 // Пин счетчика импульсов
#define DIR_IN 11 // Пин направления вперед
#define DIR_OUT 12 // Пин направления назад
#define ON 13 // Пин кнопки разрешения налива
#define TEMP 14 // Пин датчика температуры
#define TAR_BUTTON 15 // Пин кнопки режима тарирования
// Для подключения сети wifi --------------------------------------------------------------------
//const char* ssid = "DIR-615"; // Логин для подключения к сети wifi TP-Link_B342
//const char* password = "0891395interne"; // Пароль для подключения к сети wifi 81894895
//bool wifi = false;// Состояние подключения wifi
// Для подключения к серверу --------------------------------------------------------------------
//String authUsername = "testEsp32USer"; // Логин для входа на сервер
//String authPassword = "testEsp32Pass"; // Пароль для входа на сервер
//const char* host = "http://";// Адрес сервера для отправки данных
const uint8_t SEG_o[] = {SEG_G, SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F, SEG_G, 0}; // О - ошибка
const uint8_t SEG_h[] = {SEG_G, SEG_B | SEG_C | SEG_E | SEG_F | SEG_G, SEG_G, 0}; // Н - наливание
const uint8_t SEG_p[] = {SEG_G, SEG_A | SEG_B | SEG_C | SEG_E | SEG_F, SEG_G, 0}; // П - пауза
const uint8_t SEG_v[] = {SEG_G, SEG_A | SEG_B | SEG_C | SEG_D | SEG_G | SEG_E | SEG_F, SEG_G, 0};// В - ввод
const uint8_t SEG_l[] = {SEG_G, SEG_D | SEG_E | SEG_F, SEG_G, SEG_G}; // L - тарирование
uint16_t ms_timer = 0; // Миллисекундный таймер функция
uint32_t count_value = 1; // Переменная заданного количества литров для наливания
uint32_t tar_count = 1; // Переменная для коэфициента тарирования
uint16_t koef = 25; // Коэфициент для тарирования - импульсов на литр
uint16_t temp_koef = 25; // Временный коэфициент для тарирования - импульсов на литр
uint16_t det_impulse = 1; // Расчитанное необходимое количество импульсов для наливания тары
uint8_t value0 = 0; // Значение 0 разраяда на индикаторе - черта
uint8_t value1 = 0; // Значение 1 разраяда на индикаторе - знак
uint8_t value2 = 0; // Значение 2 разраяда на индикаторе - черта
uint8_t value3 = 0; // Значение 3 разраяда на индикаторе
uint8_t value4 = 0; // Значение 4 разраяда на индикаторе
uint8_t value5 = 0; // Значение 5 разраяда на индикаторе
uint8_t value6 = 0; // Значение 6 разраяда на индикаторе
uint8_t value7 = 0; // Значение 7 разраяда на индикаторе
uint8_t value0_old = 0; // Старое значение 0 разраяда на индикаторе - черта
uint8_t value1_old = 0; // Старое значение 1 разраяда на индикаторе - знак
uint8_t value2_old = 0; // Старое значение 2 разраяда на индикаторе - черта
uint8_t value3_old = 0; // Старое значение 3 разраяда на индикаторе
uint8_t value4_old = 0; // Старое значение 4 разраяда на индикаторе
uint8_t value5_old = 0; // Старое значение 5 разраяда на индикаторе
uint8_t value6_old = 0; // Старое значение 6 разраяда на индикаторе
uint8_t value7_old = 0; // Старое значение 7 разраяда на индикаторе
unsigned int mode_encoder = 0;// Режим работы энкодера
// 0 - -****
// 1 - *-***
// 2 - **-**
// 3 - ***-*
// 4 - ****-
// 5 - не мигаем
unsigned int mode_work = 0; // Переменная режима работы
// 0 - ввод (В)
// 1 - налив (Н)
// 2 - таррирование(L)
// 3 - ошибка (Е)
// 4 - пауза (П)
unsigned int dir = 0; // Направление потока воды
// 0 - движения нет
// 1 - вперед
// 2 - назад
bool flag = false; // Флаг события
float temperature = 0; // Температура с датчика
uint16_t porog_temp = 60; // Пороговое значение температуры вградусах после которого будет уходить в режим ошибки
uint32_t porog_dir = 180000; // Пороговое значение времени 3 минуты - если нет потока при наливании уходит в режим ошибки
OneWire oneWire(TEMP); // Тип данных для работы с датчиком температуры
Encoder enc1(ENCODER_A, ENCODER_B, ENCODER_BUTTON); // Тип данных для работы с энкодером
void pulse_isr()// Функция по прерыванию счетчика -------------------------------------------------------------
{
flag = true;// Поднимаем флаг события
if(mode_work == 1)// Если в режиме наливания
{
if(dir == 1)// Если направление потока вперед
{
if(det_impulse > 0)
{
det_impulse--;// уменьшаем текущее расчитанное количество импульсов
count_value = det_impulse/koef;// Расчитываем количество литров для вывода на экран
flag = true;// Поднимаем флаг события
}
else
{
count_value = 0;
mode_work = 0;// Уходим в режим ввода
digitalWrite(PUMP, LOW);// Насос не работает
mode_encoder = 4;// Режим работы энкодера - разряд единицы
value3 = 0;
value4 = 0;
value5 = 0;
value6 = 0;
value7 = 0;
flag = true;// Поднимаем флаг события
}
}
else if(dir == 2)// Если поток назад
{
det_impulse++;// прибавляем текущее расчитанное количество импульсов
count_value = det_impulse/koef;// Расчитываем количество литров для вывода на экран
flag = true;// Поднимаем флаг события
}
else// Если потока нет
{
// Ничего не делаем
}
}
/*
if(mode_work == 1)// Если в режиме наливания
{
if(dir == 1)// Если направление потока вперед
{
if(count_value > 0)
{
if(temp_koef > 0)
{
temp_koef--;
}
else
{
count_value--;// уменьшаем текущее количество
temp_koef = koef;//
}
}
else
{
mode_work = 0;// Уходим в режим ввода
digitalWrite(PUMP, LOW);// Насос не работает
mode_encoder = 4;// Режим работы энкодера - разряд единицы
value3 = 0;
value4 = 0;
value5 = 0;
value6 = 0;
value7 = 0;
flag = true;// Поднимаем флаг события
}
}
else if(dir == 2)// Если поток назад
{
if(temp_koef > 0)
{
temp_koef--;
}
else
{
count_value++;// увеличиваем текущее количество
temp_koef = koef;//
}
}
else// Если потока нет
{
// Ничего не делаем
}
}
*/
if(mode_work == 2)// Если в режиме тарирования
{
if(dir == 2)// Если направление потока назад
{
if(tar_count > 1)
{
tar_count--;// уменьшаем текущее количество тары
}
}
else if(dir == 1)// Если поток вперед
{
tar_count++;// Увеличиваем текущее количество литров тары
}
else// Если потока нет
{
// Ничего не делаем
}
}
// Преобразуем ****************************
if(count_value > 0)
{
value3 = count_value/10000;
value4 = (count_value%10000)/1000;
value5 = (count_value%1000)/100;
value6 = (count_value%100)/10;
value7 = count_value%10;
}
}
TM1637Display display_1 = TM1637Display(CLK, DIO); // Определяем тип данных для работы с первым индикатором
TM1637Display display_2 = TM1637Display(CLK2, DIO2);// Определяем тип данных для работы с вторым индикатором
// *******************************************************************************************************************
// ************* Функция инициализации *******************************************************************************
// ******************************************************************************************************************
void setup() {
Serial.begin(9600); // Серийный порт для отладки
// Инициализация пинов ---------------------------------------------------------------------------------------------
pinMode(PUMP, OUTPUT); // Выход - реле помпа
pinMode(DIR_IN, INPUT); // Вход - пин направления потока воды вперед
pinMode(DIR_OUT, INPUT); // Вход - пин направления потока воды назад
pinMode(ON, INPUT_PULLUP); // Вход - пин кнопки разрешения налива
pinMode(ENCODER_BUTTON, INPUT_PULLUP);// Вход - пин кнопки энкодера
pinMode(ENCODER_A, INPUT_PULLUP); // Вход - пин сигнала энкодера а
pinMode(ENCODER_B, INPUT_PULLUP); // Вход - пин сигнала энкодера б
pinMode(PULSE, INPUT_PULLUP); // Вход - пин счетчика
pinMode(TAR_BUTTON, INPUT_PULLUP); // Вход - пин кнопки режима тарирования
// EEPROM.begin(300); // Память в резерв - размер 100
//EEPROM.commit(); // Готовим
int count_value_f = 0;
int koef_f = 0;
EEPROM.get(4, count_value_f); // Читаем из памяти адрес 4 количество для наливания
//EEPROM.commit(); // Готовим
EEPROM.get(8, koef_f); // Читаем из памяти адрес 6 коэфициент
//EEPROM.commit(); // Готовим
if((count_value_f != 0) && (count_value_f < 99999))
{
count_value = count_value_f;
}
if((koef_f != 0) && (koef_f < 99999))
{
koef = koef_f;
}
if(count_value > 0)
{
value3 = count_value/10000;
value4 = (count_value%10000)/1000;
value5 = (count_value%1000)/100;
value6 = (count_value%100)/10;
value7 = count_value%10;
}
display_1.clear(); // Чистим первый индикатор
display_1.setBrightness(7); // Определяем яркость первого индикатора
display_2.clear(); // Чистим второй индикатор
display_2.setBrightness(7); // Определяем яркость второй индикатора
display_1.clear();
display_1.setSegments(SEG_h,1,1);
display_1.showNumberDec(value3, false, 1, 3);// Выводим значение на первый индикатор
display_2.clear();
display_2.showNumberDec(value4, false, 1, 0);// Выводим значение на первый индикатор
display_2.showNumberDec(value5, false, 1, 1);// Выводим значение на первый индикатор
display_2.showNumberDec(value6, false, 1, 2);// Выводим значение на первый индикатор
display_2.showNumberDec(value7, false, 1, 3);// Выводим значение на первый индикатор
attachInterrupt(PULSE, pulse_isr, CHANGE); // Функция по прерыванию счетчика
attachInterrupt(ENCODER_A, isr, CHANGE); // Функция по прерыванию энкодера
/*
// Сеть WIFI ----------------------------------------------------------------------------
WiFi.begin(ssid, password);// Запуск подключения вайфай, логин и пароль сети
int count = 0;// Счетчик попыток
while(WiFi.status() != WL_CONNECTED)// Ожидание подключения к сети
{
count++;// Счетчик попыток прибавляем
delay(500);// Паузп между попытками подключения
Serial.println("Connecting to WiFi..");// Вывод отладочной информации в серийный порт
if(count == 10)// Счетчик попыток 10 раз
{
Serial.println("Connecting NO !!!!!!!!!!!");// Вывод отладочной информации в серийный порт
break;
}
}
*/
}
void isr()
{
enc1.tick(); // отработка в прерывании
}
// *******************************************************************************************************************
// ************* Функция основного цикла *****************************************************************************
// ******************************************************************************************************************
void loop()
{
// Раз в секунду проверяем температуру -----------------------------------------------------------------------------
if(ms_timer == 900)
{
temperature = readTemperature();
if (temperature != 0) // Проверяем, успешно ли удалось считать температуру
{
Serial.print("Температура: ");
Serial.print(temperature);
Serial.println("°C");
}
else
{
Serial.println("Ошибка при считывании температуры!");
temperature = 0;
}
if(temperature > porog_temp)// Если температура выше порога
{
mode_work = 3;// Уходим в режим ошибки
flag = true;// Поднимаем флаг события
}
}
// Контроль наличия потока воды -------------------------------------------------------------------------------
if((mode_work == 1) && (dir == 0))// Если наливаем а потока нет
{
if(porog_dir > 0)
{
porog_dir--;
}
else
{
porog_dir = 180000;// Возвращаем значение
mode_work = 3;// Уходим в режим ошибки
flag = true;// Поднимаем флаг события
}
}
else
{
porog_dir = 180000;// Возвращаем значение
}
/*
// ****************************************************************************************************
// ******** Работа с wifi сетью **********************************************************************
// ****************************************************************************************************
if(WiFi.status() == WL_CONNECTED)// Проверка подключения к сети wifi
{
wifi = true;// Флаг подключения
}
else
{
wifi = false;// Флаг подключения
WiFi.begin(ssid, password);// Повторный запуск подключения вайфай, логин и пароль сети
int count = 0;// Счетчик попыток
while(WiFi.status() != WL_CONNECTED)// Ожидание подключения к сети
{
count++;// Счетчик попыток прибавляем
Serial.println("Connecting to WiFi..");// Вывод отладочной информации в серийный порт
if(count == 5)// Счетчик попыток 5 раз
{
Serial.println("Connecting NO !!!!!!!!!!!");// Вывод отладочной информации в серийный порт
break;
}
delay(1000);// Пауза 1 секунда между попытками подключения
}
}
*/
/*
// ****************************************************************************************************
// ******** Отправка пакета **************************************************************************
// ****************************************************************************************************
if(wifi)// Если сеть подключена
{
HTTPClient http; // Объявить объект класса HttpClient
http.begin(host); // Адрес сервера для отправки запроса
http.addHeader("Content-Type", "text/plain");// Заголовок для текстовых данных
String auth = "test header";// Заголовок
http.addHeader("Authorization", "Basic " + auth);// Заголовок аутентификации
// Собираем данные в одно длинное строковое сообщение ---------------
String mess;// Переменная для строкового сообщения
mess = String(count_value);// Количество наливаемого
int httpCode = http.POST(mess);// Отправляем строку данных и получаем в ответ год
String payload = http.getString();// Получаем строку возрата
// Проверяем дошло ли сообщение и с какой командой ------------------------------------
switch{payload}
{
case 0;
{
// Действия при команде 0
}
break;
case 1;
{
// Действия при команде 1
}
break;
case 2;
{
// Действия при команде 2
}
break;
case 3;
{
// Действия при команде 3
}
break;
}
http.end(); // Закрывам соединение
}// Конец проверки подключения сети
// ############ Конец отправки пакета ################################################################
*/
if(value3 > 9){value3 = 0;}
if(value4 > 9){value4 = 0;}
if(value5 > 9){value5 = 0;}
if(value6 > 9){value6 = 0;}
if(value7 > 9){value7 = 0;}
enc1.tick(); // отработка в прерывании
// Смотрим направление потока воды **********************************************************************************************************
if((digitalRead(DIR_IN) == HIGH) && (digitalRead(DIR_OUT) == LOW))// Вода вперед
{
dir = 1;// Направление потока вперед
}
else if((digitalRead(DIR_IN) == LOW) && (digitalRead(DIR_OUT) == HIGH))// Вода назад
{
dir = 2;// Направление потока назад
}
else if((digitalRead(DIR_IN) == LOW) && (digitalRead(DIR_OUT) == LOW))// Вода стоп
{
dir = 0;// Потока нет
}
else// Другие положения ошибка
{
dir = 0;// Потока нет - ошибка
}
// Отрабатываем работу таймера *********************************************************************************************
if(ms_timer < 1000)
{
ms_timer++; // Прибавляем
delayMicroseconds(500); // Дискретность таймера
}
else
{
ms_timer = 0;// Сброс от переполнения
}
if(mode_work == 0)// если в режиме ввода - мигаем ***************************************************************
{
switch(mode_encoder)
{
case 0:
{
if (enc1.isRight()) value3++;
if (enc1.isLeft()) value3--;
if((value3 > 9) || (value3 < 0)){value3 = 0;}
if(ms_timer == 0)
{
display_1.clear();
display_1.setSegments(SEG_v,3,0);
display_1.showNumberDec(value3, false, 0, 3);// Выводим значение на первый индикатор
}
if(ms_timer == 500)
{
display_1.clear();
display_1.setSegments(SEG_v,3,0);
display_1.showNumberDec(value3, false, 1, 3);// Выводим значение на первый индикатор
}
}
break;
case 1:
{
if (enc1.isRight()) value4++;
if (enc1.isLeft()) value4--;
if((value4 > 9) || (value4 < 0)){value4 = 0;}
if(ms_timer == 0)
{
display_2.clear();
display_2.showNumberDec(value4, false, 0, 0);// Выводим значение на второй индикатор
display_2.showNumberDec(value5, false, 1, 1);// Выводим значение на второй индикатор
display_2.showNumberDec(value6, false, 1, 2);// Выводим значение на второй индикатор
display_2.showNumberDec(value7, false, 1, 3);// Выводим значение на второй индикатор
}
if(ms_timer == 500)
{
display_2.clear();
display_2.showNumberDec(value4, false, 1, 0);// Выводим значение на второй индикатор
display_2.showNumberDec(value5, false, 1, 1);// Выводим значение на второй индикатор
display_2.showNumberDec(value6, false, 1, 2);// Выводим значение на второй индикатор
display_2.showNumberDec(value7, false, 1, 3);// Выводим значение на второй индикатор
}
}
break;
case 2:
{
if (enc1.isRight()) value5++;
if (enc1.isLeft()) value5--;
if((value5 > 9) || (value5 < 0)){value5 = 0;}
if(ms_timer == 0)
{
display_2.clear();
display_2.showNumberDec(value4, false, 1, 0);// Выводим значение на второй индикатор
display_2.showNumberDec(value5, false, 0, 1);// Выводим значение на второй индикатор
display_2.showNumberDec(value6, false, 1, 2);// Выводим значение на второй индикатор
display_2.showNumberDec(value7, false, 1, 3);// Выводим значение на второй индикатор
}
if(ms_timer == 500)
{
display_2.clear();
display_2.showNumberDec(value4, false, 1, 0);// Выводим значение на второй индикатор
display_2.showNumberDec(value5, false, 1, 1);// Выводим значение на второй индикатор
display_2.showNumberDec(value6, false, 1, 2);// Выводим значение на второй индикатор
display_2.showNumberDec(value7, false, 1, 3);// Выводим значение на второй индикатор
}
}
break;
case 3:
{
if (enc1.isRight()) value6++;
if (enc1.isLeft()) value6--;
if((value6 > 9) || (value6 < 0)){value6 = 0;}
if(ms_timer == 0)
{
display_2.clear();
display_2.showNumberDec(value4, false, 1, 0);// Выводим значение на второй индикатор
display_2.showNumberDec(value5, false, 1, 1);// Выводим значение на второй индикатор
display_2.showNumberDec(value6, false, 0, 2);// Выводим значение на второй индикатор
display_2.showNumberDec(value7, false, 1, 3);// Выводим значение на второй индикатор
}
if(ms_timer == 500)
{
display_2.clear();
display_2.showNumberDec(value4, false, 1, 0);// Выводим значение на второй индикатор
display_2.showNumberDec(value5, false, 1, 1);// Выводим значение на второй индикатор
display_2.showNumberDec(value6, false, 1, 2);// Выводим значение на второй индикатор
display_2.showNumberDec(value7, false, 1, 3);// Выводим значение на второй индикатор
}
}
break;
case 4:
{
if (enc1.isRight()) value7++;
if (enc1.isLeft()) value7--;
if((value7 > 9) || (value7 < 0)){value7 = 0;}
if(ms_timer == 0)
{
display_2.clear();
display_2.showNumberDec(value4, false, 1, 0);// Выводим значение на второй индикатор
display_2.showNumberDec(value5, false, 1, 1);// Выводим значение на второй индикатор
display_2.showNumberDec(value6, false, 1, 2);// Выводим значение на второй индикатор
display_2.showNumberDec(value7, false, 0, 3);// Выводим значение на второй индикатор
}
if(ms_timer == 500)
{
display_2.clear();
display_2.showNumberDec(value4, false, 1, 0);// Выводим значение на второй индикатор
display_2.showNumberDec(value5, false, 1, 1);// Выводим значение на второй индикатор
display_2.showNumberDec(value6, false, 1, 2);// Выводим значение на второй индикатор
display_2.showNumberDec(value7, false, 1, 3);// Выводим значение на второй индикатор
}
}
break;
}
// Обновляем значение основного числа
count_value = value7 + (value6*10) + (value5*100) + (value4*1000) + (value3*10000);
}// end если в режиме ввода - мигаем
if(enc1.isClick())// Отрабатываем смену разрядов *****************************************************************
{
flag = true;// Поднимаем флаг события
if(mode_encoder < 4)
{
mode_encoder++;
}
else
{
mode_encoder = 0;
}
}
// Выводим значения на индикаторы при каких либо изменениях *********************************************************************************************
if((flag == true) || (value0 != value0_old) || (value1 != value1_old) || (value2 != value2_old) || (value3 != value3_old) || (value4 != value4_old) || (value5 != value5_old) || (value6 != value6_old) || (value7 != value7_old))
{
if(mode_work != 3)// Не находится в режиме ошибки
{
// Вывод на индикаторы поразрядно
display_1.clear();
if(mode_work == 0)// Если в режиме ввода
{
display_1.setSegments(SEG_v,3,0);
}
else if(mode_work == 1)// Если в режиме наливания
{
display_1.setSegments(SEG_h,3,0);
}
else if(mode_work == 2)// Если в режиме тарирования
{
display_1.setSegments(SEG_l,3,0);
}
else if(mode_work == 4)// Если в режиме паузы
{
display_1.setSegments(SEG_p,3,0);
}
else
{
}
display_1.showNumberDec(value3, false, 1, 3);// Выводим значение на первый индикатор
display_2.clear();
display_2.showNumberDec(value4, false, 1, 0);// Выводим значение на второй индикатор
display_2.showNumberDec(value5, false, 1, 1);// Выводим значение на второй индикатор
display_2.showNumberDec(value6, false, 1, 2);// Выводим значение на второй индикатор
display_2.showNumberDec(value7, false, 1, 3);// Выводим значение на второй индикатор
// Обновляем старые значения
value0_old = value0;
value1_old = value1;
value2_old = value2;
value3_old = value3;
value4_old = value4;
value5_old = value5;
value6_old = value6;
value7_old = value7;
flag = false;// Сбрасываем флаг события
}
}// end вывод значения
// Смотрим кнопку налива *******************************************************************************************************************
if(digitalRead(ON) == LOW)// Если нажата
{
flag = true;// Поднимаем флаг события
// Обновляем значение основного числа
count_value = value7 + (value6*10) + (value5*100) + (value4*1000) + (value3*10000);
int temp = count_value;
EEPROM.put(4, temp);// Записываем в память в адрес 4 значение общего количества
//EEPROM.commit();
temp = koef;
EEPROM.put(8, temp); // Записываем в память в адрес 6 значение коефициента
//EEPROM.commit();
unsigned int time_button = 1; // Переменная время нажатия кнопки разрешения налива
for(int i = 0; i < 100000; i++)// До 100 секунд
{
if(digitalRead(ON) == HIGH)// Если кнопку отпустили то
{
break;// Выход из цикла
}
time_button++;
if(time_button > 5000)// Очень длинное нажатие - сброс всего !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
{
count_value = 0;
tar_count = 1;
koef = 25;
value3 = count_value/10000;
value4 = (count_value%10000)/1000;
value5 = (count_value%1000)/100;
value6 = (count_value%100)/10;
value7 = count_value%10;
int temp = count_value;
EEPROM.put(4, temp);// Записываем в память в адрес 4 значение общего количества
//EEPROM.commit();
temp = koef;
EEPROM.put(8, temp); // Записываем в память в адрес 6 значение коефициента
//EEPROM.commit();
display_1.clear();
display_1.setSegments(SEG_v,3,0);
display_1.showNumberDec(value3, false, 1, 3);// Выводим значение на первый индикатор
display_2.clear();
display_2.showNumberDec(value4, false, 1, 0);// Выводим значение на второй индикатор
display_2.showNumberDec(value5, false, 1, 1);// Выводим значение на второй индикатор
display_2.showNumberDec(value6, false, 1, 2);// Выводим значение на второй индикатор
display_2.showNumberDec(value7, false, 1, 3);// Выводим значение на второй индикатор
break;// Выход из цикла
}
delay(1); // Пауза
}
// Отрабатываем в зависимости от длинны нажатия кнопки разрешения налива
if(time_button < 1000)// Короткое нажатие -------------
{
if((mode_work == 0) || (mode_work == 4))// Если в режиме ввода или паузы
{
// Обновляем значение основного числа
count_value = value7 + (value6*10) + (value5*100) + (value4*1000) + (value3*10000);
det_impulse = count_value * koef;// Необходимое количество импульсов = текущее заданное количество * расчитанный коэффициент
if(count_value != 0)// Если на экране что то есть
{
mode_work = 1;// В режим наливания
digitalWrite(PUMP, HIGH);// Насос работает
}
}
else
{
mode_work = 4;// В режим паузы
digitalWrite(PUMP, LOW);// Насос не работает
if(count_value > 0)
{
value3 = count_value/10000;
value4 = (count_value%10000)/1000;
value5 = (count_value%1000)/100;
value6 = (count_value%100)/10;
value7 = count_value%10;
}
}
}
else if((time_button > 1000) && (time_button < 5000))// Длинное нажатие в режим ввода -----------------------
{
mode_work = 0;// В режим ввода
digitalWrite(PUMP, LOW);// Насос не работает
}
else
{
}
delay(500);// Пауза от дребезга кнопки разрешения наливания
}
// Смотрим кнопку перехода в режим тарирования *******************************************************************************************************************
if(digitalRead(TAR_BUTTON) == LOW)// Если нажата
{
flag = true;// Поднимаем флаг события
if(mode_work != 2)// Если не в режиме тарирования то заходим в режим
{
mode_work = 2;// Уходим в режим тарирования
digitalWrite(PUMP, HIGH);// Насос работает
tar_count = 1;// Начинаем отсчет литров тары
}
else if(mode_work == 2)// Если в режиме тарирования то выходим из режима
{
// Расчитываем коэфициент
koef = tar_count/count_value;// Расчитываем импульсы на литр
if(koef < 1)
{
koef = 1;
}
tar_count = 1;// Сбрасываем счетчик тарирования
temp_koef = koef;// Временое значение заполняем
mode_work = 0;// Уходим в режим ввода
digitalWrite(PUMP, LOW);// Насос не работает
int temp = count_value;
EEPROM.put(4, temp);// Записываем в память в адрес 4 значение общего количества
//EEPROM.commit();
temp = koef;
EEPROM.put(8, temp); // Записываем в память в адрес 6 значение коефициента
//EEPROM.commit();
}
else
{
}
delay(500);// От дребезга
}
// Отрабатываем работу помпы ***************************************************************************************************************
if((mode_work == 1) || (mode_work == 2))// Если в режиме наливания или тарирования
{
if(count_value > 0)// Если есть что наливать
{
digitalWrite(PUMP, HIGH);// Насос работает
}
else// Если в других режимах
{
digitalWrite(PUMP, LOW);// Насос не работает
}
}
// Если в режиме ошибки ***************************************************************************************************************
if((mode_work == 3) && (ms_timer == 300))// Если в режиме ошибки И раз в секунду
{
if(temperature > 0)
{
display_1.clear();
display_1.setSegments(SEG_o,3,0);
display_1.showNumberDec(0, false, 1, 3);//
display_2.clear();
display_2.showNumberDec(0, false, 1, 0);//
display_2.showNumberDec(0, false, 1, 1);//
display_2.showNumberDec(int(temperature)/10, false, 1, 2);// Выводим значение температуры десятые
display_2.showNumberDec(int(temperature)%10, false, 1, 3);// Выводим значение температуры единицы
digitalWrite(PUMP, LOW);// Насос не работает
}
}
}
float readTemperature() // Функция для считывания температуры с датчика DS18B20 ********************************************************************
{
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
// Поиск подключенных датчиков DS18B20 на шине OneWire
if (!oneWire.search(addr)) {
//Serial.println("Датчики DS18B20 не найдены.");
// Сбрасываем поиск и возвращаем "NaN" (не число) в случае ошибки
oneWire.reset_search();
return NAN;
}
// Проверка целостности адреса датчика с помощью CRC
if (OneWire::crc8(addr, 7) != addr[7]) {
//Serial.println("CRC не совпадает!");
return NAN;
}
// Определение типа датчика на основе первого байта адреса
switch (addr[0]) {
case 0x10:
type_s = 1; // DS18S20 или DS1822
break;
case 0x28:
case 0x22:
type_s = 0; // DS18B20
break;
default:
Serial.println("Неизвестный тип датчика.");
return NAN;
}
// Сбрасываем шину и выбираем адрес конкретного датчика
oneWire.reset();
oneWire.select(addr);
// Запускаем измерение температуры на датчике
oneWire.write(0x44); // 0x44 - команда начать измерение
// Ожидание завершения измерения (время зависит от разрешения)
delay(500);
// Сбрасываем шину и выбираем адрес датчика для чтения данных
present = oneWire.reset();
oneWire.select(addr);
oneWire.write(0xBE); // 0xBE - команда чтения данных
// Считываем 9 байт данных температуры и CRC
for (i = 0; i < 9; i++) {
data[i] = oneWire.read();
}
// Преобразование считанных данных в температуру
int16_t raw = (data[1] << 8) | data[0];
float celsius = 0.0;
// Применяем разрешение и коррекцию для разных типов датчиков
if (type_s == 1)
{
//raw = raw << 3; // Увеличиваем разрешение до 12 бит
//if (data[7] == 0x10) {
// // Температура с высоким разрешением (DS18S20)
//raw = (raw & 0xFFF0) + 12 - data[6];
//}
} else {
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
}
celsius = (float)raw / 16.0; // Преобразуем вещественное значение температуры и возвращаем
return celsius;
}
@fridgetester
удачи тебе в разгребании этой каши за 2 тыс
@Gomermen174
если накопите десятку - можем пообщаться
чел, я написал ОТ 2 тыс.
после того как тс прислал мне код, я немного скорректировал цену. мы не договорились.
так что тебе удачи в раскрутке на десятку
attachInterrupt в NANO работает только на 2 и 3 ноге.
Или у вас версия адона, где attachInterrupt работает на всех ногах?
Если можно поменять ноги, то поменяйте. Если нельзя, то или искать библиотеку аналогичную attachInterrupt, или руками прописывать ISR
это код для ЕСП32
при переписывании его на Нано, конечно, ноги стоит поменять. И еще много чего.
А много просто выкинуть и написать заново. Например обработчик прерывания на 150 или 200 строк выглядит эпично… Или энкодер, обрабатываемый и в прерывании, и в лупе.
Или таймер, имитирующий миллис, но работающий на делеях
Да там неделю разбираться и отлаживать
ну пусть сам переписывает
Насажать в этом коде “костылей” , чтобы оно “как-нибудь” запустилось на Нано - наверно можно и за час, да только ведь оно будет глючить и ТС потом весь мозг вынесет
Можно сделать. Оцениваю работу в 30 000 руб.