визуализация данных

Модератор: Alex

serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: визуализация данных

Сообщение serghei » Вс окт 21, 2018 8:42 am

Ну да. Точно Делал. Только там вроде самостоятельное устройство.
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
alexsis_76
Сообщения: 791
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Re: визуализация данных

Сообщение alexsis_76 » Вс окт 21, 2018 8:45 am

Ладно щас доделаю без всякой шелухи
Аватара пользователя
ser009
Сообщения: 595
Зарегистрирован: Сб окт 13, 2012 9:55 am
Благодарил (а): 4 раза
Поблагодарили: 43 раза

Re: визуализация данных

Сообщение ser009 » Вс окт 28, 2018 12:18 am

Сергей возвращаясь к коду регулятора для более комфортной работы и удобства нужно добавить функции включения и отключения реле
на подобии вот такой
СпойлерПоказать

Код: Выделить всё

void rele1On(){
   if(digitalRead(RELE_1_PIN)==LOW){ 
     digitalWrite(RELE_1_PIN, HIGH);   
     rele1State = 1;
     }else{}
}
данный способ будет переключать реле после выполнения условия сравнения
За это сообщение автора ser009 поблагодарил:
serghei (Вс окт 28, 2018 4:34 pm)
Рейтинг: 1.16%
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: визуализация данных

Сообщение serghei » Вс окт 28, 2018 10:47 am

Что то я совсем запутался. Для Дуи есть вкладка " Реле". Я дописал второе. Код с комментариями.

Код: Выделить всё

/*
  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
Дальше есть вкладка "savtoreg".

Код: Выделить всё

/*
  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
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: визуализация данных

Сообщение serghei » Вс окт 28, 2018 11:34 am

Для 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
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: визуализация данных

Сообщение serghei » Вс окт 28, 2018 4:34 pm

В общем 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: визуализация данных

Сообщение ser009 » Вс окт 28, 2018 9:32 pm

В общем чем проще тем надёжнее.
Можно для каждого реле писать функцию вкл и выключения, а можно сделать функцию в которою ты передашь номер нужного реле и команду.
Допустим rele(1,ON);
Скажем вкл реле 1. Ну и т.д. это применимо когда у вас 10 реле и писать 20 функций просто не красиво
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: визуализация данных

Сообщение serghei » Вс окт 28, 2018 10:07 pm

Да это всё понятно. И на ESP32 так и работает. Тут смысл в другом - это очень хороший пример как задавать пороги включения со страницы, один выбор чисел многого стоит. Пользоваться в таком виде сложновато и не удобно.
Для множества реле конечно надо писать конечный автомат. И по правилам хорошего тона перечислять используемые пины для платы надо в библиотеке конкретной платы. Очень наглядно это реализовано у 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
Nakhodka
Сообщения: 9
Зарегистрирован: Вт ноя 20, 2018 7:04 am
Благодарил (а): 2 раза
Поблагодарили: 0

Re: визуализация данных

Сообщение Nakhodka » Вт ноя 20, 2018 7:13 am

Доброго всем времени суток!

Перелистал всю ветку и очень заинтересовало рисование графиков http://majordomo.smartliving.ru/forum/v ... 120#p51264
Прочитал всю ветку, но видать что-то упустил и ни как не могу понять, как это сделать у себя. Может кто поделится?
Хочу запустить на MEGA+DS18B20 2шт.
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: визуализация данных

Сообщение nick7zmail » Вт ноя 20, 2018 7:18 am

Nakhodka писал(а):
Вт ноя 20, 2018 7:13 am
Доброго всем времени суток!

Перелистал всю ветку и очень заинтересовало рисование графиков http://majordomo.smartliving.ru/forum/v ... 120#p51264
Прочитал всю ветку, но видать что-то упустил и ни как не могу понять, как это сделать у себя. Может кто поделится?
Хочу запустить на MEGA+DS18B20 2шт.
1. Качаете библиотеку графиков (или можно подключить с инета её). Судя по скрину - amCharts https://www.amcharts.com/.
2. Прописываете её в хедере страницы.
3. Формируете в ардуине массив данных, чтобы он был понятен библиотеке. Как я понял - это при помощи логгирования надо собирать данные в файлик...
4. Всовываете библиотеке массив, на выходе получаете график.

Примерно так. Может что то упустил - поправьте))
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Ответить