Arduino Not sending PGN 130312 Temperature Data ON NMEA2000 ON GARMIN 720S



#include <Arduino.h>
#define N2k_SPI_CS_PIN 53    // If you use mcp_can and CS pin is not 53, uncomment this and modify definition to match your CS pin.
#define N2k_CAN_INT_PIN 21   // If you use mcp_can and interrupt pin is not 21, uncomment this and modify definition to match your interrupt pin.
#define USE_MCP_CAN_CLOCK_SET 8  // If you use mcp_can and your mcp_can shield has 8MHz chrystal, uncomment this.

#include <NMEA2000_CAN.h>  // This will automatically choose right CAN library and create suitable NMEA2000 object
#include <N2kMessages.h>
const int ntcPin = A0;                       // For Main Cabin Temperature
const float Beta = 3950.0;
const float thermistorNominal = 10000.0;
const float temperatureNominal = 25.0;
const int referenceResistor = 10000;

const int ntc2Pin = A1;                     // For sea temperature
const float Beta1 = 3950.0;
const float thermistorNominal_1 = 10000.0;
const float temperatureNominal_1 = 25.0;
const int referenceResistor_1 = 10000;

const int ntc3Pin = A2;                    // For outside temperature
const float Beta2 = 3950.0; 
const float thermistorNominal_2 = 10000.0;
const float temperatureNominal_2 = 25.0;
const int referenceResistor_2 = 10000;

volatile int flow_frequency_A; // Measures flow sensor A pulses
volatile int flow_frequency_B; // Measures flow sensor B pulses
float vol_A = 0.0, vol_B = 0.0, total_vol = 0.0;
float l_minute_A, l_minute_B, total_l_minute;
unsigned char flowsensor_A = 18; // Sensor A Input
unsigned char flowsensor_B = 3; // Sensor B Input
unsigned long currentTime;
unsigned long cloopTime;
// List here messages your device will transmit.
const unsigned long TransmitMessages[] PROGMEM={130310L,127489L,130316L,130312L,130311L,0};
static unsigned long N2kMsgSentCount=0;
static unsigned long N2kMsgFailCount=0;

tN2kSyncScheduler TemperatureScheduler(false,500,520);
tN2kSyncScheduler EnvironmentalScheduler(false,500,540);
tN2kSyncScheduler OutsideEnvironmentalScheduler(false,500,520);


void OnN2kOpen() {
  // Start schedulers now.
  TemperatureScheduler.UpdateNextTime();
  EnvironmentalScheduler.UpdateNextTime();
  OutsideEnvironmentalScheduler.UpdateNextTime();
}

// *****************************************************************************
void setup() {
  Serial.begin(9600);
   pinMode(flowsensor_A, INPUT);
   pinMode(flowsensor_B, INPUT);
   digitalWrite(flowsensor_A, HIGH); // Optional Internal Pull-Up
   digitalWrite(flowsensor_B, HIGH); // Optional Internal Pull-Up
   attachInterrupt(digitalPinToInterrupt(flowsensor_A), flow_A, RISING); // Setup Interrupt for sensor A
   attachInterrupt(digitalPinToInterrupt(flowsensor_B), flow_B, RISING); // Setup Interrupt for sensor B
   currentTime = millis();
   cloopTime = currentTime;
  // Set Product information
  NMEA2000.SetProductInformation("00000001", // Manufacturer's Model serial code
                                 100, // Manufacturer's product code
                                 "Simple temp monitor",  // Manufacturer's Model ID
                                 "1.2.0.24 (2024-08-11)",  // Manufacturer's Software version code
                                 "1.1.0.0 (2024-08-11)" // Manufacturer's Model version
                                 );
  // Set device information
  NMEA2000.SetDeviceInformation(112233, // Unique number. Use e.g. Serial number.
                                130, // Device function=Temperature. See codes on https://web.archive.org/web/20190531120557/https://www.nmea.org/Assets/20120726%20nmea%202000%20class%20&%20function%20codes%20v%202.00.pdf
                                75, 
                                2040 // Just choosen free from code list on https://web.archive.org/web/20190529161431/http://www.nmea.org/Assets/20121020%20nmea%202000%20registration%20list.pdf
                               );



  NMEA2000.SetMode(tNMEA2000::N2km_ListenAndNode,22);
  NMEA2000.EnableForward(false); // Disable all msg forwarding to USB (=Serial)
  NMEA2000.ExtendTransmitMessages(TransmitMessages);
  NMEA2000.SetOnOpen(OnN2kOpen);
  NMEA2000.Open();
}


