визуализация данных
Модератор: Alex
-
- Сообщения: 2575
- Зарегистрирован: Пт ноя 06, 2015 10:22 am
- Откуда: Кишинёв
- Благодарил (а): 303 раза
- Поблагодарили: 282 раза
Re: визуализация данных
Ну да. Точно Делал. Только там вроде самостоятельное устройство.
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
-
- Сообщения: 791
- Зарегистрирован: Пт янв 22, 2016 10:08 am
- Благодарил (а): 6 раз
- Поблагодарили: 63 раза
- ser009
- Сообщения: 595
- Зарегистрирован: Сб окт 13, 2012 9:55 am
- Благодарил (а): 4 раза
- Поблагодарили: 43 раза
Re: визуализация данных
Сергей возвращаясь к коду регулятора для более комфортной работы и удобства нужно добавить функции включения и отключения реле
на подобии вот такой
данный способ будет переключать реле после выполнения условия сравнения
на подобии вот такой
СпойлерПоказать
Код: Выделить всё
void rele1On(){
if(digitalRead(RELE_1_PIN)==LOW){
digitalWrite(RELE_1_PIN, HIGH);
rele1State = 1;
}else{}
}
- Рейтинг: 1.16%
-
- Сообщения: 2575
- Зарегистрирован: Пт ноя 06, 2015 10:22 am
- Откуда: Кишинёв
- Благодарил (а): 303 раза
- Поблагодарили: 282 раза
Re: визуализация данных
Что то я совсем запутался. Для Дуи есть вкладка " Реле". Я дописал второе. Код с комментариями.
В сериале вроде всё в порядке
С регулированием по времени и с веба вопросов нет. А вот по значению много вопросов.
Подключу датчик и еще раз проверю. Хотя проще привязать к аналоговому входу.
Так НЕ работает.
Код: Выделить всё
/*
Modul RELEs
part of Arduino Mega Server project
*/
#ifdef RELE_FEATURE
// pins
#define rele1pin 32 //
#define rele2pin 33 //
#define RELE_ON 1
#define RELE_OFF 0
char rele1object[] = "rele1";
char rele2object[] = "rele2";
char rele1onMess[] = "On"; char rele1offMess[] = "Off";
char rele2onMess[] = "On"; char rele2offMess[] = "Off";
// states
// 0 - off
// 1 - on
// 2 - not defined
// 3 - not defined and not contXstatus
byte rele1state = 0; byte rele1objectState = 2; byte old_rele1state = 3;
byte rele2state = 0; byte rele2objectState = 2; byte old_rele2state = 3;
// init
void relesInit() {
pinMode(rele1pin, OUTPUT);
pinMode(rele2pin, OUTPUT);
moduleReles = MODULE_ENABLE;
started("Reles");
}
void relesWorks() {
// rele1
if (rele1state != old_rele1state){ // если 0 не равен 3
old_rele1state = rele1state; // old_rele1state присваисаем 0
if (rele1state == 1) { // если rele1state == 1 выполняем (rele1state == 0)
digitalWrite(rele1pin, HIGH);
rele1objectState = RELE_ON;
printContMess(rele1object, rele1onMess);
#ifdef MAJORDOMO_FEATURE
sendRequestM(rele1object, RELE_ON);
#endif
} else { // иначе
digitalWrite(rele1pin, LOW); // выключаем реле
rele1objectState = RELE_OFF;
printContMess(rele1object, rele1offMess);
#ifdef MAJORDOMO_FEATURE
sendRequestM(rele1object, RELE_OFF);
#endif
}
}
if (rele2state != old_rele2state){
old_rele2state = rele2state; // тут ещё интересней
digitalWrite(rele2pin, HIGH); // rele2state == 0 но мы включаем реле?
if (rele2state == 1) {rele2objectState = RELE_ON;
printContMess(rele2object, rele2onMess);
#ifdef MAJORDOMO_FEATURE
sendRequestM(rele2object, RELE_ON);
#endif
} else {
digitalWrite(rele2pin, HIGH);
rele2objectState = RELE_OFF;
printContMess(rele2object, rele2offMess);
#ifdef MAJORDOMO_FEATURE
sendRequestM(rele2object, RELE_OFF);
#endif
}
}
}
#endif // RELE_FEATURE
- 2018-10-28 10:20:29 AMS WORK 85912 (87%)
2018-10-28 10:20:30 cont1: Closed
2018-10-28 10:20:30 Host 192.168.2.108 GET /objects/?object=cont1&op=m&m=update&v=0
2018-10-28 10:20:30 cont2: Closed
2018-10-28 10:20:30 Host 192.168.2.108 GET /objects/?object=cont2&op=m&m=update&v=0
2018-10-28 10:20:30 Host 192.168.2.108 GET /objects/?object=pirHAL&op=m&m=update&v=1
2018-10-28 10:20:30 Host 192.168.2.108 GET /objects/?object=pirPRH&op=m&m=update&v=1
2018-10-28 10:20:30 rele1: Off
2018-10-28 10:20:30 Host 192.168.2.108 GET /objects/?object=rele1&op=m&m=update&v=0
2018-10-28 10:20:30 rele2: Off
2018-10-28 10:20:30 Host 192.168.2.108 GET /objects/?object=rele2&op=m&m=update&v=0
Код: Выделить всё
/*
Modul Algoritm
part of Arduino Mega Server project
*/
/* значение по которому ведется регулирование
в примере это значени будет задаваться вручную с web
*/
// mode режим
// 0 - ручной
// 1 - по значению датчика
// 2 - по времени
// 3 - not defined and not contXstatus
byte rele1mode = 0;
/* значения максимальных и минимальых значений для включения
и выключения RELE1
*/
int value_on = 0;
int value_off = 100;
int value_web = 0;
/* время включения по умолчанию /часы, минуты/
* при необходимости можно добавить секунды
*/
int r1hour_on = 19; int r1minute_on = 00;
int r1hour_off = 19; int r1minute_off = 15;
void Regul(){
if (rele1state == 0&&rele1mode == 0&&value_web == 1){
rele1state = 1;
MessText = "Выход D32. Включение с Веб";
MessLoger(String (MessText), String (Info));
// #ifdef SERIAL_PRINT
Serial.println("Out D32. command ON to Web");
// #endif
} else{};
if (rele1state == 1&&rele1mode == 0&&value_web == 0){
rele1state = 0;
MessText = "Выход D32. Отключение с Веб";
MessLoger(String (MessText), String (Info));
// #ifdef SERIAL_PRINT
Serial.println("Out D32. command ON to Web");
// #endif
} else{};
if (rele1state == 0&&rele1mode == 2&&r1hour_on == int (hour())&&r1minute_on == int (minute())){
rele1state = 1;
MessText = "Выход D32. Включение по времени";
MessLoger(String (MessText), String (Info));
// #ifdef SERIAL_PRINT
Serial.println("Out D32. command ON to time");
// #endif
} else{};
if (rele1state == 1&&rele1mode == 2&&r1hour_off == int (hour())&&r1minute_off == int (minute())){
rele1state = 0;
MessText = "Выход D32. Отключение по времени";
MessLoger(String (MessText), String (Info));
// #ifdef SERIAL_PRINT
Serial.println("Out D32. command OFF to time");
// #endif
} else {};
//if (!rele1state && rele1mode == 1 && dht11_h >= value_on){ // eGorka
if (!rele1state && rele1mode == 1 && dht.readHumidity() >= value_on){ // eGorka
rele1state = 1; // eGerka
MessText = "Выход D32. Включение по датчику влажности";
MessLoger(String (MessText), String (Info));
// #ifdef SERIAL_PRINT
Serial.println("Out D32. command ON to HUM ");
// #endif
} //if
//if (rele1state && rele1mode == 1 && dht11_h < value_off){ // eGerka
if (rele1state && rele1mode == 1 && dht.readHumidity() < value_off){ // eGerka
rele1state = 0; // eGerka
MessText = "Выход D32. Отключение по датчику влажности";
MessLoger(String (MessText), String (Info));
// #ifdef SERIAL_PRINT
Serial.println("Out D32. command OFF to HUM ");
// #endif
} // if
} // void regul
Подключу датчик и еще раз проверю. Хотя проще привязать к аналоговому входу.
Так НЕ работает.
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
-
- Сообщения: 2575
- Зарегистрирован: Пт ноя 06, 2015 10:22 am
- Откуда: Кишинёв
- Благодарил (а): 303 раза
- Поблагодарили: 282 раза
Re: визуализация данных
Для ESP32 код для 4-х реле по датчику работает очень шустро.
На странице тоже все отображается корректно.
Код: Выделить всё
#define relePin 04
#define rele1Pin 26
#define rele2Pin 25
#define rele3Pin 32
void testInit(){
pinMode(relePin, OUTPUT);
digitalWrite(relePin, LOW);
pinMode(rele1Pin, OUTPUT);
digitalWrite(relePin, LOW);
pinMode(rele2Pin, OUTPUT);
digitalWrite(relePin, LOW);
pinMode(rele3Pin, OUTPUT);
digitalWrite(relePin, LOW);
}
//==============
void testRele(){ // рабочая функция
if(!releSt && current_temp[3] > 40.0){
// if(!releSt && analogRead(35) > 2000.0){
digitalWrite(relePin, HIGH);
timeStamp();
Serial.println(" Rele \"ON\"");
releSt = 1;
MessText = "Реле 1 включено";
MessLoger(String (MessText), String(Info));
}
if(releSt && current_temp[3] < 35.0){
// if(releSt && analogRead(35) < 1500.0){
digitalWrite(relePin, LOW);
timeStamp();
Serial.println(" Rele \"OFF\"");
releSt = 0;
MessText = "Реле 1 выключено";
MessLoger(String (MessText), String(Info));
}
}
//========================================
void testRele1(){ // рабочая функция
if(!rele1St && current_temp[3] > 30.0){
// if(!releSt && analogRead(35) > 2000.0){
digitalWrite(rele1Pin, HIGH);
timeStamp();
Serial.println(" Rele_1 \"ON\"");
rele1St = 1;
MessText = "Реле 2 включено";
MessLoger(String (MessText), String(Info));
}
if(rele1St && current_temp[3] < 28.0){
// if(releSt && analogRead(35) < 1500.0){
digitalWrite(rele1Pin, LOW);
timeStamp();
Serial.println(" Rele_1 \"OFF\"");
rele1St = 0;
MessText = "Реле 2 выключено";
MessLoger(String (MessText), String(Info));
}
}
void testRele2(){ // рабочая функция
if(!rele2St && current_temp[3] > 25.0){
// if(!releSt && analogRead(35) > 2000.0){
digitalWrite(rele2Pin, HIGH);
timeStamp();
Serial.println(" Rele_2 \"ON\"");
rele2St = 1;
MessText = "Реле 3 включено";
MessLoger(String (MessText), String(Info));
}
if(rele2St && current_temp[3] < 22.0){
// if(releSt && analogRead(35) < 1500.0){
digitalWrite(rele2Pin, LOW);
timeStamp();
Serial.println(" Rele_2 \"OFF\"");
rele2St = 0;
MessText = "Реле 3 выключено";
MessLoger(String (MessText), String(Info));
}
}
void testRele3(){ // рабочая функция
if(!rele3St && current_temp[3] > 20.0){
// if(!releSt && analogRead(35) > 2000.0){
digitalWrite(rele3Pin, HIGH);
timeStamp();
Serial.println(" Rele_3 \"ON\"");
rele3St = 1;
MessText = "Реле 4 включено";
MessLoger(String (MessText), String(Info));
}
if(rele3St && current_temp[3] < 17.0){
// if(releSt && analogRead(35) < 1500.0){
digitalWrite(rele3Pin, LOW);
timeStamp();
Serial.println(" Rele_3 \"OFF\"");
rele3St = 0;
MessText = "Реле 4 выключено";
MessLoger(String (MessText), String(Info));
}
}
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
-
- Сообщения: 2575
- Зарегистрирован: Пт ноя 06, 2015 10:22 am
- Откуда: Кишинёв
- Благодарил (а): 303 раза
- Поблагодарили: 282 раза
Re: визуализация данных
В общем eGorka как всегда прав )). Переписал код по датчику так
И всё заработало как надо
значение включения больше выключения. Хотя это справедливо для нагрева. Для охлаждения наоборот.
На странице установки регулятора информер " включено - выключено" обновляется только вместе со страницей. Для даш-панели сделал по другому. И все стало просто СУПЕР! Еще раз спасибо за науку.
Код: Выделить всё
if (!rele1state == 1 && rele1mode == 1 && analogRead(A0) > value_on){
digitalWrite(rele1pin, HIGH);
rele1state = 1;
MessText = "Выход D32. Включение по датчику влажности";
MessLoger(String (MessText), String (Info));
// #ifdef SERIAL_PRINT
Serial.println("Out D32. command ON to HUM ");
// #endif
} //if
//if (rele1state && rele1mode == 1 && dht11_h < value_off){
//if (!rele1state && rele1mode == 1 && dht.readHumidity() < value_off){
if (rele1state == 1 && rele1mode == 1 && analogRead(A0) < value_off){
digitalWrite(rele1pin, LOW);
timeStamp();
rele1state = 0;
MessText = "Выход D32. Выключение по датчику влажности";
MessLoger(String (MessText), String (Info));
// #ifdef SERIAL_PRINT
Serial.println("Out D32. command OFF to HUM ");
// #endif
} // if
- 2018-10-28 15:26:00 81832 (83%)
Out D32. command ON to HUM // подправить надо
2018-10-28 15:26:01 rele1: On
2018-10-28 15:26:01 Host 192.168.2.108 GET /objects/?object=rele1&op=m&m=update&v=1
2018-10-28 15:26:02 Out D32. command OFF to HUM
2018-10-28 15:26:02 rele1: Off
2018-10-28 15:26:02 Host 192.168.2.108 GET /objects/?object=rele1&op=m&m=update&v=0
Код: Выделить всё
int value_on = 100;
int value_off = 0;
На странице установки регулятора информер " включено - выключено" обновляется только вместе со страницей. Для даш-панели сделал по другому. И все стало просто СУПЕР! Еще раз спасибо за науку.
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
- ser009
- Сообщения: 595
- Зарегистрирован: Сб окт 13, 2012 9:55 am
- Благодарил (а): 4 раза
- Поблагодарили: 43 раза
Re: визуализация данных
В общем чем проще тем надёжнее.
Можно для каждого реле писать функцию вкл и выключения, а можно сделать функцию в которою ты передашь номер нужного реле и команду.
Допустим rele(1,ON);
Скажем вкл реле 1. Ну и т.д. это применимо когда у вас 10 реле и писать 20 функций просто не красиво
Можно для каждого реле писать функцию вкл и выключения, а можно сделать функцию в которою ты передашь номер нужного реле и команду.
Допустим rele(1,ON);
Скажем вкл реле 1. Ну и т.д. это применимо когда у вас 10 реле и писать 20 функций просто не красиво
-
- Сообщения: 2575
- Зарегистрирован: Пт ноя 06, 2015 10:22 am
- Откуда: Кишинёв
- Благодарил (а): 303 раза
- Поблагодарили: 282 раза
Re: визуализация данных
Да это всё понятно. И на ESP32 так и работает. Тут смысл в другом - это очень хороший пример как задавать пороги включения со страницы, один выбор чисел многого стоит. Пользоваться в таком виде сложновато и не удобно.
Для множества реле конечно надо писать конечный автомат. И по правилам хорошего тона перечислять используемые пины для платы надо в библиотеке конкретной платы. Очень наглядно это реализовано у Olmoro. Мало кто это заметил. Для 9 пинов : 4 реле, RGB , зуммера и одного входа хедер выглядит так
И .сср
Зато в коде просто вызываем функцию которую необходимо.
И вот после этого не покидает идея конфигурирования входов со страницы. Примерно так же как это сделано в проекте WiFi-Iot/
Для множества реле конечно надо писать конечный автомат. И по правилам хорошего тона перечислять используемые пины для платы надо в библиотеке конкретной платы. Очень наглядно это реализовано у Olmoro. Мало кто это заметил. Для 9 пинов : 4 реле, RGB , зуммера и одного входа хедер выглядит так
Код: Выделить всё
/*
* pcb.h
* U32maxi, U32v17
*/
#ifndef _PCB_H_
#define _PCB_H_
void initPorts(void);
void beep(int n);
void relayOn(int n);
void relayOff(int n);
void ledROn(void);
void ledGOn(void);
void ledBOn(void);
void ledsOn(void);
void ledROff(void);
void ledGOff(void);
void ledBOff(void);
void ledsOff(void);
int checkFire(void);
#endif // _PCB_H_
Код: Выделить всё
/*
* pcb.cpp
*
*/
#include "Arduino.h"
#include "pcb.h"
//#define U32v17
#define U32maxi.xx
#ifdef U32maxi.xx
#include <Wire.h>
#include <PCF8574.h> // Do not forget to comment define to disable interrupt support (36 //#define PCF8574_INTERRUPT_SUPPORT)
// 63 void begin(uint8_t address); // Remove = 0x21 or set 0x38 for "A"
#endif
#ifdef U32v17
const int K1 = 32; // IO32
const int K2 = 25; // IO25
const int K3 = 26; // IO26
const int K4 = 04; // IO04
const int SG = 27; // IO27
const int LED_R = 33; // IO33
const int LED_G = 17; // IO17
const int LED_B = 02; // IO02
const int FIRE = 16; // IO16
#endif
#ifdef U32maxi.xx
const int K1 = 32; // IO32
const int K2 = 25; // IO25
const int K3 = 04; // IO04
const int K4 = 17; // IO17
const int SG = 27; // IO27 - buzzer
const int LED_R = 7; // port 7 PCF8574A
const int LED_G = 6; // port 6 PCF8574A
const int LED_B = 5; // port 5 PCF8574A
const int FIRE = 16; // IO16
PCF8574 expander;
#endif
const int relay[] = {K1, K2, K3, K4};
int rState[] = { 0, 0, 0, 0};
void initPorts(void)
{
for(int i = 0; i < (sizeof(relay))/4; i++)
{
pinMode(relay[i], OUTPUT);
digitalWrite(relay[i], LOW);
rState[i] = 0;
}
pinMode(SG, OUTPUT); // Initialize the buzzer pin as an output
digitalWrite(SG, LOW); // Turn the buzzer off
pinMode(FIRE, INPUT); // Initialize this pin as input
#ifdef U32v17
pinMode(LED_R, OUTPUT); // Initialize the LED pins as an outputs
pinMode(LED_G, OUTPUT); // ...
pinMode(LED_B, OUTPUT); // ...
ledsOff(); // Turn the LEDs off
#endif
#ifdef U32maxi.xx
expander.begin(0x38); // Set PCF8574A i2c address = 0x38
expander.pinMode(LED_R, OUTPUT);
expander.pinMode(LED_G, OUTPUT);
expander.pinMode(LED_B, OUTPUT);
expander.digitalWrite(LED_R, LOW); // LED_RED OFF
expander.digitalWrite(LED_G, LOW); // LED_GREEN OFF
expander.digitalWrite(LED_B, LOW); // LED_BLUE OFF
#endif
}
void beep(int n)
{
// vTaskDelay(2000);
for( int counter = 0; counter < n; counter++ )
{
digitalWrite(SG, HIGH); // Turn the BUZZER on
vTaskDelay(10);
digitalWrite(SG, LOW); // Turn the BUZZER off
vTaskDelay(200);
}
}
void relayOn(int n)
{
digitalWrite(relay[n - 1], HIGH); // Turn the relay n on
rState[n - 1] = 1;
}
void relayOff(int n)
{
digitalWrite(relay[n - 1], LOW); // Turn the relay n off
rState[n - 1] = 0;
}
void ledROn()
{
#ifdef U32v17
{
digitalWrite(LED_R, HIGH); // Turn the RED LED on
}
#else
{
expander.digitalWrite(LED_R, HIGH); // Turn the RED LED on
}
#endif
}
void ledGOn()
{
#ifdef U32v17
{
digitalWrite(LED_G, HIGH); // Turn the GREEN LED on
}
#else
{
expander.digitalWrite(LED_G, HIGH); // Turn the GREEN LED on
}
#endif
}
void ledBOn()
{
#ifdef U32v17
{
digitalWrite(LED_B, HIGH); // Turn the BLUE LED on
}
#else
{
expander.digitalWrite(LED_B, HIGH); // Turn the BLUE LED on
}
#endif
}
void ledsOn()
{
ledROn();
ledGOn();
ledBOn();
}
void ledROff()
{
#ifdef U32v17
{
digitalWrite(LED_R, LOW); // Turn the RED LED off
}
#else
{
expander.digitalWrite(LED_R, LOW); // Turn the RED LED off
}
#endif
}
void ledGOff()
{
#ifdef U32v17
{
digitalWrite(LED_G, LOW); // Turn the GREEN LED off
}
#else
{
expander.digitalWrite(LED_G, LOW); // Turn the GREEN LED off
}
#endif
}
void ledBOff()
{
#ifdef U32v17
{
digitalWrite(LED_B, LOW); // Turn the BLUE LED off
}
#else
{
expander.digitalWrite(LED_B, LOW); // Turn the BLUE LED off
}
#endif
}
void ledsOff()
{
ledROff();
ledGOff();
ledBOff();
}
int checkFire(void)
{
return digitalRead(FIRE); // Read X5.2
}
И вот после этого не покидает идея конфигурирования входов со страницы. Примерно так же как это сделано в проекте WiFi-Iot/
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
-
- Сообщения: 9
- Зарегистрирован: Вт ноя 20, 2018 7:04 am
- Благодарил (а): 2 раза
- Поблагодарили: 0
Re: визуализация данных
Доброго всем времени суток!
Перелистал всю ветку и очень заинтересовало рисование графиков http://majordomo.smartliving.ru/forum/v ... 120#p51264
Прочитал всю ветку, но видать что-то упустил и ни как не могу понять, как это сделать у себя. Может кто поделится?
Хочу запустить на MEGA+DS18B20 2шт.
Перелистал всю ветку и очень заинтересовало рисование графиков http://majordomo.smartliving.ru/forum/v ... 120#p51264
Прочитал всю ветку, но видать что-то упустил и ни как не могу понять, как это сделать у себя. Может кто поделится?
Хочу запустить на MEGA+DS18B20 2шт.
- nick7zmail
- Сообщения: 7573
- Зарегистрирован: Пн окт 28, 2013 8:14 am
- Откуда: Екатеринбург
- Благодарил (а): 121 раз
- Поблагодарили: 2010 раз
Re: визуализация данных
1. Качаете библиотеку графиков (или можно подключить с инета её). Судя по скрину - amCharts https://www.amcharts.com/.Nakhodka писал(а): ↑Вт ноя 20, 2018 7:13 amДоброго всем времени суток!
Перелистал всю ветку и очень заинтересовало рисование графиков http://majordomo.smartliving.ru/forum/v ... 120#p51264
Прочитал всю ветку, но видать что-то упустил и ни как не могу понять, как это сделать у себя. Может кто поделится?
Хочу запустить на MEGA+DS18B20 2шт.
2. Прописываете её в хедере страницы.
3. Формируете в ардуине массив данных, чтобы он был понятен библиотеке. Как я понял - это при помощи логгирования надо собирать данные в файлик...
4. Всовываете библиотеке массив, на выходе получаете график.
Примерно так. Может что то упустил - поправьте))
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<