В реальном времени ArduinoJson в PySerial - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть Arduino Pro Mini (5 В), подключенный к I2C, который имеет 2 делителя напряжения и потенциометр типа 10k Knob, подключенный к аналоговым контактам, чтобы получить напряжения каждого.Я использую ArduinoJson для создания объекта Json, который можно отправить через Serial в программу Python.

Код Arduino достаточно прост.

#include <ArduinoJson.h>

#define pot A0
#define volt1_pin A1
#define volt2_pin A2


float resist1 = 220000;
float resist2 = 1e4;
float sensor_max = (5 * resist1 + 5 * resist2) / resist2;

float volt1, volt2;
int pot_val;

const size_t cap = JSON_OBJECT_SIZE(10);
DynamicJsonDocument output(cap);

void setup() {
    pinMode(volt1_pin, INPUT);
    pinMode(volt2_pin, INPUT);
    pinMode(pot, INPUT);

    Serial.begin(9600);
}

void loop() {

    volt1 = analogRead(volt1_pin) * sensor_max / 1024;
    volt2 = analogRead(volt2_pin) * sensor_max / 1024;

    pot_val = analogRead(pot);
    pot_val = map(pot_val, 0, 1023, 0.0, 100.0);

    output["volt1"] = volt1;
    output["volt2"] = volt2;
    output["pot"] = pot_val;

    serializeJson(output, Serial);
    Serial.println();
}

Код Python такжепросто.

import serial
import time
import logging


logging.basicConfig(level = logging.DEBUG, format = ' %(name)s %(message)s')

class Board():
    def __init__(self):
        self.board = serial.Serial()

        self._cached = {
            'volt1': 0,
            'volt2': 0,
            'pot': 0,
            'port': ''
        }

    def open(self, port, baud = 9600):
        self.board.port = port
        self.board.baud = baud
        self.board.timeout = 0

        self.board.open()
        if self.board.is_open:
            self.board.readline()
            logging.info('Successful Connection to Port: {}'.format(self.board.name))
            return True
        else:
            logging.debug('Unsuccessful Connection to Port: {}'.format(port))
            return False

    def read(self):
        output = self.board.readline()
        output = output.decode('utf-8').strip('\r\n')
        print(output)

    def close(self):
        logging.info('Closing EDM Port: {}'.format(self.board.name))
        self.board.close()


if __name__ == '__main__':
    board = Board()
    if board.open('COM5'):
        while True:
            print(board.read())
            time.sleep(1)
    board.close()

Все работает, однако, когда я перемещаю ручку управления, вывод программы Python не считывает значения в реальном времени.Но, запустив это в Arduino Serial Monitor, я вижу, как я перемещаю Пот в реальном времени.

Я не уверен, почему не вижу значения в реальном времени в Python, а почему я это вижув последовательном мониторе.Я скорректировал скорость передачи, я попытался self.board.read() вместо self.board.readline(), но ни один из них не работает.Я пытался использовать потоки, и даже asyncio в Python.Я даже пытался избавиться от ArduinoJson и просто использовать обычный Serial.print() на стороне Arduino.

Кто-нибудь может посоветовать исправить?Я в конце концов на этом.Спасибо всем.

...