// *****************************************************************************
void loop() {
int analogValue = analogRead(ntcPin);
  float resistance = calculateResistance(analogValue);
  float temperatureC = calculateTemperatureC(resistance);
  float temperatureF = temperatureC * 9.0 / 5.0 + 32.0;
  
  /*Serial.print("Analog Value: ");
  Serial.print(analogValue);
  Serial.print(" Resistance: ");
  Serial.print(resistance);
  Serial.print(" ohms Temperature: ");
  Serial.print(temperatureC);
  Serial.print(" °C / ");
  Serial.print(temperatureF);
  Serial.println(F(" °F"));*/
    int analogValue_1 = analogRead(ntc2Pin);
  float resistance_1 = calculateResistance_1(analogValue_1);
  float temperatureC_1 = calculateTemperatureC_1(resistance_1);
  float temperatureF_1 = temperatureC_1 * 9.0 / 5.0 + 32.0;

  /*Serial.print("Analog Value_1: ");
  Serial.print(analogValue_1);
  Serial.print(" Resistance_1: ");
  Serial.print(resistance_1);
  Serial.print(" ohms Temperature_1: ");
  Serial.print(temperatureC_1);
  Serial.print(" °C / ");
  Serial.print(temperatureF_1);
  Serial.println(F(" °F"));*/

  currentTime = millis();
   if (currentTime >= (cloopTime + 1000))
   {
      cloopTime = currentTime; 
      // Calculate flow for sensor A
      if (flow_frequency_A != 0)
      {
         l_minute_A = (flow_frequency_A / 7.5) / 60; // Calculate flow rate in L/min
         vol_A += l_minute_A;
         flow_frequency_A = 0; 
      }
      else
      {
         l_minute_A = 0;
      }

      
      if (flow_frequency_B != 0)
      {
         l_minute_B = (flow_frequency_B / 7.5) / 60; // Calculate flow rate in L/min
         vol_B += l_minute_B;
         flow_frequency_B = 0; 
      }
      else
      {
         l_minute_B = 0;
      }

      // Calculate total flow as FlowA - FlowB
      total_l_minute = l_minute_A - l_minute_B;
      total_vol = vol_A - vol_B;

      // Print results
      Serial.print("Flow A: ");
      Serial.print(l_minute_A, DEC);
      Serial.print(" L/min, Flow B: ");
      Serial.print(l_minute_B, DEC);
      Serial.print(" L/min, Total Flow: ");
      Serial.print(total_l_minute, DEC);
      Serial.println(" L/min");
   }
  //SendN2kTransmission();
  SendOutsideEnvironmentalParameters();
  //SendN2kTemperature();
  NMEA2000.ParseMessages();
}

// *****************************************************************************
float calculateResistance(int analogValue) {
  float voltage = analogValue * (5.0 / 1023.0);
  return referenceResistor * (5.0 / voltage - 1.0);
}

float calculateTemperatureC(float resistance) {
  float steinhart;
  steinhart = resistance / thermistorNominal;  // (R/Ro)
  steinhart = log(steinhart);                  // ln(R/Ro)
  steinhart /= Beta;                           // 1/B * ln(R/Ro)
  steinhart += 1.0 / (temperatureNominal + 273.15); // + (1/To)
  steinhart = 1.0 / steinhart;                 // Invert
  steinhart -= 273.15;                         // Convert to Celsius
  return steinhart;
}

float calculateResistance_1(int analogValue_1) {
  float voltage = analogValue_1 * (5.0 / 1023.0);
  return referenceResistor_1 * (5.0 / voltage - 1.0);
}

float calculateTemperatureC_1(float resistance_1) {
  float steinhart;
  steinhart = resistance_1 / thermistorNominal_1;  // (R/Ro)
  steinhart = log(steinhart);                  // ln(R/Ro)
  steinhart /= Beta1;                           // 1/B * ln(R/Ro)
  steinhart += 1.0 / (temperatureNominal_1 + 273.15); // + (1/To)
  steinhart = 1.0 / steinhart;                 // Invert
  steinhart -= 273.15;                         // Convert to Celsius
  return steinhart;
}

