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