Обработка данных датчика от Arduino Yun с помощью Python

Сейчас я работаю над небольшим проектом с помощью Arduino Yun. Я хочу обработать данные датчика в python и отправить их в очередь сообщений. Мне нужно использовать Python3.

Я не могу найти способ получить данные датчика в своем коде Python. Я уже пытался запустить процесс python в своем скетче и использовать метод println объекта процесса, но это не работает.

Я также пытался использовать класс BridgeClient из Arduino Github, но он тоже не работает.

Обобщая: Я не могу найти способ отправить свои измерения из моего скетча Arduino в мою программу Python3 на стороне Linux Arudino Yun.

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

Раздел ниже содержит мой скетч Arduino, который выполняет измерения.

#include <SparkFunHTU21D.h>
#include <Wire.h>

HTU21D myHumidity;

int trigPin = 11;
int echoPin = 12;

void setup() {
  // поместите сюда код установки для однократного запуска:
  pinMode(A1, INPUT);
  Serial.begin(9600);

  myHumidity.begin();

  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  // поместите сюда ваш основной код для многократного запуска:

  //Выполнить 5 измерений SoilMoisture и получить среднее значение
  float soil = meanSoilMoisture(A0, 5);
  float humd = myHumidity.readHumidity();
  float temp = myHumidity.readTemperature();

  float distance = getDistance();

  String dataString;
  dataString += String(soil) + ", " + String(humd) + ", " + String(temp) + ", " + String(distance);
  Serial.println(dataString);

  delay(4000);
}

long getDistance() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  pinMode(echoPin, INPUT);
  long duration = pulseIn(echoPin, HIGH);

  // Преобразование времени в расстояние
  return (duration/2) / 29.1;     // Делим на 29,1 или умножаем на 0,0343
}

float meanSoilMoisture(int analogPin, int nMeasurements) {
  float sum = 0;
  for(int i = 0; i < nMeasurements; i ++) {
    sum = sum + readVH400(analogPin);
    delay(50);
  }

  return sum / nMeasurements;
}

//Выполнение измерения
float readVH400(int analogPin) {
  int sensor1DN = analogRead(analogPin);
  float sensorVoltage = sensor1DN*(3.0 / 1023.0);
  float VWC;

  // Вычислить VWC
  if(sensorVoltage <= 1.1) {
    VWC = 10*sensorVoltage-1;
  } else if(sensorVoltage > 1.1 && sensorVoltage <= 1.3) {
    VWC = 25*sensorVoltage-17.5;
  } else if(sensorVoltage > 1.3 && sensorVoltage <= 1.82) {
    VWC = 48.08*sensorVoltage-47.5;
  } else if(sensorVoltage > 1.82) {
    VWC = 26.32*sensorVoltage-7.89;
  }
  return(VWC);

}

Мне нужен способ отправить dataString на Linux-сторону Arduino Yun и обработать его с помощью Python3.

Как объяснялось ранее, я уже опробовал несколько решений, например, запустил новый процесс и использовал метод процесса println .

{...}
Process proc;
void setup() {
    {...}
    proc.begin("python3 /mnt/sda1/test.py");
    p.runAsynchronously();
    {...}
}
{...}
    proc.println(dataString);
{...}

Я пытался прочитать этот dataString в Python3 разными способами, например, я использовал метод input, потому что я прочитал на форуме, который я могу обработать такой ввод, как ввод с клавиатуры. Это не сработало, и я не получил ошибки ни в Python, ни в своем скетче.

Я читал разные примеры использования библиотеки Bridge. Итак, я настроил скетч:

{...}
bridge.put("data", dataString);
{...}

Я хотел бы попробовать BridgeClient на стороне Python, но эта библиотека была написана на Python2. Я не хочу переносить библиотеку на Python3, и мне нужно использовать Python3, поэтому я не нашел здесь способа написать код Python.

Я буду очень признателен за любую вашу помощь.

, 👍0

Обсуждение

У вас проблемы с кодом Python или кодом Arduino?, @VE7JRO

Я написал код Arduino, который выполняет измерение, и код Python, который обрабатывает измерение и помещает данные в очередь сообщений. У меня проблемы со связью между этими двумя сторонами. Мне просто нужно каким-то образом отправить данные измерений в код Python — с помощью python3., @raphael_mav

Пожалуйста, покажите нам код, который вы используете. Если проблема со скетчем Arduino, то он "по теме" и мы можем вам помочь. Если проблема связана с кодом Python, он лучше подходит для переполнения стека. Вот ссылка на вопрос о переполнении стека, в котором есть простой скетч и скрипт Python для проверки работы связи между ними: https://stackoverflow.com/questions/24682354/arduino-python3-script/30177116, @VE7JRO

Это Arduino Yun, поэтому я уверен, что этот форум должен быть лучше для вопросов, связанных с эскизами python и arduino. Мой код не актуален, так как я просто читаю данные датчика, у меня нет кода для связи между Yun Arduino и Yun Linux (python3), @raphael_mav

кажется , что вы не понимаете моего вопроса bc. вы проигнорировали тот факт, что я ищу решение для Arduino Yun. У меня есть Arduino Uno, где все работает нормально, но мне нужно другое устройство, на котором я прослушиваю последовательные данные от arduino. Arduino Yun имеет встроенную систему Linux, поэтому мне не понадобилось бы дополнительное устройство. Я изо всех сил пытаюсь получить данные в эту систему Linux., @raphael_mav

Пожалуйста, ознакомьтесь с этим вопросом и ответами на него: https://arduinoprosto.ru/q/18043/share-data-between-the-two-processors-of-the-arduino-yun. Вы пробовали «Библиотеку моста»?, @VE7JRO

