Advertisement
pippero

arduino A

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