• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ds18b20+st7735+blynk+BME280

Roma_40

New member
Господа, прошу снова помочь.
К своему предыдущему железу добавил BME280 + кнопку и пищалку
BME280 - поставил для отображения информации окружающей среды. Он работает, все отображает.
Кнопку с пищалкой добавил, что бы зафиксировать температуру от DS18B20 и при её увеличении должна сработать пищалка.
Но вот не срабатывает она, не знаю что делать:( Сама пищалка рабочая.
#include <Wire.h> // include Wire library (required for I2C devices)
#include <Adafruit_GFX.h> // include Adafruit graphics library
#include <Adafruit_ST7735.h> // include Adafruit ST7735 TFT library
#include <Adafruit_BME280.h> // include Adafruit BME280 sensor library

// ST7735 TFT module connections
#define TFT_RST -1 // TFT RST pin is connected to NodeMCU reset pin
#define TFT_CS D8 // TFT CS pin is connected to NodeMCU pin D8 (GPIO15)
#define TFT_DC D4 // TFT DC pin is connected to NodeMCU pin D4 (GPIO2)
// initialize ST7735 TFT library with hardware SPI module
// SCK (CLK) ---> NodeMCU pin D5 (GPIO14)
// MOSI(DIN) ---> NodeMCU pin D7 (GPIO13)
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

// define device I2C address: 0x76 or 0x77 (0x77 is library default address)
#define BME280_I2C_ADDRESS 0x76
// initialize Adafruit BME280 library
Adafruit_BME280 bme280;
float temp;
float humi;
float pres;
char temp_s[6];
char humi_s[6];
char pres_s[6];

/* ESP & Blynk */
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#define BLYNK_PRINT Serial

/* Blynk credentials */
char auth[] = "***********************";

/* WiFi credentials */
char ssid[] = "********************";
char pass[] = "*******************";

/* TIMER */
SimpleTimer timer;

/* DS18B20 Temperature Sensor */
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 5 // DS18B20 подключаем на D1 на плате
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
float temp_0;
float temp_1;
char temp0_s[7];
char temp1_s[7];

unsigned long myTimer1, myTimer2;

float setTmp; // переменная для заданного значения температуры
int buttFixPin = 16; // кнопку подключаем на D6 на плате
int buttFixPinCurentState = LOW; // текущее состояние кнопки
const int Buzz = 12; // пищалку подключаем на D0 на плате

void Buzzer(int number)
{
for (int i = 0; i < number; i++)
{
digitalWrite (Buzz, HIGH);
delay (500);
digitalWrite(Buzz, LOW);
delay(100);
}
}

void setup()
{
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
timer.setInterval(3000L, getSendData);
DS18B20.begin();
DS18B20.setResolution(12);

pinMode(buttFixPin, INPUT_PULLUP);
pinMode(Buzz, OUTPUT);

tft.initR(INITR_BLACKTAB); // initialize a ST7735S chip, black tab
tft.fillScreen(ST7735_BLACK); // fill screen with black color
tft.drawFastHLine(0, 10, tft.width(), ST7735_WHITE); // draw horizontal white line at position

tft.setTextColor(ST7735_WHITE, ST7735_BLACK); // set text color to white and black background
tft.setTextSize(1); // размер шрифта = 1
tft.setCursor(44, 0); // move cursor to position pixel
tft.print("KOLONNA");

tft.fillTriangle(4, 45, 10, 26, 16, 45, ST77XX_RED); // print Triangle up symbol
tft.fillTriangle(4, 61, 10, 80, 16, 61, ST77XX_BLUE); // print Triangle down symbol

tft.drawCircle(115, 27, 2, ST7735_CYAN); // print degree symbol ( ° )
tft.drawCircle(115, 62, 2, ST7735_CYAN); // print degree symbol ( ° )

// initialize the BME280 sensor
Wire.begin(D3, D2); // set I2C pins [SDA = D3, SCL = D2], default clock is 100kHz
if ( bme280.begin(BME280_I2C_ADDRESS) == 0 )
{ // connection error or device address wrong!
tft.setTextColor(ST7735_RED, ST7735_BLACK); // set text color to red and black background
tft.setTextSize(2); // text size = 2
tft.setCursor(5, 113); // move cursor to position pixel
tft.print("Connection");
tft.setCursor(35, 133); // move cursor to position pixel
tft.print("Error");
while (1) // stay here
delay(1000);
}
tft.setTextSize(2); // text size = 2
tft.drawFastHLine(0, 96, tft.width(), ST7735_CYAN); // draw horizontal white line at position
tft.setTextColor(ST7735_RED, ST7735_BLACK); // set text color to red and black background
tft.setCursor(5, 104); // move cursor to position pixel
tft.print("T=");
tft.setTextColor(ST7735_CYAN, ST7735_BLACK); // set text color to cyan and black background
tft.setCursor(5, 123); // move cursor to position pixel
tft.print("H=");
tft.setTextColor(ST7735_MAGENTA, ST7735_BLACK); // set text color to cyan and black background
tft.setCursor(100, 123); // move cursor to position pixel
tft.print("%");
tft.setTextColor(ST7735_GREEN, ST7735_BLACK); // set text color to green and black background
tft.setCursor(5, 144); // move cursor to position pixel
tft.print("P=");
tft.setTextColor(0xFD00, ST7735_BLACK);
tft.setCursor(80, 144);
tft.print("mmHg");
tft.setTextSize(2); // text size = 2
// print °C
tft.drawCircle(100, 106, 2, ST7735_YELLOW); // print degree symbol ( ° )
tft.setCursor(105, 104); // move cursor to position pixel
tft.setTextColor(ST7735_YELLOW, ST7735_BLACK); // set text color to yellow and black background
tft.print("C");
}

void loop()
{
timer.run(); // запуск таймера
Blynk.run(); //запуск Blynk

if (millis() - myTimer1 >= 3000 )
{
myTimer1 = millis(); // сброс таймера
DS18B20.requestTemperatures();
//Serial.println(DS18B20.getResolution());

temp_0 = DS18B20.getTempCByIndex(0); // Sensor 0 показания для датчика 1 в цельсиях
temp_1 = DS18B20.getTempCByIndex(1); // Sensor 1 показания для датчика 2 в цельсиях
dtostrf(temp_0, 0, 1, temp0_s);
//Serial.println(temp0_s);
dtostrf(temp_1, 0, 1, temp1_s);
//Serial.println(temp1_s);

tft.setTextSize(3);
tft.setCursor(35, 25);
tft.setTextColor(ST7735_YELLOW, ST7735_BLACK); // set text color to yellow and black background
tft.printf(temp0_s);

tft.setCursor(35, 60);
tft.setTextColor(ST7735_YELLOW, ST7735_BLACK); // set text color to yellow and black background
tft.printf(temp1_s);
}

if (millis() - myTimer2 >= 6000 )
{
myTimer2 = millis(); // сброс
// read temperature, humidity and pressure from the BME280 sensor
temp = bme280.readTemperature(); // get temperature in °C
humi = bme280.readHumidity(); // get humidity in %
pres = bme280.readPressure() / 133.32; // get pressure in mmHg

dtostrf(temp, 0, 1, temp_s);
//Serial.println(temp_s);
dtostrf(humi, 0, 1, humi_s);
//Serial.println(humi_s);
dtostrf(pres, 0, 0, pres_s);
//Serial.println(pres_s);

// print temperature (in °C)
tft.setTextSize(2);
tft.setCursor(35, 104);
tft.setTextColor(ST7735_YELLOW, ST7735_BLACK); // set text color to yellow and black background
tft.printf(temp_s);

// 2: print humidity
tft.setCursor(35, 123);
tft.setTextColor(ST7735_MAGENTA, ST7735_BLACK); // set text color to magenta and black background
tft.printf(humi_s);

// 3: print pressure (in mmHg)
tft.setCursor(35, 144);
tft.setTextColor(0xFD00, ST7735_BLACK); // set text color to orange and black background
tft.printf(pres_s);
}

// считываем состояние кнопки
buttFixPinCurentState = digitalRead(buttFixPin);

//Запись температуры фиксации в переменную setTmp
if (buttFixPinCurentState == LOW && setTmp == 0)
{
Buzzer(1);
setTmp = DS18B20.getTempCByIndex(1); //Если нажата кнопка, пишем в переменную текущее значение температуры
}
if (DS18B20.getTempCByIndex(1) > setTmp + 0.3) // Температура поднялась выше зафиксированной
{
Buzzer(2); // Сигнал 2 раза
}

}
/***************************************************
Send Sensor data to Blynk
**************************************************/
void getSendData()
{
Blynk.virtualWrite(0, temp0_s); //вывод данных на виртуальный пин V0
Blynk.virtualWrite(1, temp1_s); //вывод данных на виртуальный пин V1
Blynk.virtualWrite(2, temp_s); //вывод данных на виртуальный пин V2
Blynk.virtualWrite(3, humi_s); //вывод данных на виртуальный пин V3
Blynk.virtualWrite(4, pres_s); //вывод данных на виртуальный пин V4
}

так же буду рад замечаниям по скетчу))
 

