2

Нужна помощь ESP32 wroom32+DS18B20

Доброго времени, уважаемые пикабушники! Столкнулся с проблемой получения температуры на ESP32. Собрал блок управления насосом на Arduino NANO - все работает без проблем. Появилась необходимость пересадить код на ESP32. Алгоритм работы следующий:
Имеется насос и 2 датчика температуры. Один - в воде, второй - на корпусе двигателя. Насос работает циклично по 1 часу. 1 час работает, час отдыхает. Если мотор начал перегреваться - система останавливает мотор и выводит сообщение "NEED REPAIR". В рабочем режиме на дисплей выводятся показания температур с обоих датчиков. Сюда же прикручен джойстик и LCD дисплей. Для управления джойстиком использовал библиотеку от @AlexGyver.

Вот схема разводки:

Датчики температуры подключены к D19 и D23

Датчики температуры подключены к D19 и D23

Использую следующий набор библиотек:

#include <EEPROM.h>
#include <AnalogKey.h>
#include <GyverButton.h>
//#include <GyverWDT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <microDS18B20.h>
#include <OneWire.h>
#include <DallasTemperature.h>

Для опроса датчиков пользуюсь последней библиотекой (DallasTemperature). Подключаю оба датчика к 19 пину. (пробовал на 23-й. Результат тот же). Если делаю только опрос датчика и вывод в СОМ-порт - все в порядке. Датчик опрашивается, температура выводится. Но стоит мне загрузить полный скетч программы- тут начинается самое необычное:

Пока пин "Data" датчиков температуры не подключен к пину 19 или 23 - программа выводит мне показания на LCD "-127". Но как только подключаю хотя бы один датчик - дисплей тупо гаснет. Вероятнее всего, ошибка где-то в коде. Но где именно - не могу сообразить. Надеюсь на Силу Пикабу! Заранее спасибо. Код всего скетча - ниже:

#include <EEPROM.h>
#include <AnalogKey.h>
#include <GyverButton.h>
//#include <GyverWDT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <microDS18B20.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define MOTOR 27 //Arduino pins attached to joystick
#define joystick_switch_pin 26
#define joystick_x_pin 33
#define joystick_y_pin 25
//Joystick values
#define up 0
#define right 1
#define down 2
#define left 3
#define enter 4
#define none 5
GButton butt1(joystick_switch_pin);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Устанавливаем дисплей // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(19); // Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
//MicroDS18B20<19> sensor1;
//MicroDS18B20<23> sensor2;
float tempMotor;
float tempHotter;
bool work;
bool is_menu;
int current_joy_read;
int time_work,time_rest,hot_max,motor_max;
unsigned long int start_timer, rest_timer;
String main_menu[] = {"1.TIME_WORK","2.TIME_REST","3.T_HOT_MAX","4.T_MOTOR_MAX"};
int mas_values[] = {time_work,time_rest,hot_max,motor_max}; int current_menu_item;
String *current_menu;
// Used to check joystick state
int last_joy_read;

int read_joystick()
{
int output = none;
// read all joystick values
int X_Axis = analogRead(joystick_x_pin); // read the x axis value
int Y_Axis = analogRead(joystick_y_pin); // read the y axis value Serial.println(X_Axis); Serial.println(Y_Axis);
if (X_Axis >= 900)
{
output = right;
}
else if (X_Axis <= 100)
{ output = left; }
else if (Y_Axis >= 900)
{ output = up; }
else if (Y_Axis <= 100)
{ output = down; }
return output;
}

void print_line(int line, String text)
{
lcd.setCursor(0, line);
lcd.print(" ");
lcd.setCursor(0, line);
lcd.print(text);
lcd.print(" ");
lcd.print(mas_values[current_menu_item]);
lcd.print(" ");
}

void move_up()
{
if (current_menu_item <= 0)
{
current_menu_item = sizeof(current_menu)+1;
}
else
{
current_menu_item--;
}
}

void move_down()
{
if (current_menu_item > sizeof(current_menu))
{
current_menu_item = 0;
}
else
{
current_menu_item++;
}
}

void move_right()
{
mas_values[current_menu_item]--;
if(mas_values[current_menu_item]<0)
{
mas_values[current_menu_item] = 0;
}
}

void move_left()
{
mas_values[current_menu_item]++;
}

