управление обогревателем.
- Войдите на сайт для отправки комментариев
Ср, 31/03/2021 - 17:18
У меня такой вопрос, не получается сделать управление на модуль реле при повышении температуры больше 30 градусов. Кое как запустил tft 0,96' , но ни черта не вывести управление, не проходит проверку...
#include "microDS18B20.h"
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <SPI.h>
//На экране на плате не верно подписано, там не SDA и SCL, он не I2C, он имеет SPI интерфейс
MicroDS18B20 sensor1(3); // датчик на пине 3
MicroDS18B20 sensor2(2); // датчик на пине 2
#define TFT_DC 8 //DC экрана на GPIO 8
#define TFT_RST 9 //RES экрана на GPIO 9
#define TFT_CS 10 //CS экрана на GPIO 10
#define TFT_MOSI 11 //SDA пин экрана подключаем к GPIO 11 (MOSI)
#define TFT_SCLK 13 //SCL пин экрана подключаем к GPIO 13 (CLK)
#define RELAY_PIN 4 //Реле подключено к пину D4
boolean relayStatus1=LOW; //Объявим переменную для хранения состояния реле
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
void setup(void) {
Serial.begin(115200);
pinMode(RELAY_PIN,OUTPUT); //Настроим пин для управления реле
digitalWrite(RELAY_PIN,LOW);
tft.cp437(true);
tft.initR(INITR_MINI160x80);
tft.setRotation(3);
// tft.invertDisplay(true);
//tft.invertDisplay(false);
tft.setCursor(1, 10);
tft.setTextSize(3);
}
void loop() {
sensor1.requestTemp();
sensor2.requestTemp();
delay(100);
tft.setCursor(1, 10);
tft.setTextColor(YELLOW);
tft.print(utf8rus("1) "));
tft.print(sensor1.getTemp());
tft.setCursor(1, 45);
tft.setTextColor(MAGENTA);
tft.print(utf8rus("2) "));
tft.print(sensor2.getTemp());
delay(5000);
tft.fillScreen(ST77XX_WHITE);
}
/* Recode russian fonts from UTF-8 to Windows-1251 */
String utf8rus(String source)
{
int i, k;
String target;
unsigned char n;
char m[2] = { '0', '\0' };
k = source.length(); i = 0;
while (i < k) {
n = source[i]; i++;
if (n >= 0xC0) {
switch (n) {
case 0xD0: {
n = source[i]; i++;
if (n == 0x81) {
n = 0xA8;
break;
}
if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
break;
}
case 0xD1: {
n = source[i]; i++;
if (n == 0x91) {
n = 0xB8;
break;
}
if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
break;
}
}
}
m[0] = n; target = target + String(m);
}
return target;
}
1. Вставка программного кода в тему/комментарий
2. Что означает фраза "ни черта не вывести управление, не проходит проверку"?
я беру что печатает информацию от первого датчика и пытаюсь вставить в условие при превышении температуры. Я не силён в программировании но пытаюсь сделать по формуле как в бейсике if ... then... else...
Не знаю как вынуть значение... Не знаю как объяснить. Не могу придать правильное значение созданной переменной
я беру что печатает информацию от первого датчика и пытаюсь вставить в условие при превышении температуры. Я не силён в программировании но пытаюсь сделать по формуле как в бейсике if ... then... else...
Не знаю как вынуть значение... Не знаю как объяснить. Не могу придать правильное значение созданной переменной
Читайте.
Не знаю как вынуть значение... Не знаю как объяснить. Не могу придать правильное значение созданной переменной
А как вставить код в тему (о чём было по моей ссылке) Вы знаете? Или тоже не знаете? Пока Вы его нормально не вставите, на него даже смотреть никто скорее всего не будет.
Как бы тут Гайвером не запахло...
В приличной библиотеке и примеры нормальные: https://github.com/milesburton/Arduino-Temperature-Control-Library/blob/...
// Приличная у меня не вмещается, всё по минимуму
if sensor1.getTemp() > 30 then pinMode(RELAY_PIN,INPUT) // Не получается это написать, не проходит проверку
// Приличная у меня не вмещается, всё по минимуму
if sensor1.getTemp() > 30 then pinMode(RELAY_PIN,INPUT) // Не получается это написать, не проходит проверку
Я Вам дал ссылку на условные операторы си. Чукча не читатель?
// Приличная у меня не вмещается, всё по минимуму
if sensor1.getTemp() > 30 then pinMode(RELAY_PIN,INPUT) // Не получается это написать, не проходит проверку
Так вот что такое проверка.
Вы на каком языке пишете? Вас не смущает, что немцу (если он не полиглот) непонятен текст на арабском, а арабу на немецком? Так вот, в Ардуино IDE используется язык С++, а Вы пишете на каком-то другом.
Прочитайте книжку от корки до корки и только потом пытайтесь писать.
Да я всё понимаю, что visual basic не C++, и многое делаю интуитивно. Книжку скачал и буду изучать, но учитывая что мне пошел седьмой десяток, изучение займёт много времени. Мне сдаётся, что тут нужна одна строчка кода и даже без обозначения переменных... то есть, есть данные температуры (они просто высвечиваются на дисплее), есть предельная температура 30° неизменная и есть выход на релейный блок.
Мне сдаётся, что тут нужна одна строчка кода
В этой строке программы нужна одна строчка, а в следующей потребуется другая. Вы за каждой будете обращаться? Изучите язык. Вы пишете совсем не то.
Мне сдаётся, что тут нужна одна строчка кода и даже без обозначения переменных... то есть, есть данные температуры (они просто высвечиваются на дисплее), есть предельная температура 30° неизменная и есть выход на релейный блок.
Если бы Вы по диагонали просмотрели статью , посоветованную в сообщении #3, то давно написали б эту строку.
Так вот что такое проверка.
Вы на каком языке пишете?
По-моему, человек совершенно одинаково пишет, что по-русски, что на Си.
Вроде нормально работает, но скетч получился топорный: 067-074
Вроде нормально работает, но скетч получился топорный: 067-074
Ну почему же - для начала неплохо. Но есть несколько замечаний. Температура это не целое число, а действительное. Поэтому не int а float (строка 49). Далее Вы 2 раза запрашиваете температуру в строках 63 и 67. Запросите 1 раз, а затем пользуйтесь переменной. Вентилятор у Вас будет дёргаться на границе 30 градусов. Поэтому стоит применить гистерезис, т.е. отключать вентилятор при температуре чуть ниже 30, а включать на 30.
Согласен, Спасибо. Исправлю.
Температура это не целое число, а действительное. Поэтому не int а float (строка 49).
Вообще-то, не совсем так.
float - это число не действительное, а, скорее, некоторое подмножество рациональных чисел. Т.е. полного аналога вещественного числа в программировании нет. Соответственно, в зависимости от потребности следует использовать тот тип, который подходит для конкретного случая. Тип int в данном случае подходит, поэтому менять ничего не нужно (а если нужно менять - то не в единственно месте).
С остальными замечаниями согласен.
float - это число не действительное, а, скорее, некоторое подмножество рациональных чисел. Т.е. полного аналога вещественного числа в программировании нет. Соответственно, в зависимости от потребности следует использовать тот тип, который подходит для конкретного случая. Тип int в данном случае подходит, поэтому менять ничего не нужно (а если нужно менять - то не в единственно месте).
Я бы с Вами согласился, но я уверен, что в библиотеке температура прописана как float. ТС выводит 2 температуры и чтобы они одинаково выглядели на экране лучше использовать float.
Вот всё хорошо, но не pinMode, а digitalWrite(). Используйте ON-OFF, 1-0.
Да я подозревал это, тем более в скетче это вначале есть .. Спасибо, попробую. Строка 033.
А почему не LOW и HIGH ? Так и так выдаёт ошибку...
Потому что некоторые устройства переходят в состояние ON по уровню LOW.
Семантика важна тоже.
Выдаёт ошибку на этой строке...
Выдаёт ошибку на этой строке...
Какую ошибку?
А, понял потому что 32 должна быть
Мой недочет. Надо так:
Но 32 строку исправьте. Иначе работать не будет.
а я даже не знаю, зачем я её как вход обозначил, конечно выходом должна быть! Совсем с ума сошёл...
Извините, но я бы Вам посоветовал немного пописать простенькие программы типа светофора, блинка и т.д. Я не издеваюсь - просто с ними Вы быстрее начнёте ориентироваться и пользоваться языком. Программа, которую Вы взяли, достаточно сложна и на 80% (как мне кажется) Вам непонятна.
Ну и, конечно, книги по си++.
Зачем это накопипастили " /или ON"?
Пипе́тка — мерный или дозирующий сосуд, представляющий собой трубку, либо ёмкость с трубкой, имеющую конец с небольшим отверстием, для ограничения скорости вытекания жидкости.
А пипец - это, видимо, самец пипетки.
Строки 58 и 62. Так у Вас реле включается по низкому уровню или как?
Всем Большое спасибо за помощь, всё работает, я на вершине блаженства. Конечно буду разбираться дальше, применять адреса датчиков, сажать на один PIN. С дисплеем тоже не всё хорошо, работает, но хреновенько. Но пока всё нравится.
Тут всё нормально, это штатный ардуиновский модуль.
Пока есть свободные пины - вешать DS-ки гирляндой менее выгодно с точки зрения эксплуатационных затрат.
Я не мазохист, но возможно это придётся делать: дисплей 5 сожрал, выходов на реле 4, датчики помимо ds. фото никак не могу вставить сюда.