47 0 672KB
Ministerul Educaţiei, Culturii și Cercetării Universitatea Tehnică a Moldovei Facultatea Calculatoare Informatică şi Microelectronică Departamentul Ingineria Software şi Automatică
Raport Lucrarea de laborator nr.7 Disciplina: Internetul lucrurilor (IoT) Tema: Comunicare
A elaborat:
st. gr. SI-171, Iepuras Daniel
A verificat:
conf. Serghei Dubac
Chișinău 2020
Enuntul problemei
Sa se realizeze o aplicatie ce va implementa comunicatiile intre echipamente dupa cum urmeaza: 1. Protocol fizic de comunicare - Comunicarea intre DOUA Microcontrollere prin interfata I2C •
MCU1 - implementeaza sensorul digital cu interfata I2C pentru sensorul ultrasonic HCS-04, unde se ececuta colectarea datelor de la interfata sensorului si se retransmite catre interfata I2C la detectarea unei cereri de citire a datelor.
•
MCU2 - executa cererea prin interfata I2C catre sesorul digital ultrasonic (MCU+HCS-04)
2. Protocol logic de comunicare - cererea de date prin interfata serial, in format text respectand un protocol de comunicare care va avea campurile: •
indicator de start pachet
•
indicator de sfarsit
•
contorizare pachete
•
ID emitator
•
ID receptor
•
tipul pachetului
•
•
date pachet - Payload
•
suma de control - suma tuturor valorilor numerice din pachet
Realizarea Lucrarii 1.1 Materiale Necesare
Figura 1.1 – Componentele Necesare Circuitului
1.2 Structura Circuitului
Figura 1.2 – Structura Circuitului
1.3 Codul Arduino 1.3.1 Codul pentru Arduino Uno R3 Master 2. #include 3. 4. #define SLAVE_ADDRESS 0x05 5. #define SONIC_STATUS_CMD "sonic_dist" 6. #define TIMEOUT 30 7. #define BYTE_ARR_SIZE 2 8. 9. #define SERIAL_BITS_NUM 9600 10. #define EOS "'\0'" 11. #define EOL '\n' 12. #define MAX_TASKS 10 13. #define length(arr) sizeof(arr)/sizeof(*arr) 14. 15. template inline Print &operator (HardwareSerial &obj, String &arg) { arg=obj.readString(); retu rn obj; } 18. HardwareSerial &operator >>(HardwareSerial &obj, int &arg) { arg=(int) obj.parseInt(); ret urn obj; } 19. HardwareSerial &operator >>(HardwareSerial &obj, long &arg) { arg=obj.parseInt(); return o bj; } 20. HardwareSerial &operator >>(HardwareSerial &obj, char &arg) { arg=obj.read(); return obj; } 21. HardwareSerial &operator >>(HardwareSerial &obj, float &arg) { arg=obj.parseFloat(); retur n obj; } 22. 23. 24. class TaskManager 25. { 26. private: 27. int ticks; 28. 29. unsigned long Timeout[MAX_TASKS][2] = {0}; 30. void (*Tasks[MAX_TASKS])() = {0}; 31. 32. public: 33. int tick() 34. { 35. unsigned long time_now = millis(); 36. 37. for(int i = 0; i < MAX_TASKS; i++) 38. { 39. if(Tasks[i] != 0 && time_now >= Timeout[i][1]) 40. { 41. Timeout[i][1] = time_now + Timeout[i][0]; 42. (*Tasks[i])(); 43. } 44. 45. } 46. } 47. 48. bool AddTask(void (*fun)(), unsigned long timeout ) 49. { 50. int available = -1; 51.
52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115.
for(int i = 0; i < MAX_TASKS; i++) { if(Tasks[i] == fun) { return false; } else { if(Tasks[i] == 0 && available == -1) available = i; } } if(available != -1 && timeout != 0) { Tasks[available]=fun; Timeout[available][0] = timeout; Timeout[available][1] = millis() + timeout; return true; } return false; } bool RemoveTask(void (*fun)()) { for(int i = 0; i < MAX_TASKS; i++) { if(Tasks[i] == fun) { Tasks[i] = 0; return true; } } return false; } bool ChangeTimeout(void (*fun)(), unsigned long timeout) { for(int i = 0; i < MAX_TASKS; i++) { if(Tasks[i] == fun) { Timeout[i][0] = timeout; Timeout[i][1] = millis() + timeout; return true; } } return false; } };
uint8_t Buffer[BYTE_ARR_SIZE]; int buff_it; TaskManager manager; bool sonic_cmd = false;
116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170.
void setup() { Serial.begin(SERIAL_BITS_NUM); Wire.begin(); manager.AddTask(WaitCmd, TIMEOUT); manager.AddTask(RequestData, TIMEOUT); } void WaitCmd() { if (!Serial.available()) return; String cmd; Serial >> cmd; if(cmd.equals(SONIC_STATUS_CMD)) { sonic_cmd = true; } else { Serial