Покажите нам код или, по крайней мере, его части, имеющие отношение к сообщению, а также любые связанные с ним ошибки и т. д. Отредактируйте свой вопрос и вставьте его. Без этого более или менее невозможно вам помочь., @Greenonline

Когда вы говорите, что пытались использовать мост, вы пробовали руководство на странице [Начало работы с Yun](https://www.arduino.cc/en/Guide/ArduinoYun)? Он подходит к концу и называется «Общение с OpenWrt-Yun через мост». Как только вы заработаете, может быть, настроить его для вашего конкретного проекта? И обязательно опубликуйте код. Просто сказать, что это не сработало или что это не дало того, чего я хочу, бесполезно, потому что мы не знаем, что вы сделали и чего вы ожидаете., @GMc

Я не думал, что будет так сложно передать данные датчика со стороны arduino на сторону linux YUN, так как я думал, что это устройство было создано именно для этой цели. Не могу найти в сети ни одного рабочего примера (с python3), мигрировать BridgeLibrary с Python2 не хочу и других вариантов мне кажется нет. Спасибо @VE7JRO за вашу «полезную» ссылку — как сказано там: «В любом случае, главное здесь то, что Yun определенно не стоит для меня хлопот»., @raphael_mav

Прямо сейчас есть 2 голоса, чтобы повторно открыть этот вопрос, поэтому я снова открываю его. Комментарии предназначены для уточнения вопроса и не должны использоваться для жалоб на продукты Arduino., @VE7JRO

Вы правы, я сожалею об этом., @raphael_mav

Рафаэль, согласно моему предыдущему комментарию, мы не можем читать ваши мысли, и иногда вам нужно начинать с основ, чтобы исключить возможности. Пробовали ли вы руководство по [начало работы с Yun](https://www.arduino.cc/en/Guide/ArduinoYun)???? Если да, то сработало? Если нет, то что **точно** не сработало? Когда я точно имею в виду, какие ошибки вы получили? В какой момент выпуск прекратился? Что было до этого и так далее. Помните, что мы не можем видеть вашу среду, мы можем полагаться только на то, что вы нам говорите, и проблема *может быть просто* в том, что вы что-то упустили., @GMc

Кроме того, я отмечаю, что вы еще ничего нам не показали... Пожалуйста, обратитесь к [Как задать хороший вопрос](https://stackoverflow.com/help/how-to-ask) и [создайте минимальный, полный, проверяемый пример](https://stackoverflow.com/help/mcve). **Особенно** ссылка на MCVE (т.е. вторая), @GMc


1 ответ


-1

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

Тем не менее, когда я впервые использовал Yun, мне было трудно понять проблему, и я обнаружил, что приведенная ниже информация помогла мне понять, как приступить к работе. Вы говорите, что уже пробовали много решений и, возможно, уже видели это, но, поскольку вы не перечисляете, какие решения вы уже пробовали (кроме одного), я подумал, что, возможно, стоит опубликовать эту ссылку как ответ.

Из этого сообщения в ветку форума Arduino, Последовательное соединение Yun между Arduino и Linux

Прием HTTP-соединений, как показано в руководстве по работе с мостом, но один аспект библиотеки моста. (И, вероятно, наименее полезный и наименее эффективный аспект.) Он предназначен для приема входящих соединения из большей сети, не обязательно локальный Linux процессор.

Библиотека Bridge представляет собой набор различных классов, выполняющих множество операций по всей последовательной связи между двумя процессоров, и все они могут использоваться одновременно. Мост использует парадигма сетевого порта, а не HTTP. Использование портов дает немного больше накладные расходы, но допускает несколько одновременных "соединений" между стороны скетча и Linux.

Я предлагаю вам ознакомиться с руководством по процессу. Он делает то, что вы хотите, и в 95% случаев это единственная часть Моста библиотека, которую я использую. В примере определяются объекты Process, которые являются локальными. к функции, которая запускает простые команды, которые делают немного другую обработку f, вернуть результат и выйти.

Мои проекты обычно определяют глобальный объект Process, который запускает Скрипт Python и сохраняет соединение открытым. После открытия скетч может писать в объект Process в любое время, а скрипт Python считывает эти данные из STDIN. Python может писать в STDOUT в любое время, и скетч может прочитать его из объекта Process. Класс процесса происходит от класса Stream, как и Serial, поэтому ваш скетч может используйте любой из методов чтения/записи, которые вы бы использовали для последовательного порта. На на стороне Linux вы просто читаете/пишете, как и на консоль. По умолчанию Python работает в буферизованном режиме: я обнаружил, что вам нужно добавить параметр -u в командную строку, которая запускает ваш Скрипт Python или добавьте его в хеш-банг в начале вашего сценарий.

Есть те, кто отключает библиотеку Bridge и использует последовательный порт вручную с обеих сторон. Это можно сделать, но мне не приходилось прибегнуть к этому еще. Класс Process делает все, что прямо последовательное соединение, и многое другое: вы можете иметь несколько одновременных Соединения с процессами продолжаются, и вы все еще можете использовать все остальные Возможности библиотеки мостов. Если вы отключите библиотеку Bridge, вы получите только один поток подключения. Это было бы немного эффективнее, но если вы не имеете дело с большими объемами данных, держу пари, что вы не нужно сделать это.

В моем типичном проекте скетч работает как довольно глупый ввод-вывод. процессор, пропуская едва переваренные входные данные через один или несколько Обрабатывайте объекты в сценарии Python. Сторона Linux делает все интенсивная обработка и сетевые коммуникации, а затем отправляет вывод данные создают резервную копию скетча, который выводит их на выводы.

,