svs2007m

Active member
Дружище используй таймеры библиотеки SimpleTimer. (пример)
Для пищалки чем функция tone(....) плоха.
На канале где пример есть 100 различных проектов где все русским по белому ... Отдельные составные части Вашего проекта там тоже есть. Возможно для начала это пожет :)
 

Roma_40

New member
Что то "лыжи" совсем не едут :oops:
Ставил я tone() и в void Buzzer(int number), и в loop вместо Buzzer, и с delay, и с noTone - всегда сразу пищит и без останова

Про SimpleTimer почитал, что-то не однозначно как то о нем отзываются. Хотя он в моем коде тоже присутствует)
 

CodeNameHawk

Moderator
Команда форума
Что то "лыжи" совсем не едут :oops:
Ставил я tone() и в void Buzzer(int number), и в loop вместо Buzzer, и с delay, и с noTone - всегда сразу пищит и без останова

Про SimpleTimer почитал, что-то не однозначно как то о нем отзываются. Хотя он в моем коде тоже присутствует)
Где попытка понять как работает пищалка?
Подключил пищалку, написал пару строк кода да и проверил или самому додуматься до такого сложно?
 

svs2007m

Active member
Что то "лыжи" совсем не едут :oops:
Ставил я tone() и в void Buzzer(int number), и в loop вместо Buzzer, и с delay, и с noTone - всегда сразу пищит и без останова