float calculateResistance_2(int analogValue_2) {
  float voltage = analogValue_2 * (5.0 / 1023.0);
  return referenceResistor_2 * (5.0 / voltage - 1.0);
}

float calculateTemperatureC_2(float resistance_2) {
  float steinhart;
  steinhart = resistance_2 / thermistorNominal_2;  // (R/Ro)
  steinhart = log(steinhart);                  // ln(R/Ro)
  steinhart /= Beta2;                           // 1/B * ln(R/Ro)
  steinhart += 1.0 / (temperatureNominal_2 + 273.15); // + (1/To)
  steinhart = 1.0 / steinhart;                 // Invert
  steinhart -= 273.15;                         // Convert to Celsius
  return steinhart;
}

double ReadCabinTemp() {
  int analogValue = analogRead(ntcPin);
  float resistance = calculateResistance(analogValue);
  float temperatureC = calculateTemperatureC(resistance);
  return CToKelvin(temperatureC); // Read here the true temperature e.g. from analog input
}


// *****************************************************************************
double ReadWaterTemp() {
  int analogValue_1 = analogRead(ntc2Pin);
  float resistance_1 = calculateResistance_1(analogValue_1);
  float temperatureC_1 = calculateTemperatureC_1(resistance_1);
  return CToKelvin(temperatureC_1); // Read here the true temperature e.g. from analog input
}

// *****************************************************************************
double ReadinsideTemp() {
  int analogValue_2 = analogRead(ntc3Pin);
  float resistance_2 = calculateResistance_1(analogValue_2);
  float temperatureC_2 = calculateTemperatureC_1(resistance_2);
  return CToKelvin(temperatureC_2); // Read here the true temperature e.g. from analog input
}
//*********************************************************************************
void SendN2kMsg(const tN2kMsg &N2kMsg) {
  if ( NMEA2000.SendMsg(N2kMsg) ) {
    N2kMsgSentCount++;
  } else {
    N2kMsgFailCount++;
  }
}



// *****************************************************************************
/*void SendN2kTemperature() {
  tN2kMsg N2kMsg;
   SetN2kOutsideEnvironmentalParameters(N2kMsg, 1, ReadWaterTemp(), ReadCabinTemp());
   NMEA2000.SendMsg(N2kMsg);

}*/
//******************************************************************************************
/*void SendN2kTemperature() {
  tN2kMsg N2kMsg;
  SetN2kTemperature(N2kMsg, 1, 2, N2kts_MainCabinTemperature, ReadinsideTemp());
  SendN2kMsg(N2kMsg);
}*/
//***********************************************************************************
void SendOutsideEnvironmentalParameters() {
  tN2kMsg N2kMsg;
  SetN2kOutsideEnvironmentalParameters(N2kMsg, 1, ReadWaterTemp(),ReadCabinTemp());
  SendN2kMsg(N2kMsg);
}
//**********************************************************************************
void SendN2kTemperatureExt() {
  tN2kMsg N2kMsg;
  SetN2kTemperatureExt(N2kMsg, 0xff,11,N2kts_InsideTemperature, ReadinsideTemp(),CToKelvin(21.6));
  SendN2kMsg(N2kMsg);
}
// *****************************************************************************

void SendN2kEngineDynamicParam() {
  tN2kMsg N2kMsg;
  tN2kEngineDiscreteStatus1 Status1;
  Status1.Bits.LowOilLevel=1;
  Status1.Bits.OverTemperature=1;
  SetN2kEngineDynamicParam(N2kMsg,1,656000,CToKelvin(86.3),CToKelvin(82.1),14.21,9.0 ,hToSeconds(2137.55),N2kDoubleNA,N2kDoubleNA,N2kInt8NA,N2kInt8NA,Status1);
  SendN2kMsg(N2kMsg);
}

//***************************************************************
void flow_A() // Interrupt function for sensor A
{
   flow_frequency_A++;
}
//***************************************************************
void flow_B() // Interrupt function for sensor B
{
   flow_frequency_B++;
}


[/quote]

here is the code which i used to send data on bus is attached, environmental outside temperature and air ambient temperature which is PGN 130310 , shows on GARMIN 720s,but PGN 130312, and even 130316 is unable to show on Garmin.

Issue is solved by adding required pgn only and soft reset on Garmin

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.