Go Down

Topic: Lettura Orario (Read 87 times) previous topic - next topic

Mozzini97

May 26, 2019, 06:14 pm Last Edit: May 26, 2019, 11:00 pm by Mozzini97
Buongiorno a tutti,purtroppo devo chiedere aiuto al popolo di Arduino perché ho un problema.
Vi spiego brevemente cosa voglio fare, allora io ho un controller per i pannelli solari con uno schermo esterno, questo schermo esterno serve per impostare i valori di tensione massima, minima e via cosi...
Su questo schermo io posso visualizzare la data e l'orario.A me e proprio questa informazione che mi serve, potrei utilizzare il modulo di Arduino apposta ma mi sembra stupido aggiungere dei componenti quando ne ho già uno che fa quello che voglio. Volevo chiedere, il controller contiene già le informazioni e quando attacco il modulo esterno lui va a "chiedere" la data oppure quando alimento il modulo esterno lui al suo interno ha un sistema per sapere la data? Io ho trovato il protocollo di comunicazione del mio controller e riesco a leggere la tensione, corrente e molte altre informazioni ma la data non ci riesco...forse sbaglio io, non ho ben capito come impostare il numero di registri da leggere, ad esempio 0x9014 sono 14 registri da leggere? Magari sbaglio e metto uint_8 quando invece e un uint_16? Se qualcuno me lo può spiegare e magari controllare  il mio codice...

In allegato vi metto il link del mio controller un'esempio di codice che mi propongono , il programma che ho provato a fare io e il protocollo di comunicazione:

link controller: https://www.aliexpress.com/item/Epever-20A-MPPT-solar-controller-Tracer2215BN-12V-24V-auto-work-20A-solar-charge-controller-Epsolar-controller/32828827201.html

Esempio codice:
Code: [Select]

#include <ModbusMaster.h>


// instantiate ModbusMaster object
ModbusMaster node;


void setup()
{
  // use Serial (port 0); initialize Modbus communication baud rate
  Serial.begin(19200);

  // communicate with Modbus slave ID 2 over Serial (port 0)
  node.begin(2, Serial);
}


void loop()
{
  static uint32_t i;
  uint8_t j, result;
  uint16_t data[6];
 
  i++;
 
  // set word 0 of TX buffer to least-significant word of counter (bits 15..0)
  node.setTransmitBuffer(0, lowWord(i));
 
  // set word 1 of TX buffer to most-significant word of counter (bits 31..16)
  node.setTransmitBuffer(1, highWord(i));
 
  // slave: write TX buffer to (2) 16-bit registers starting at register 0
  result = node.writeMultipleRegisters(0, 2);
 
  // slave: read (6) 16-bit registers starting at register 2 to RX buffer
  result = node.readHoldingRegisters(2, 6);
 
  // do something with data if read is successful
  if (result == node.ku8MBSuccess)
  {
    for (j = 0; j < 6; j++)
    {
      data[j] = node.getResponseBuffer(j);
    }
  }
}


Codice fatto da me per l'orario:
Code: [Select]
#include <ModbusMaster.h>

ModbusMaster node;

void setup() {

  Serial.begin(19200);
  node.begin(1, Serial);


}

void loop() {
  uint8_t resultMain;
 
  resultMain = node.readHoldingRegisters(0x9000, 16);
  if(resultMain == node.ku8MBSuccess)
  {
    Serial.println("=================================");
    Serial.println("Real time clock ");
    Serial.println(node.getResponseBuffer(0x13));
  }
  delay(10000);
}


Nel mio programma non entra nemmeno nel void loop non capisco il perché..
nel protocollo di comunicazione dice che bisogna usare un HoldingRegister non so bene cosa sia...

Spero che qualcuno mi sappia aiutare o almeno dare una dritta, Buona serata a tutti :)

Go Up