Нужна помощь с кодом для моего проекта с использованием 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);
}
@Bong, 👍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. больше!
- Отправка информации (например, строки) через цифровые контакты
- Отправка mouseX и mouseY из обработки в Arduino
- Графические данные датчика усилия направляются через HX711?
- Как отправить 2 данных на обработку с Arduino
- Справка по последовательному входу
- Обработка, отправленная Arduino, не считывает целые массивы, если шнур не отключен и не подключен снова?
- Почему номера COM-портов между Arduino и Processing не совпадают?
- Плоттер с ЧПУ НА базе ардуино, необходимо устранить ошибку (invalid conversion from 'char' to 'char*' [-fpermissive]indexY = '\0';
Лучше, если вы спросите о конкретной проблеме, а не о том, что «слишком много ошибок при запуске»., @Prasan Dutt
**Скрежещет зубами** То, что у вас есть, не называется «кодами». Вы опубликовали свой программный код. «Коды» — это то, что вы вводите на цифровой клавиатуре, чтобы открыть дверь. «Код» — это текст, который вы пишете, компилируемый для преобразования в двоичный файл, который становится вашей прошивкой., @JRE
C чувствителен к регистру. Вы определили переменный массив "Ovenvals[]", но пытаетесь использовать "OvenVals[]" - это два разных массива., @Peter Bennett