ciao
sono in laboratorio cercando di fare un upgrade software e hardware di un datalogger che riceve dati via radio con un HC12
ci sono un trasmettitore di temperatura e un ricevitore lato ricevitore mi sono imbattuto in questo problema dove il setup viene continuamente ripetuto
questo il ricevitore
//data 220721
//master
//per ricezione dati htu21d + termocoppia K
//from termometri distribuiti >> unità centrale memorizza
#include <SPI.h>
//#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// libreries
//-------------------------------HC12 radio
#include <SoftwareSerial.h>
const byte HC12RxdPin = 2; // "RXD" Pin on HC12
const byte HC12TxdPin = 3; // "TXD" Pin on HC12
const byte HC12SetPin = 6; // "SET" Pin on HC12
SoftwareSerial Radio_HC12(HC12TxdPin, HC12RxdPin); // RX nano to HC-12 TX Pin, TX nano to HC-12 RX Pin
char SLAVE_START;//carattere di start codice stazione SLAVE
char MASTER_START;//carattere di start stazione MASTER
char END;// carattere di end trasmissione
char rx;
byte index;
int const maxdim = 36;
char stringa[maxdim];
//-------------------per la parte orologio RTC
#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>
//---------------------Scheda SD
#include <SPI.h>
#include <SD.h>
byte chipSDSelect;
File datafile;
char logfile; // contenitore per nome file di log
byte sensorNumTot;
char id_sensor[8];//vettore codice stazione aggiungere le stazioni se serve
byte i, j;//contatori
//sezione delay con millis()
unsigned long previousMillis; // will store last time LED was updated
unsigned long currentMillis;
long interval;
void setup()
{
Serial.begin(9600); // Open serial port to computer
Wire.begin();
// //--------------------SSD1306 sezione oled
// // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
// if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS))
// {
// Serial.println(F("SSD1306 allocation failed"));
// for (;;); // Don't proceed, loop forever
// }
// //Show initial display buffer contents on the screen --
// // the library initializes this with an Adafruit splash screen.
// display.display();
// delay(2000); // Pause for 2 seconds
//
// //Clear the buffer
// display.clearDisplay();
// display.display();
// delay(2000);
//------------------------HC12
Radio_HC12.begin(9600);// Open serial port to HC12
pinMode(HC12SetPin, OUTPUT);
digitalWrite(HC12SetPin, HIGH);
delay(500);
Serial.println("HC12 ready:");
//------------------------Scheda SD
chipSDSelect = 5;
pinMode(chipSDSelect, OUTPUT);
Serial.println("Initializing SD card...");
//--------------------------led allarm
pinMode(7, OUTPUT);// led card not present
pinMode(8, OUTPUT);// led no RTC
digitalWrite(7, LOW);
digitalWrite(8, LOW);
if (!SD.begin(chipSDSelect))// see if the card is present and can be initialized:
{
Serial.println("Card failed, or not present 01");// don't do anything more
digitalWrite(7, HIGH);
while (1);
}
Serial.println("SD card initialized.");
logfile = "datalog.txt"; // contenitore per nome file di log
SLAVE_START = '<'; //carattere inizio trasmissione stazione SLAVE
MASTER_START = '#'; //carattere di start stazione MASTER
END = '>'; // carattere di end trasmissione
sensorNumTot = 3;
id_sensor[0] = SLAVE_START; //carattere inizio trasmissione stazione SLAVE
id_sensor[1] = 'a'; //aggiungere le stazioni se serve e aggiornare indice vettore
id_sensor[2] = 'b'; //aggiungere le stazioni se serve e aggiornare indice vettore
id_sensor[3] = 'c'; //aggiungere le stazioni se serve e aggiornare indice vettore
id_sensor[4] = 'd'; //aggiungere le stazioni se serve e aggiornare indice vettore
id_sensor[5] = 'e'; //aggiungere le stazioni se serve e aggiornare indice vettore
id_sensor[6] = END; //caratte fine trasmissione
id_sensor[7] = '\0'; //carattere null
Serial.println(id_sensor);
// id_sensor[8] = {SLAVE_START, '1', '2', '3', '4', '5', END, '\0'};
// riceve e tratta i dati dalla radio
char stringa[maxdim] = {0}; //il buffer di appoggio della trasmissione
byte index = 0;
interval = 3000;//millis intervallo delle interrogazioni delle stazioni
//120000 = 6 min
//100000 = 5 min
//140000 = 7 min
//80000 = 4 min
previousMillis = 0;
i = 0;
rx = {0};
index = 0;
delay(1000);
}
void loop()
{
currentMillis = millis();
if (currentMillis - previousMillis >= interval)
{
i++;
Serial.print(id_sensor[0]); // carattere di start codice stazione SLAVE
Serial.print(id_sensor[i]); //codice stazione TU
Serial.println(id_sensor[6]); // carattere di end trasmissione
previousMillis = currentMillis; // save the last time
//-------------------send to TX
Radio_HC12.print(id_sensor[0]); // carattere di start codice stazione SLAVE
delay(5);
Radio_HC12.print(id_sensor[i]); //codice stazione TU
delay(5);
Radio_HC12.println(id_sensor[6]); // carattere di fine trasmissione
if (i == sensorNumTot)
{
i = 0;
}
}
//--------------------receive from TX
while (Radio_HC12.available())
{
rx = Radio_HC12.read(); //sono sicuro che esista un carattere dal leggere, altrimenti non sarebbe stata chiamata
if (rx == MASTER_START)//carattere inizio trasmissione da TX
{
// Serial.println("inizio RX");
index = 1;
stringa[0] = rx;//contiene il carattere start dalla TX
return;
}
if (index > 0 && index < maxdim-2)
{
stringa[index++] = rx;
}
}//parentesi aggiunta
//-------------------------------write SD
if (rx == END)
{
datafile = SD.open("datalog.txt", FILE_WRITE); //apre file
// Serial.print("sizeof(stringa)");
// Serial.println(sizeof(stringa));
if (datafile) //if the file is available, write to it:
{
digitalWrite(7, LOW); // turn the LED OFF
// Serial.println("scrivo su file data ora e dati");
tmElements_t tm;
//-----------------------RTC
if (RTC.read(tm))
{
digitalWrite(8, LOW); // turn the LED OFF
if (tm.Hour < 10) //scrive ora
{
datafile.print('0');
}
datafile.print(tm.Hour);
datafile.print(':'); //separatore
if (tm.Minute < 10) //scrive minuto
{
datafile.print('0');
}
datafile.print(tm.Minute);
datafile.print(':'); //separatore
if (tm.Second < 10) //scrive secondo
{
datafile.print('0');
}
datafile.print(tm.Second);
datafile.print(' '); //separatore
datafile.print(tm.Day); //scrive giorno
datafile.print('/'); //separatore
datafile.print(tm.Month); //scrive mese
datafile.print('/'); //separatore
datafile.print(tmYearToCalendar(tm.Year));//scrive anno
datafile.print(',');//separatore
datafile.println(stringa);//scrive stringa dati da stazione TX
datafile.close();//chiude file
Serial.println(stringa); //scrive stringa sulla seriale per controllo
//-------------------------sezione oled
display.clearDisplay();
display.setTextSize(1); // Normal 1:1 pixel scale
display.setTextColor(SSD1306_WHITE); // Draw white text
display.setCursor(0, 0); // Start at top-left corner
display.print(stringa[25]);
display.print(stringa[26]);
display.print(stringa[27]);
display.print(stringa[28]);
display.print(stringa[29]);
display.print(stringa[30]);
display.print(stringa[31]);
display.println();
display.display();
delay(2000);
}
else
{
digitalWrite(8, HIGH); // turn the LED on (HIGH is the voltage level)
if (RTC.chipPresent())
{
Serial.println("The DS1307 is stopped. Please run the SetTime");
Serial.println("example to initialize the time and begin running.");
Serial.println();
digitalWrite(8, HIGH);
}
else
{
Serial.println("DS1307 read error! Please check the circuitry");
Serial.println();
digitalWrite(8, HIGH);
}
}
}
else
{
Serial.println("Card failed, or not present 02");// don't do anything more
digitalWrite(7, HIGH); // turn the LED on
}
}
}
questo l output
SD card initialized.
<abcde>
<a>
#a,HC12 ready:
Initializing SD card...
SD card initialized.
<abcde>
<a>
#a⸮HC12 ready:
Initializing SD card...
SD card initialized.
<abcde>
<a>
#a,HC12 ready:
Initializing SD card...
SD card initialized.
<abcde>
<a>
#a,HC12 ready:
Initializing SD card...
SD card initialized.
<abcde>
<a>
#a⸮HC12 ready:
Initializing SD card...
SD card initialized.
questo il messaggio al termine dell upload
Sketch uses 23070 bytes (75%) of program storage space. Maximum is 30720 bytes.
Global variables use 1634 bytes (79%) of dynamic memory, leaving 414 bytes for local variables. Maximum is 2048 bytes.
Low memory available, stability problems may occur.
grazie per ogni suggerimento