Помогите с кодом для мониторинга и алярма температуры

123darius
Offline
Зарегистрирован: 08.02.2017

Всем здрасти.Я пока есчё только учюсь програмировать ардуино.Хочу сделать мониторинг температуры котла с передачей данных по радиоканалу и аварийной сигнализацыи при достижении определённой температуры.Передачу данных сделать удалось,но никак не пойму,как сделать чтобы при определенной температуры сенсора 1,срабатывал зумер

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);


const uint64_t pipe = 0xF0F1F2F3F4LL; //идентификатор передачи данных.
RF24 radio(9, 10); //указываем пины подключения передатчика.
OneWire  oneWire(7);  //указываем пины для подключения датчиков ds18b20.
DallasTemperature ds(&oneWire); //активируем библиотеку ds.

DeviceAddress sensor1 = {0x28, 0x46, 0x80, 0x03, 0x00, 0x00, 0x80, 0x16}; //адрес 5 датчика.
DeviceAddress sensor2 = {0x28, 0xC6, 0xFD, 0x03, 0x00, 0x00, 0x80, 0x7D}; //адрес 6 датчика.
DeviceAddress sensor3 = {0x28, 0xE7, 0xF9, 0x03, 0x00, 0x00, 0x80, 0xE3}; //адрес 7 датчика
DeviceAddress sensor4 = {0x28, 0x7E, 0x00, 0x04, 0x00, 0x00, 0x80, 0x17}; //адрес 8 датчика

void setup(){
  Serial.begin(9600); //открываем пот обмена данными.
  ds.begin();  //запускаем функцию считывания температуры ds.
  radio.begin(); //делаем инициализацию.
  lcd.begin(); 
  delay(2); //ждем реакции модуля передачи данных. 
  radio.setChannel(12); // канал для передачи данных (0-127).
   radio.setPALevel(RF24_PA_HIGH); //указываем мощность передатчика.  
  radio.openWritingPipe(pipe); // открываем трубу на передачу.

   
} 

