Измерения датчиков 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);
}

, 👍-2


1 ответ


Лучший ответ:

5

Каждый раз, когда вы вызываете receive_reading(), вы передаете ему один датчик для считывания значения. Но каждый раз, когда вы вызываете receive_reading(), вы распечатываете все три датчика.

Итак, вы:

  1. Считывание EC и печать EC ТЕМПЕРАТУРА ПК
  2. Считывание ПК и печать EC PC TEMP
  3. Считывание температуры и печать температуры 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());
}

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

,

Я думаю, что в файле типа receive_read_cmd() слишком много двоеточий. В остальном хороший ответ, @chrisl

@chrisl копия-макароны ;), @Majenko