Измерения датчиков My Atlas Scientific дают нулевые значения при первом чтении
Я все еще продолжаю свой проект по мониторингу питательных веществ в гидропонике. Короче говоря, я создал гидропонную систему мониторинга питательных веществ с подключением I2C и решил установить последовательную связь с Raspberry Pi 3B +, чтобы сохранить данные о показаниях датчика в файле CSV. Мне любопытно, почему после загрузки скетча датчики всегда дают нулевые значения при первом считывании на последовательном мониторе.
Это скриншот моего последовательного монитора.
Слева направо: временная метка, EC, pH, температура.
Каждый раз, когда я перезагружаю Arduino, последовательный монитор сначала не показывает никаких значений. Во второй строке отображается только значение EC. В третьей строке отображаются только значения EC и pH, затем в четвертой строке и так далее будут показаны все значения.
Как заставить Arduino показывать все значения датчиков с самого начала на последовательном мониторе?
Вот мой код, который я изменил на странице Atlas Scientific для своего проекта:
#include <Ezo_i2c.h>
#include <Wire.h>
Ezo_board ec = Ezo_board(100, "EC");
Ezo_board ph = Ezo_board(99, "PH");
Ezo_board temp = Ezo_board(102, "RTD");
bool reading_request_phase = true;
uint32_t next_poll_time = 0;
const unsigned int response_delay = 1000;
void setup()
{
Serial.begin(9600);
Wire.begin();
delay(1000);
}
void loop() {
if (reading_request_phase)
{
ec.send_read_cmd();
ph.send_read_cmd();
temp.send_read_cmd();
next_poll_time = millis() + response_delay;
reading_request_phase = false;
}
else
{
if (millis() >= next_poll_time)
{
receive_reading(ec);
receive_reading(ph);
receive_reading(temp);
reading_request_phase = true;
}
}
}
void receive_reading(Ezo_board &Sensor) {
Sensor.receive_read_cmd();
Serial.println();
Serial.print(ec.get_last_received_reading()/1000);
Serial.print(",");
Serial.print(ph.get_last_received_reading());
Serial.print(",");
Serial.print(temp.get_last_received_reading());
Serial.print("");
delay(1000);
}
@Angela Radityatama, 👍-2
1 ответ
Лучший ответ:
Каждый раз, когда вы вызываете receive_reading()
, вы передаете ему один датчик для считывания значения. Но каждый раз, когда вы вызываете receive_reading()
, вы распечатываете все три датчика.
Итак, вы:
- Считывание EC и печать EC ТЕМПЕРАТУРА ПК
- Считывание ПК и печать EC PC TEMP
- Считывание температуры и печать температуры EC PC
На первом шаге у вас есть только EC, вы еще не прочитали PC или TEMP. На втором шаге у вас есть старые показания EC и новые показания ПК, но по-прежнему нет показаний температуры. К третьему шагу у вас, наконец, есть показания температуры, но все еще остаются старые показания EC и PC, полученные ранее.
Вместо этого вы должны поместить команду приема (Sensor.receive_read_cmd()
) один раз для каждого датчика как отдельную вещь для отображения полученных значений. Больше похоже на:
#include <Ezo_i2c.h>
#include <Wire.h>
Ezo_board ec = Ezo_board(100, "EC");
Ezo_board ph = Ezo_board(99, "PH");
Ezo_board temp = Ezo_board(102, "RTD");
bool reading_request_phase = true;
uint32_t next_poll_time = 0;
const unsigned int response_delay = 1000;
void setup()
{
Serial.begin(9600);
Wire.begin();
delay(1000);
}
void loop() {
if (reading_request_phase)
{
ec.send_read_cmd();
ph.send_read_cmd();
temp.send_read_cmd();
next_poll_time = millis() + response_delay;
reading_request_phase = false;
}
else
{
if (millis() >= next_poll_time)
{
ec.receive_read_cmd();
ph.receive_read_cmd();
temp.receive_read_cmd();
display_reading();
reading_request_phase = true;
}
}
}
void display_reading() {
Serial.print(ec.get_last_received_reading()/1000);
Serial.print(",");
Serial.print(ph.get_last_received_reading());
Serial.print(",");
Serial.println(temp.get_last_received_reading());
}
Также уберите задержку()
после каждой напечатанной строки, это просто все запутывает и замедляет ваше чтение.
- Как получить ненулевой выход из HX711 и ячейки загрузки?
- Подключение двух Arduino через I2C, когда контакты I2C A4/A5 уже используются.
- Чтение данных из eagle tree airspeed v3
- Датчик качества воздуха Sparkfun CCS811 не работает
- MAX30102 показывает частоту сердечных сокращений: 0.00 ударов в минуту / SpO2: 0%
- Датчики I2C не работают при подключении к LCD дисплею 20X04
- Проблема стабильности кода прерываний, связанного с датчиком расхода
- DHT20 и дисплей Oled не работают вместе
Я думаю, что в файле типа
receive_read_cmd()
слишком много двоеточий. В остальном хороший ответ, @chrisl@chrisl копия-макароны ;), @Majenko