управление адреской через com

Вектор

✩✩✩✩✩✩✩
11 Авг 2020
8
0
Добрый суток, есть лента WS2812 и UNO, написал скетч управления адреской через comport, и на Python + Flask написал страницу управления, чтобы можно было в локальной сети управлять лентой с любого устройства, сайт конечно с сокетом, и всё шикарно, но когда меняю цвет ленты есть шумы из-за большого количества команд, если менять цвет всей ленты это не критично, но вот по секторам уже не ахти, и это всё нужно для фотосъемок, может кто поможет.
Код:
#define COLOR_DEBTH 2
#include <microLED.h>
#include <GParser.h>

#define STRIP_PIN 6
#define NUMLEDS 150

microLED< NUMLEDS, STRIP_PIN, -1, LED_WS2812, ORDER_GRB> strip;


void fillLent(int *data){
  strip.clear();
  strip.fill(mRGB(data[1],data[2],data[3]));
  strip.show();
}

void setup()
{
  Serial.begin(115200);
  Serial.setTimeout(5);
  strip.fill(mRGB(0,255,0));
  strip.setMaxCurrent(2);
  strip.show();
}

void loop()
{
if (Serial.available()) {
    char str[500];
    int amount = Serial.readBytesUntil(';', str, 500);
    str[amount] = NULL;

    GParser data(str, ',');
    int ints[16];
    int am = data.parseInts(ints);
    if (ints[0] == 0){
      fillLent(ints);
    }
}
Код:
from flask import Flask, render_template, redirect, request
from PIL import ImageColor
from flask_socketio import SocketIO

import serial
arduino = serial.Serial(port='COM11', baudrate=115200, timeout=.1)

def write_read(x):
    arduino.write(bytes(x, 'utf-8'))

@socketio.on('color1')
def color1(data):
    color = data.get("data")
    color = ImageColor.getcolor(color, "RGB")
    color = f'0,{color[0]},{color[1]},{color[2]}'
    write_read(color)
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
3,230
940
C++:
    char str[500];
    int amount = Serial.readBytesUntil(';', str, 500);
    str[amount] = NULL;
если строка не будет иметь ";" в первых 500 символах, то последняя команда будет писать за пределы массива.
Насколько я понял, приведён код полного заполнения ленты. А где проблемный код, вызывающий помехи?
 

Вектор

✩✩✩✩✩✩✩
11 Авг 2020
8
0
@poty,Даже при полном заполнении ленты проявляются помехи,
1650286747526.png
Это фрагмент страницы управления, при любом изменении цвета команда сразу улетает на сервер, а с него на ардуинку.
Код:
oninput="send()" onchange="send()"
Пока двигаю есть помехи и для второго режима после выбора цвета лента не приходит в норму и в итоге нужно повторно отправить команду, помехи настолько сильны, что настроить цвет сложно и приходится подбирать
Код:
void rangeLent(int *data){
  strip.clear();
  strip.fill(0, 30, mRGB(data[1],data[2],data[3]));
  strip.fill(30, 60, mRGB(data[4],data[5],data[6]));
  strip.fill(60, 90, mRGB(data[7],data[8],data[9]));
  strip.fill(90, 120, mRGB(data[10],data[11],data[12]));
  strip.fill(120, 149, mRGB(data[13],data[14],data[15]));
  strip.show();
}
Вот код для 2го режима
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,969
632
44
проявляются помехи
Какого рода помехи?

при любом изменении цвета команда сразу улетает на сервер
С какой частотой отправляются данные?
Это я к тому, что если Гугл не врет, то эвенты у socketio асинхронные. И при большой частоте отправки предыдущая команда может не успевать полностью передавать данные по COM-порту, накладывая на них новые. Но это не точно.

@Вектор, Попробуй сделать проверку на занятость отправки данных в эвенте.
Что то типа такого (не мастер в питоне, но смысл понятен)
Python:
port_busy = false

@socketio.on('color1')
def color1(data):
    if not port_busy:
        port_busy = true
        color = data.get("data")
        color = ImageColor.getcolor(color, "RGB")
        color = f'0,{color[0]},{color[1]},{color[2]}'
        write_read(color)
        port_busy = false
Может есть и в классе serial метод проверки на занятость порта, тогда так даже лучше будет.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Когда мышка водиться по выбору цвета, то цвет постоянно меняется, а значит и по событию onchange передаются данные. И очень часто, это как я вижу проблему.