Python 3: невозможно вставить значения, полученные от Arduino, в MySQL - PullRequest
0 голосов
/ 12 марта 2020

Надеюсь, у тебя все хорошо.

У меня есть проблема, которую я уже давно пытаюсь решить безуспешно.

У меня написан скрипт Arduino, который считывает значения, зарегистрированные датчиком DHT11, и распечатывает их в последовательный порт. Вот код:


#include <dht11.h>
#define DHT11PIN 2

dht11 DHT11;

void setup()
{
  Serial.begin(115200);

}

void loop()
{
  Serial.println();

  int chk = DHT11.read(DHT11PIN);
  float h = DHT11.humidity; //read humidity
  float t = DHT11.temperature; //read temperature (C)

  Serial.print(h);
  Serial.print("%");
  Serial.print(t);

  delay(2000);

}

Мое намерение состояло в том, чтобы взять вышеуказанные данные, напечатанные на серийном устройстве, и отправить их в код python, который затем вставил бы полученные данные в базу данных MySQL I создал. Кажется, что все работает нормально до части приема, но когда я пытаюсь вставить полученные данные в свою базу данных, я получаю всевозможные ошибки, независимо от того, как я пытаюсь обработать данные.

Во-первых, когда я пытаюсь использовать код ниже:


#!/usr/bin/env python3

import serial
import mysql.connector as connector
import re

#the following have been changed so that I don't expose the real details

__dsn = {
            "host": "localhost",
            "user": "user",
            "passwd": "passwd",
            "db": "sensor"
        }

dbConn = connector.connect(**__dsn)

#open a cursor to the database
cursor = dbConn.cursor()

ser = serial.Serial('/dev/ttyACM0', 115200)
humidity = 0
temperature = 0

while 1:

        #data = ser.read()
        data = ser.read(1)
        n = ser.inWaiting()

        if n:

            data = data + ser.read(n)

        data = data.decode("UTF-8")

        try:

            pieces = data.split('%')  #split the data by the tab

            humidity = pieces[0]
            temperature = pieces[1]



        except IndexError:
            pass

        a = humidity
        b = temperature


        cursor.execute("INSERT INTO environment(humidity,temperature) VALUES (%s,%s)", (a,b))
        dbConn.commit()
        cursor.close()


Я получаю эту ошибку:

enter image description here

Я также пытался изменить значения влажности и температуры на тип поплавка, но если я это сделаю, я получаю эту ошибку:

enter image description here

Я не уверен, что здесь происходит. Я пытался обрабатывать данные разными способами. Вот примеры методов обработки данных, которые я пытался использовать до сих пор:



        humidity.replace(" ", "")
        temperature.replace(" ", "")

        a = float(humidity).notnull()
        b = float(temperature).notnull()

        float(re.sub(r'[^0-9\.]', '', a))
        float(re.sub(r'[^0-9\.]', '', b))

Опять безуспешно ...

Я был бы очень признателен, если бы кто-то мог указать я в правильном направлении.

Спасибо

Роб

1 Ответ

0 голосов
/ 14 марта 2020

Я просто «исправил» проблему. Я заметил, что Arduino иногда посылал строку со странными символами, прикрепленными к фактическому номеру (например, 54,00), или пропускал часть номера (вместо отправки 54,00 он отправлял 4,00). В основном это происходит со значениями влажности, показания температуры почти всегда правильные.

Я не уверен, почему это так (возможно, проблема с оборудованием), но я решил эту проблему, добавив в код следующее:

'' '

    try:
        float(humidity)
    except:
        humidity = 0.0

    try:
        float(temperature)
    except:
        temperature = 0.0

'' '

Таким образом, каждая ошибка будет интерпретироваться как простая передача Arduino значения' 0.0 '. Если кто-нибудь знает более чистый способ исправить это, я все еще мог бы использовать некоторые предложения. Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...