Нужна помощь с кодом для моего проекта с использованием Arduino Uno и Processing

Я использую Arduino Uno для своего проекта. Я использую 4 цифровых входа, и они будут запускаться 4 разными реле. Я хотел бы сохранить данные в файле *.csv в формате ниже.

Например, если какой-либо из входов становится высоким, он сохранит идентификатор станции, дату, время, когда он включается (запускается). Но как только вход становится низким, он сохранит время, когда он выключается (останавливается) на той же линии.

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

Пример таблицы в файле .csv:

Date        Oven Station    Time Start     Time Stop
3/7/2017       Oven_P1_1       11:58       16:00
3/7/2017       Oven_P1_2        7:30       11:00
3/7/2017       Oven_P5_1       14:10       20:00
4/7/2017       Oven_P5_2        01:20      7:30
4/7/2017       Oven_P5_1        2:40       8:45
4/7/2017       Oven_P1_2        08:05      12:00
4/7/2017       Oven_P1_1        09:12      13:10

import processing.serial.*;

int Oven_P1_1 = 8;
int Oven_P1_2 = 9;
int Oven_P5_1 = 10;
int Oven_P5_2 = 11;
float Ovenvals [] = {0,0,0,0};

Serial myPort;
String val;
Table table;

String filename;

void setup() {
  String portName = Serial.list()[5];
  myPort = new Serial(this, portName, 9600);
  table = new Table();
  table.addColumn("id");
  table.addColumn("year");
  table.addColumn("month");
  table.addColumn("day");
  table.addColumn("hour");
  table.addColumn("minute");
  table.addColumn("second");
  table.addColumn("Oven_P1_1");
  table.addColumn("Oven_P1_2");
  table.addColumn("Oven_P5_1");
  table.addColumn("Oven_P5_2");
}

void serialEvent(Serial myPort) {
  val = myPort.readStringUntil('\n');
  if (val != null) {
    val = trim(val);
    println(val);
    float Ovenvals[] =float(split(val, ','));
    TableRow newRow = table.addRow();
    newRow.setInt("id", table.lastRowIndex());
    newRow.setInt("year", year());
    newRow.setInt("month", month());
    newRow.setInt("day", day());
    newRow.setInt("hour", hour());
    newRow.setInt("minute", minute());
    newRow.setInt("second", second());
    newRow.setInt("Oven_P1_1", ovenVals[0]);
    newRow.setInt("Oven_P1_2", ovenVals[1]);
    newRow.setInt("Oven_P5_1", ovenVals[2]);
    newRow.setInt("Oven_P5_2", ovenVals[3]);
    {
      saveTable(table, "data/OvenStatus.csv");  
    }
  }
}

void draw() {
  OvenVal[0] = digitalRead(Oven_P1_1);
  OvenVal[1] = digitalRead(Oven_P1_2);
  OvenVal[3] = digitalRead(Oven_P5_1);
  OvenVal[4] = digitalRead(Oven_P5_2);
  Serial.print(OvenVal[0]);
  Serial.print(",");
  Serial.print(OvenVal[1]);
  Serial.print(",");
  Serial.print(OvenVal[2]);
  Serial.print(",");
  Serial.print(OvenVal[3]);
  Serial.print(",");
  delay(100);
}

, 👍1

Обсуждение

Лучше, если вы спросите о конкретной проблеме, а не о том, что «слишком много ошибок при запуске»., @Prasan Dutt

**Скрежещет зубами** То, что у вас есть, не называется «кодами». Вы опубликовали свой программный код. «Коды» — это то, что вы вводите на цифровой клавиатуре, чтобы открыть дверь. «Код» — это текст, который вы пишете, компилируемый для преобразования в двоичный файл, который становится вашей прошивкой., @JRE

C чувствителен к регистру. Вы определили переменный массив "Ovenvals[]", но пытаетесь использовать "OvenVals[]" - это два разных массива., @Peter Bennett


1 ответ


1

Вы просили (выделено мной):

[...] Но как только входной сигнал станет низким, он сэкономит время OFF (стоп) на той же строке.

Это сложно. Что, если несколько других входов стали ВЫСОКИМИ в между тем? Вам придется как-то перемотать часть файла, затем добавить время остановки, повторное добавление последующих строк...

Вы, вероятно, не захотите делать все это на Arduino. Особенно учитывая, что Arduino не имеет понятия файла, если только вы не добавите SD-карта и соответствующая библиотека. И у него нет понятия времени день, если вы не добавите RTC и соответствующую библиотеку. Я бы предложил вы идете по легкому пути:

  • Пусть Arduino сообщает вашему компьютеру через последовательный порт, когда один из этих входов изменяет состояние
  • напишите программу на своем компьютере (с обработкой или чем-то еще), которая считывает эту информацию и форматирует ее нужным вам образом.

Для первой части я предлагаю следующее:

/*
 * Сообщит нам, когда некоторые пины изменят свое состояние.
 */

const int CHANNELS = 4;
const uint8_t pins[CHANNELS] = {8, 9, 10, 11};

void setup()
{
    Serial.begin(9600);
}

void loop()
{
    static int states[CHANNELS];
    for (int i = 0; i < CHANNELS; i++) {
        int state = digitalRead(pins[i]);
        if (state != states[i]) {  // вход изменил состояние
            Serial.print("channel ");
            Serial.print(i);
            Serial.print(" going ");
            Serial.println(state ? "HIGH" : "LOW");
            states[i] = state;  // записать новое состояние
        }
    }
}

Вывод будет примерно таким

channel 2 going HIGH
channel 1 going HIGH
channel 2 going LOW
...

Что касается второй части, то это вопрос, не связанный с Arduino. больше!

,