Про SimpleTimer почитал, что-то не однозначно как то о нем отзываются. Хотя он в моем коде тоже присутствует)
Дружище если читать мат часть Вам не с руки то позвольте вот так . Код у Вас написан через жоп... .Копипастат и копипастам погоняет. А вы просите перелопать чтобы все было заеб...
Любая работа стоит денег :)
 

Roma_40

New member
Где попытка понять как работает пищалка?
Подключил пищалку, написал пару строк кода да и проверил или самому додуматься до такого сложно?
Ну конечно же я пробовал и по разному.
/* DS18B20 Temperature Sensor */
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 5 // DS18B20 подключаем на D1 на плате
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
float temp_0;
float temp_1;
char temp0_s[7];
char temp1_s[7];


float setTmp; // переменная для заданного значения температуры
int buttFixPin = 16; // кнопку подключаем на D0 на плате
int buttFixPinCurentState = LOW; // текущее состояние кнопки
const int Buzz = 12; // пищалку подключаем на D6 на плате


void Buzzer(int number)
{
for (int i = 0; i < number; i++)
{
digitalWrite (Buzz, HIGH);
delay (5000);
digitalWrite(Buzz, LOW);
delay(500);
}
}

void setup()
{
// put your setup code here, to run once:
pinMode(buttFixPin, INPUT_PULLUP);
pinMode(Buzz, OUTPUT);
DS18B20.begin();
DS18B20.setResolution(12);
}

void loop()
{
// put your main code here, to run repeatedly:
buttFixPinCurentState = digitalRead(buttFixPin);
if (buttFixPinCurentState == LOW && setTmp == 0) //Запись температуры в переменную setTmp
{
Buzzer(1);
setTmp = DS18B20.getTempCByIndex(1); //Если нажата кнопка, пишем в переменную текущее значение температуры

}
if (DS18B20.getTempCByIndex(1) > setTmp + 0.3) // Температура поднялась выше зафиксированной
{
Buzzer(2); // Сигнал 2 раза
}
}