void loop(){  
  ds.requestTemperatures(); // считываем температуру с датчиков
  float data [4];  //создаем массив из 4-х переменных. 
  data[0] = float(ds.getTempC(sensor1)); //присваиваем первому значению массива данные с sensor1 (за один раз можно отправить до 32 байт).
  data[1] = float(ds.getTempC(sensor2)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт).
  data[2] = float(ds.getTempC(sensor3)); //присваиваем первому значению массива данные с sensor1 (за один раз можно отправить до 32 байт).
  data[3] = float(ds.getTempC(sensor4)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт).
  radio.write(&data, sizeof(data)); // передаем массив и его размер. 
   Serial.println(data[0]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[1]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[2]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[3]); //выводим данные в сериал порт для проверки. 
   Serial.println(); //пробел.
lcd.setCursor(0, 0); 
lcd.print("KP:");
lcd.print(data[0]);
lcd.print("C");
lcd.setCursor(10, 0); 
lcd.print(" KG:");
lcd.print(data[1]);
lcd.print("C");
lcd.setCursor(0, 1); 
lcd.print("NP:");
lcd.print(data[2]);
lcd.print("C");
lcd.setCursor(10, 1); 
lcd.print(" NG:");
lcd.print(data[3]);
lcd.print("C");
lcd.setCursor(0, 2); 
lcd.print("BP:");
lcd.print(data[0]);
lcd.print("C");
lcd.setCursor(10, 2); 
lcd.print(" BG:");
lcd.print(data[0]);
lcd.print("C");
lcd.setCursor(0, 3); 
lcd.print("BO:");
lcd.print(data[0]);
lcd.print("C");
lcd.setCursor(10, 3); 
lcd.print(" LA:");
lcd.print(data[0]);
lcd.print("C");
delay(2000); //ждеm 2sec
 
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

123darius пишет:

 никак не пойму,как сделать чтобы при определенной температуры сенсора 1,срабатывал зумер

НУ, так и делайте. Темпетарура с этого сенсора в data[0] живёт? Ну, так и пишите, например, для температуры болльшей, чем 33

if ([data[0] > 33) pishatZoomerom();

 

123darius
Offline
Зарегистрирован: 08.02.2017

А как запрограмировать ардуино,чтобы он видел зумер?Зумер подключен к цыфровомы пин2.Можете написать ету часть кода для зумера?Спасибо

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А какой зуммер? Активный/пассивный?

123darius
Offline
Зарегистрирован: 08.02.2017

Активный

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ну, тогда пишите

в сетапе

pinMode(2, OUTPUT);

а когда нужно пищать

digitalWrite(2, HIGH);

Когда нужно замолчать

digitalWrite(2, LOW);

Вот и все дела.
123darius
Offline
Зарегистрирован: 08.02.2017

Извините за мою тупость,а можете вы переделать мой код ,а то я пока не очень понимаю?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Простите, не могу. Попробуйте обратиться в раздел "Ищу исполнителя", там ребята сделают.

123darius
Offline
Зарегистрирован: 08.02.2017

Сделал как вы написали,но сеичас постоянно писчит зумер

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, так а Вы его затыкаете? Я э написал, как его затыкать, подайте на пин LOW он и заткнётся.

Ну, если самое простое решение, то просто

if ([data[0] > 33) {
    digitalWrite(2, HIGH);
    dealy(500);
    digitalWrite(2, LOW);
}

полсекунды попищит и заткнётся.

123darius
Offline
Зарегистрирован: 08.02.2017

Незатыкаетса,сразу же после заливки скеча начинает писчать,дазе если температура и меньше 33.Может что не так делаю?

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

const uint64_t pipe = 0xF0F1F2F3F4LL; //идентификатор передачи данных.
RF24 radio(9, 10); //указываем пины подключения передатчика.
OneWire  oneWire(7);  //указываем пины для подключения датчиков ds18b20.
DallasTemperature ds(&oneWire); //активируем библиотеку ds.

DeviceAddress sensor1 = {0x28, 0x46, 0x80, 0x03, 0x00, 0x00, 0x80, 0x16}; //адрес 5 датчика.
DeviceAddress sensor2 = {0x28, 0xC6, 0xFD, 0x03, 0x00, 0x00, 0x80, 0x7D}; //адрес 6 датчика.
DeviceAddress sensor3 = {0x28, 0xE7, 0xF9, 0x03, 0x00, 0x00, 0x80, 0xE3}; //адрес 7 датчика
DeviceAddress sensor4 = {0x28, 0x7E, 0x00, 0x04, 0x00, 0x00, 0x80, 0x17}; //адрес 8 датчика

void setup(){
  
  Serial.begin(9600); //открываем пот обмена данными.
  ds.begin();  //запускаем функцию считывания температуры ds.
  radio.begin(); //делаем инициализацию.
  lcd.begin(); 
  delay(2); //ждем реакции модуля передачи данных. 
  radio.setChannel(12); // канал для передачи данных (0-127).
   radio.setPALevel(RF24_PA_HIGH); //указываем мощность передатчика.  
  radio.openWritingPipe(pipe); // открываем трубу на передачу.
  pinMode(2, OUTPUT);
} 

void loop(){  
  ds.requestTemperatures(); // считываем температуру с датчиков
  float data [4];  //создаем массив из 4-х переменных. 
  data[0] = float(ds.getTempC(sensor1)); //присваиваем первому значению массива данные с sensor1 (за один раз можно отправить до 32 байт).
  data[1] = float(ds.getTempC(sensor2)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт).
  data[2] = float(ds.getTempC(sensor3)); //присваиваем первому значению массива данные с sensor1 (за один раз можно отправить до 32 байт).
  data[3] = float(ds.getTempC(sensor4)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт).
  radio.write(&data, sizeof(data)); // передаем массив и его размер. 
   Serial.println(data[0]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[1]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[2]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[3]); //выводим данные в сериал порт для проверки. 
   Serial.println(); //пробел.

lcd.setCursor(0, 0); 
lcd.print("KP:");
lcd.print(data[0]);
lcd.print("C");
lcd.setCursor(10, 0); 
lcd.print(" KG:");
lcd.print(data[1]);
lcd.print("C");
lcd.setCursor(0, 1); 
lcd.print("NP:");
lcd.print(data[2]);
lcd.print("C");
lcd.setCursor(10, 1); 
lcd.print(" NG:");
lcd.print(data[3]);
lcd.print("C");
lcd.setCursor(0, 2); 
lcd.print("BP:");
lcd.print(data[0]);
lcd.print("C");
lcd.setCursor(10, 2); 
lcd.print(" BG:");
lcd.print(data[0]);
lcd.print("C");
lcd.setCursor(0, 3); 
lcd.print("BO:");
lcd.print(data[0]);
lcd.print("C");
lcd.setCursor(10, 3); 
lcd.print(" LA:");
lcd.print(data[0]);
lcd.print("C");
delay(2000); //ждеm 2sec

   if (data[0] > 33) {
  digitalWrite(2, HIGH);
  delay(500);
  digitalWrite(2, LOW);
  }
 
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так не бывает. Давайте полный скетч и схему подключения

123darius
Offline
Зарегистрирован: 08.02.2017

Только указываю в сетапе pinMode(2, OUTPUT);,сразу начинает писчать,больше ничего ненадо писать

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А схема где?

И ещё, скопипастите сюда содежржимое монитора порта.

AlexeySh
Offline
Зарегистрирован: 16.01.2017

Я бы написал if (data[0] > 33.0) но в принципе это не должно быть критично.

123darius
Offline
Зарегистрирован: 08.02.2017

Так я так и написал,но только указываю в сетапе pinMode(2, OUTPUT);,сразу начинает писчать,больше ничего ненадо писать.Неполадки начинаютса уже с pinMode.Неужели ни ы кого нету идей?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

123darius пишет:
Неужели ни ы кого нету идей?

Знаете, я вообще-то крайне матерюсь, но тут уже на грани. Я ДВАЖДЫ просил Вас показать схему. И просил скопипастить сюда отладочную печать. Вы принципиально не даёте эту информацию или беспринципно? Каких Вам идей надо, если Вы тут секретность развели?

123darius
Offline
Зарегистрирован: 08.02.2017

ЕвгенийП пишет:

123darius пишет:
Неужели ни ы кого нету идей?

Знаете, я вообще-то крайне матерюсь, но тут уже на грани. Я ДВАЖДЫ просил Вас показать схему. И просил скопипастить сюда отладочную печать. Вы принципиально не даёте эту информацию или беспринципно? Каких Вам идей надо, если Вы тут секретность развели?

 

Спасибо за советы,рашыл проблему.Проблема была в китайских зумерах,поменял на пасивный и всё заработало.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

123darius пишет:

Спасибо за советы,рашыл проблему.Проблема была в китайских зумерах,поменял на пасивный и всё заработало.

Ну и отлично! Впредь тоже никогда не давайте никому схему, не публикуйте скетч и не рассказывайте что отладочные печати выдают ... и Вам обязательно помогут.

bwn
Offline
Зарегистрирован: 25.08.2014

ЕвгенийП пишет:

Ну и отлично! Впредь тоже никогда не давайте никому схему, не публикуйте скетч и не рассказывайте что отладочные печати выдают ... и Вам обязательно помогут.

Битва хрустальных шаров, дистанционное лечение скетчей по минимальному описанию.