Есть очень быстрый процесс в процессе которого нужно считывать 1 показатель с аналогового пина. Этот показатель и время нужно сохранять.
Было 2 варианта, выплевывать в serial и чтобы потом питон обрабатывал данные. Либо сохранять в массивы и в конце процесса просто выплевывать массивы. Но массивы упираются в лимит памяти
Программа разбивает время (unsined long) и значение (short) на байты и записывает их в массив byte[6]
Каждый цикл происходит serial.write целого массива
Питон считывает serial и проводит обратную сборку
Примерно после 380 мс ардуино заполняет buff какими-то неподходящими значениями. Анализ значений не привел меня ни к чему
Возможно проблема в полном понимании битовых операций, но урок от гавера по ним я прочел
Было 2 варианта, выплевывать в serial и чтобы потом питон обрабатывал данные. Либо сохранять в массивы и в конце процесса просто выплевывать массивы. Но массивы упираются в лимит памяти
Программа разбивает время (unsined long) и значение (short) на байты и записывает их в массив byte[6]
Каждый цикл происходит serial.write целого массива
Питон считывает serial и проводит обратную сборку
Примерно после 380 мс ардуино заполняет buff какими-то неподходящими значениями. Анализ значений не привел меня ни к чему
Возможно проблема в полном понимании битовых операций, но урок от гавера по ним я прочел
Код Arduino:
#define analogPin A0
#define RelPin 5
short analogValue;
byte buff[6];
unsigned long duration, startTime, Duration_AC, durationLimit, Delay;
String data_array[10];
String command;
void setup() {
Serial.begin(1000000);
pinMode(RelPin, OUTPUT);
digitalWrite(RelPin, LOW);
}
void loop() {
if (Serial.available() > 0) {
command = Serial.readString();
if (command == "s") {
startTime = micros();
} else {
durationLimit = command.substring(command.indexOf("s") + 1).toInt();
Duration_AC = durationLimit * 0.6;
Delay = durationLimit * 0.1;
startTime = micros();
}
}
if (startTime != 0) {
duration = micros() - startTime;
if (duration < durationLimit) {
if ( (duration >= Delay) && (duration <= (Delay + Duration_AC)) ) {
digitalWrite(RelPin, HIGH);
} else {
digitalWrite(RelPin, LOW);
}
writeData();
} else {
digitalWrite(RelPin, LOW);
startTime = 0;
}
}
}
void writeData() {
analogValue = analogRead(analogPin);
buff[0] = ((short)analogValue & 0xFF);
buff[1] = ((short)analogValue >> 8) & 0xFF;
buff[2] = ((unsigned long)duration & 0xFF);
buff[3] = ((unsigned long)duration >> 8) & 0xFF;
buff[4] = ((unsigned long)duration >> 16) & 0xFF;
buff[5] = ((unsigned long)duration >> 24) & 0xFF;
Serial.write(buff, sizeof(buff));
memset(buff, 0, sizeof(buff));
}
Код для Python:
import matplotlib.pyplot as plt
import serial
import time
import numpy as np
arduino = serial.Serial('COM3', 1000000, timeout=1)
time.sleep(2)
arduino.write('s400000'.encode()) #после s устанавливается длительность процесса в мкс
time.sleep(2)
data = np.array([0, 0])
while True:
try:
buff = arduino.read(6)
print(buff)
t = buff[2] | (buff[3] << 8) | (buff[4] << 16) | (buff[5] << 24)
value = buff[0] | (buff[1] << 8)
print(f'{t} -> {value}')
row = [int(t), int(value)]
data = np.vstack([data, row])
except IndexError:
break
plt.plot(data[:, 0], data[:, 1], '.-')
plt.grid(linestyle='-', linewidth=1)
plt.show()