/* DS18B20 Temperature Sensor */
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 5 // DS18B20 подключаем на D1 на плате
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
float temp_0;
float temp_1;
char temp0_s[7];
char temp1_s[7];


float setTmp; // переменная для заданного значения температуры
int buttFixPin = 16; // кнопку подключаем на D0 на плате
int buttFixPinCurentState = LOW; // текущее состояние кнопки
const int Buzz = 12; // пищалку подключаем на D6 на плате



void setup()
{
// put your setup code here, to run once:
pinMode(buttFixPin, INPUT_PULLUP);
pinMode(Buzz, OUTPUT);
DS18B20.begin();
DS18B20.setResolution(12);
}

void loop()
{
// put your main code here, to run repeatedly:
buttFixPinCurentState = digitalRead(buttFixPin);
if (buttFixPinCurentState == LOW && setTmp == 0) //Запись температуры в переменную setTmp
{
setTmp = DS18B20.getTempCByIndex(1); //Если нажата кнопка, пишем в переменную текущее значение температуры
digitalWrite (Buzz, HIGH);
delay (5000);
digitalWrite(Buzz, LOW);
delay(100);
}
if (DS18B20.getTempCByIndex(1) > setTmp + 0.3) // Температура поднялась выше зафиксированной
{
digitalWrite (Buzz, HIGH);
delay (5000);
digitalWrite(Buzz, LOW);
delay(100);
}
}
в этих ^ двух ^ вариантах HIGH -молчание, LOW-пищит

/* DS18B20 Temperature Sensor */
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 5 // DS18B20 подключаем на D1 на плате
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
float temp_0;
float temp_1;
char temp0_s[7];
char temp1_s[7];


float setTmp; // переменная для заданного значения температуры
int buttFixPin = 16; // кнопку подключаем на D0 на плате
int buttFixPinCurentState = LOW; // текущее состояние кнопки
const int Buzz = 12; // пищалку подключаем на D6 на плате



void setup()
{
// put your setup code here, to run once:
pinMode(buttFixPin, INPUT_PULLUP);
pinMode(Buzz, OUTPUT);
DS18B20.begin();
DS18B20.setResolution(12);
}

void loop()
{
// put your main code here, to run repeatedly:
buttFixPinCurentState = digitalRead(buttFixPin);
if (buttFixPinCurentState == LOW && setTmp == 0) //Запись температуры в переменную setTmp
{
setTmp = DS18B20.getTempCByIndex(1); //Если нажата кнопка, пишем в переменную текущее значение температуры
tone(Buzz, 100, 500);
//noTone(Buzz);
}
if (DS18B20.getTempCByIndex(1) > setTmp + 0.3) // Температура поднялась выше зафиксированной
{
tone(Buzz, 100, 500);
delay(3000);
//noTone(Buzz);
 

Roma_40

New member
Чего я хочу , я определенно знаю и написал в первом сообщении.👆
То, что не знаю как это реализовать, да, не знаю. Поэтому и обратился за помощью. По мне форумы для этого и нужны. А знал бы - сам сделал. Не хотите помочь, ваше право. И бессмысленными ответами можно не отвечать.
 

pvvx

Активный участник сообщества
Чего я хочу , я определенно знаю и написал в первом сообщении.👆
То, что не знаю как это реализовать, да, не знаю. Поэтому и обратился за помощью. По мне форумы для этого и нужны. А знал бы - сам сделал. Не хотите помочь, ваше право. И бессмысленными ответами можно не отвечать.
Как гласит поговорка: правильно поставленный вопрос — это уже половина ответа. Так и есть. Задавая Бессознательному правильные вопросы, Вы легко и быстро решите свою проблему — если вы решаете проблему; или достигнете поставленной цели — если вы достигаете цель. Теперь осталось разобраться, а какие это — правильные вопросы?
Ваш 'вопрос' в форуме пока переводится так: "Срочно сделайте мне скетч по моему запросу!" и вы получили правильные ответы.
Предоставленный вами код не читаем - учитесь правильно оформлять теги. А то кинули как свиньям и ещё требуете разбора...
 
Сверху Снизу