void setup()
{
sensors.begin();
readData();
Serial.begin(9600);
is_menu = false;
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print(F("TIME IS ALL!"));
delay(500);
lcd.clear();
lcd.setCursor(2, 0);
lcd.print(F("MOTOR KRUTI"));
delay(500);
lcd.setCursor(2, 1);
lcd.print(F("NASOS SOSI!!!"));
delay(500);
work=true;
lcd.clear();
pinMode(MOTOR, OUTPUT);
digitalWrite(MOTOR, LOW);
pinMode(3,OUTPUT);
digitalWrite(3,HIGH);
current_menu_item = 0;
last_joy_read = none;
current_menu = main_menu;
}

void loop()
{
butt1.tick();
if(butt1.isPress())
{
is_menu = !is_menu;
if(is_menu)
{
print_line(1, current_menu[current_menu_item]);
}
else
{
writeData();
}
}
if(is_menu)
{
lcd.setCursor(0, 0);
lcd.print("MENU: ");
/////
current_joy_read = read_joystick();
if (current_joy_read != last_joy_read)
{
last_joy_read = current_joy_read;
switch (current_joy_read)
{
case up: move_up(); break;
case down: move_down(); break;
case right: move_right(); break;
case left: move_left(); break;
}
print_line(1, current_menu[current_menu_item]);
delay(100);
}
}
else
{
sensors.requestTemperatures();
// Send the command to get temperatures
tempMotor = sensors.getTempCByIndex(0);
tempHotter = sensors.getTempCByIndex(1);
if(work)
{
if(tempMotor>motor_max || tempHotter>hot_max)
{
if (millis() - start_timer <= time_work*60000)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(tempMotor);
lcd.setCursor(0, 1);
lcd.print(tempHotter);
lcd.setCursor(6, 1);
lcd.print(F("NEED REPAIR"));
digitalWrite(MOTOR, LOW);
work=false;
}
}
if((millis() - start_timer <= time_work*60000) && (tempMotor<motor_max && tempHotter<hot_max))
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(tempMotor);
lcd.setCursor(0, 1);
lcd.print(tempHotter);
lcd.setCursor(5, 0);
lcd.print(F("t*c motor "));
lcd.setCursor(5, 1);
lcd.print(F("t*c hotter"));
digitalWrite(MOTOR, HIGH);
rest_timer = millis();
if(!butt1.hasClicks())
delay(1000);
}
if((millis() - start_timer > time_work*60000) && (tempMotor<motor_max && tempHotter<hot_max))
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(tempMotor);
lcd.setCursor(0, 1);
lcd.print(tempHotter);
lcd.setCursor(9, 0);
lcd.print(F("F REST"));
digitalWrite(MOTOR, LOW);
if(!butt1.hasClicks()) delay(1000);
}
if((millis() - rest_timer >= time_rest*60000)&& (tempMotor<motor_max && tempHotter<hot_max))
{
lcd.clear();
digitalWrite(MOTOR, HIGH);
lcd.setCursor(0, 0);
lcd.print(tempMotor); lcd.setCursor(0, 1);
lcd.print(tempHotter);
lcd.setCursor(5, 0);
lcd.print(F("t*c motor "));
lcd.setCursor(5, 1);
lcd.print(F("t*c hotter"));
start_timer=millis();
if(!butt1.hasClicks()) delay(1000);
}
}
}
// Watchdog.reset();
}

void writeData()
{
for(int i=0;i<4;i++)
{
EEPROM.write(i,mas_values[i]);
}
}

void readData()
{
time_work = EEPROM.read(0);
time_rest = EEPROM.read(1);
hot_max = EEPROM.read(2);
motor_max = EEPROM.read(3);
mas_values[0] = time_work;
mas_values[1] = time_rest;
mas_values[2] = hot_max;
mas_values[3] = motor_max;
}

Спроси Пикабу

7.2K поста6.1K подписчиков

Правила сообщества

Подпишись на наше сообщество, если тебе понравилась публикация. Или добавь нас в игнор, если нет.

Правила:
1. Задавая вопрос в посте, используйте открытые вопросы (те, которые не предполагают коротких ответов «Да/Нет»)
2. Создавая пост-ответ, убедись, что делаешь это ответом, иначе нам придется вынести пост за несоответствие тематике соо.
3. Подборкам, созданным на основе вопросов пользователей, тут самое место.
4. Посты с призывами поделиться историей, цифрами (пример), картинками, рекомендациями, тоже относятся к тематике соо (если будет перегиб, то пересмотрим данный пункт).
4. В сообществе не место для политики и вопросам по сайту/модерации. Для этого есть профильные сообщества.
5. Не допускаются оскорбления авторов только за наличие вопроса.
6. В сообществе допускается размещение подборок из ответов на вопросы в других постах или постах самого сообщества, только убедитесь, что до вас этого никто не сделал.
7. Предложения по доработке правил и направлению развития сообщества принимаются 24/7.

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества