Advertisement
pippero

arduino B

Oct 23rd, 2023
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.76 KB | None | 0 0
  1. #include <SoftwareSerial.h>
  2. #include <FastCRC.h>
  3.  
  4. SoftwareSerial mySerial(10, 11); // RX, TX
  5.  
  6. const int blueLedPin = 8; // Pin del LED blu
  7. const int redLedPin = 13; // Pin del LED red
  8. const int greenLedPin = 12; // Pin del LED green
  9. const int writeLedPin = 9; // Pin del LED write
  10.  
  11. struct Ricezione {
  12. char startChar;
  13. float value_A;
  14. float value_B;
  15. int value_C;
  16. int value_D;
  17. int value_E;
  18. int value_F;
  19. bool value_G;
  20. bool value_H;
  21. bool value_I;
  22. uint32_t crc;
  23. char endChar;
  24. };
  25.  
  26. struct Scrittura {
  27. char startChar;
  28. //int value;
  29. float valore_A;
  30. float valore_B;
  31. int valore_C;
  32. int valore_D;
  33. int valore_E;
  34. int valore_F;
  35. bool valore_G;
  36. bool valore_H;
  37. bool valore_I;
  38. char checksum;
  39. char endChar;
  40. };
  41.  
  42. Ricezione ricezione;
  43. Scrittura scrittura;
  44.  
  45. bool validatedCRC = false;
  46. unsigned long tp;
  47. unsigned long tx;
  48. bool In_tx = false;
  49. byte stato = 0;
  50. unsigned long lastCommunicationTime;
  51. const unsigned long ledDuration = 100; // Durata in millisecondi per cui i LED rimangono accesi
  52.  
  53. FastCRC32 crc32;
  54. unsigned long lastCRC; // Tempo dell'ultima conferma del CRC
  55. int timeout = 5000; // Intervallo di timeout in millisecondi
  56.  
  57. void setup() {
  58. Serial.begin(9600);
  59. mySerial.begin(1200);
  60. pinMode(writeLedPin, OUTPUT);
  61. pinMode(greenLedPin, OUTPUT);
  62. pinMode(redLedPin, OUTPUT);
  63. pinMode(blueLedPin, OUTPUT); // Imposta il pin del LED blu come OUTPUT
  64.  
  65. lastCommunicationTime = millis();
  66. }
  67. void led() {
  68.  
  69. unsigned long currentTime = millis();
  70.  
  71. if (mySerial.available() > 0) {
  72. tp = currentTime;
  73. digitalWrite(blueLedPin, HIGH);
  74. stato = 1;
  75. // In_tx = true;
  76. }
  77.  
  78. if (stato == 1 && currentTime - tp > ledDuration) {
  79. digitalWrite(blueLedPin, LOW);
  80. tp = currentTime;
  81. stato = 2;
  82. }
  83.  
  84. if (stato == 2) {
  85. if (validatedCRC) {
  86. digitalWrite(greenLedPin, HIGH);
  87. } else {
  88. digitalWrite(redLedPin, HIGH);
  89. }
  90.  
  91. if (currentTime - tp > ledDuration) {
  92. digitalWrite(greenLedPin, LOW);
  93. digitalWrite(redLedPin, LOW);
  94. stato = 0;
  95. }
  96. }
  97.  
  98. if (In_tx) {
  99. // if (!mySerial.available() ) {
  100. tx = currentTime;
  101. digitalWrite(writeLedPin, HIGH);
  102. In_tx = false;
  103. //}
  104. }
  105. if (currentTime - tx > ledDuration) {
  106. digitalWrite(writeLedPin, LOW);
  107. }
  108. }
  109. unsigned int scritturaSize = sizeof(scrittura);
  110. void loop() {
  111. resetSerialTimeout(); // Chiamata a resetSerialTimeout per controllare il timeout tra conferme CRC
  112.  
  113. led();
  114. if (mySerial.available() >= scritturaSize) {
  115. ricevo();
  116. }
  117. }
  118. void ricevo() {
  119. //unsigned int scritturaSize = sizeof(scrittura);
  120. unsigned int ricezioneSize = sizeof(ricezione);
  121. if (mySerial.available() >= scritturaSize) {
  122. byte* scritturaBytes = (byte*)&scrittura;
  123. for (size_t i = 0; i < sizeof(scrittura); i++) {
  124. scritturaBytes[i] = mySerial.read();
  125. }
  126. if (scrittura.startChar == 0x02 && scrittura.endChar == 0x03) { // Verifica che i caratteri di inizio e fine trasmissione siano corretti
  127. char calculatedChecksum = calculateChecksum(&scrittura, sizeof(scrittura) - 2); // Calcola il checksum escludendo startChar e endChar
  128. if (calculatedChecksum == scrittura.checksum) {
  129. lastCRC = millis(); // Aggiorna il tempo dell'ultima conferma del CRC
  130. validatedCRC = true;//imposto variabile conferma led verde
  131. Serial.print("Valore ricevuto da Arduino A:\n");
  132. Serial.print("Valore A: ");
  133. Serial.println(scrittura.valore_A);
  134. Serial.print("Valore B: ");
  135. Serial.println(scrittura.valore_B);
  136. Serial.print("Valore C: ");
  137. Serial.println(scrittura.valore_C);
  138. Serial.print("Valore D: ");
  139. Serial.println(scrittura.valore_D);
  140. Serial.print("Valore E: ");
  141. Serial.println(scrittura.valore_E);
  142. Serial.print("Valore F: ");
  143. Serial.println(scrittura.valore_F);
  144. Serial.print("Valore G: ");
  145. Serial.println(scrittura.valore_G);
  146. Serial.print("Valore H: ");
  147. Serial.println(scrittura.valore_H);
  148. Serial.print("Valore I: ");
  149. Serial.println(scrittura.valore_I);
  150. lastCommunicationTime = millis();
  151. trasmetto();
  152. } else {
  153. Serial.println("Errore CRC nei dati ricevuti da Arduino B");
  154. validatedCRC = false;
  155. }
  156. } else {
  157. Serial.println("Errore nei caratteri di inizio o fine o dati corrotti.");
  158. validatedCRC = false;
  159. }
  160. }
  161. }
  162.  
  163. void trasmetto() {
  164. //Serial.flush();
  165. Serial.println(" e' ora di trasmettere ");
  166. ricezione.startChar = 0x02; // Carattere di inizio trasmissione (STX)
  167. ricezione.value_A = 1.23;
  168. ricezione.value_B = 4.56;
  169. ricezione.value_C = random(7000, 22000);
  170. ricezione.value_D = millis() / 2 / 10;
  171. ricezione.value_E = random(0, 30000);
  172. ricezione.value_F = random(50, 180);
  173. ricezione.value_G = false;
  174. ricezione.value_H = true;
  175. ricezione.value_I = false;
  176. ricezione.crc = crc32.crc32((byte*)&ricezione, sizeof(ricezione) - sizeof(ricezione.crc) - 2);
  177. ricezione.endChar = 0x03; // Carattere di fine trasmissione (ETX)
  178. In_tx = true;
  179. byte* ricezioneBytes = (byte*)&ricezione;
  180. for (size_t i = 0; i < sizeof(ricezione); i++) {
  181. mySerial.write(ricezioneBytes[i]);
  182. }
  183. //Serial.flush();
  184. lastCommunicationTime = millis();
  185. }
  186.  
  187.  
  188.  
  189. char calculateChecksum(void* data, size_t size) {
  190. char checksum = 0;
  191. char* bytes = (char*)data;
  192.  
  193. for (size_t i = 0; i < size; i++) {
  194. checksum ^= bytes[i];
  195. }
  196.  
  197. return checksum;
  198. }
  199.  
  200. void resetSerialTimeout() {
  201. if (millis() - lastCRC > timeout) {
  202. mySerial.end(); // Termina la comunicazione seriale
  203. delay(150); // Assicurati di attendere un breve periodo prima di riavviare
  204. validatedCRC = false;
  205. mySerial.begin(1200);
  206. lastCRC = millis();
  207. }
  208. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement