Advertisement
Guest User

Untitled

a guest
Nov 15th, 2016
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.13 KB | None | 0 0
  1. #include <Ultrasonic.h> //Biblioteca para a utilização do sensor
  2.  
  3. //Biblioteca necessárias para o uso do Ethernet Shield
  4. #include <SPI.h>
  5. #include <Ethernet.h>
  6.  
  7. //Biblioteca necessárias para a comunicação modbus
  8. #include <Mudbus.h>
  9. #include <Modbus.h>
  10.  
  11. Mudbus Mb;
  12.  
  13. int alar, bomb, selecao, conta, botAL, BOMBA1LIGADA, BOMBA2LIGADA, BDOSADORA, POCO, Pagua, ALARME, botEmer, estadoNivel, selecao1, selecao2, PRESSAO, PRESSAOATUAL, NivelAl;
  14. unsigned long TEMPOATUAL, TVERIFICACAO;
  15. float NI1, NIVELATUAL;
  16.  
  17. int contp=0;
  18. long TPEDEAGUA = 0;
  19. int butal=0;
  20. int butem=0;
  21.  
  22. //Define os pinos para o trigger e echo
  23. #define pino_trigger 5
  24. #define pino_echo 6
  25.  
  26. //Inicializa o sensor nos pinos definidos acima
  27. Ultrasonic ultrasonic(pino_trigger, pino_echo);
  28.  
  29. void setup() {
  30.  
  31. //Configurações de endereços de rede do Ethernet Shield.
  32. uint8_t mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x51, 0x33 };
  33. uint8_t ip[] = { 192, 168, 0, 15 };
  34. uint8_t gateway[] = { 192, 168, 0, 1 };
  35. uint8_t subnet[] = { 255, 255, 255, 0 };
  36. Ethernet.begin(mac, ip, gateway, subnet);
  37. //Os pinos 4,10,11,12,13 são utilizados pelo Ethernet Shield.
  38.  
  39. delay(5000);
  40. Serial.begin(9600);
  41.  
  42. //Definição dos pinos do Arduino.
  43. POCO = 2;
  44. BOMBA1LIGADA = 8;
  45. BOMBA2LIGADA = 9;
  46. BDOSADORA = 3;
  47. ALARME = 7;
  48.  
  49. PRESSAO = A2;
  50. botAL = A0;
  51. botEmer = A1;
  52.  
  53. pinMode(PRESSAO, INPUT);
  54. pinMode(botAL, INPUT_PULLUP);
  55. pinMode(botEmer, INPUT_PULLUP);
  56.  
  57. pinMode(ALARME, OUTPUT);
  58. pinMode(BDOSADORA, OUTPUT);
  59. pinMode(POCO, OUTPUT);
  60. pinMode(BOMBA1LIGADA, OUTPUT);
  61. pinMode(BOMBA2LIGADA, OUTPUT);
  62.  
  63. digitalWrite(POCO,HIGH); //desliga a bomba do poço
  64. digitalWrite(BDOSADORA,HIGH); //desliga a bomba dosadora
  65. digitalWrite(BOMBA1LIGADA,HIGH); //desliga a bomba de pressão 1
  66. digitalWrite(BOMBA2LIGADA,HIGH); //desliga a bomba de pressão 2
  67. digitalWrite(ALARME, HIGH);
  68.  
  69. //Atribuindo valor a variáveis.
  70. conta = 0;
  71. bomb = 0;
  72. selecao = 0;
  73. NIVELATUAL = 0;
  74. estadoNivel = 0;
  75. NI1 = 100;
  76. alar = 0;
  77. selecao1 = 0;
  78. selecao2 = 1;
  79. }
  80.  
  81. //=====================================================================================================================================================
  82. void loop() {
  83.  
  84. Mb.Run(); //Inicializa a comunicação modbus
  85.  
  86. butal = digitalRead(botAL); //Leitura do Botão de Alarme
  87. butem = digitalRead(botEmer); //Leitura do Botão de Emergência
  88.  
  89. if (butal == LOW){
  90. //verifica o estado do botão de alarme
  91. digitalWrite(ALARME, HIGH);
  92. conta =0;
  93. contp = 0;
  94. alar=0;
  95. }
  96.  
  97. if (butem == HIGH){
  98. //Verifica o estado do botão de emergência.
  99. digitalWrite(POCO,HIGH); //desliga a bomba do poço (OBS: Modulo relé acionado em nível logico baixo - LOW)
  100. digitalWrite(BDOSADORA,HIGH); //desliga a bomba dosadora
  101. digitalWrite(BOMBA1LIGADA,HIGH); //desliga a bomba de pressão 1
  102. digitalWrite(BOMBA2LIGADA,HIGH); //desliga a bomba de pressão 2
  103. }
  104.  
  105. //Leitura e conversão do valor do nível
  106. NIVELATUAL = 0;
  107. float cmMsec;
  108. long microsec = ultrasonic.timing(); //recebe o valor do tempo entre a emissão e a recepção do sinal
  109. cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM); //converte o valor obtido para centímetros
  110. delay(500);
  111. NIVELATUAL = (50 - (cmMsec - 60))/50; //cálculo do nível do reservatório
  112. NIVELATUAL = NIVELATUAL *100;
  113. delay(500);
  114. if (NIVELATUAL > (NI1 + 8)){ //Etapa criada para diminuir a grande variação do sensor
  115. NIVELATUAL = NI1;
  116. }
  117.  
  118. else{
  119. NI1 = NIVELATUAL;
  120. }
  121.  
  122. if ((conta == 0)) {
  123. if ((butem == LOW)) {
  124. // BOMBA 1 LIGADA
  125. if ((selecao == 0) && (NIVELATUAL > 20)){
  126. digitalWrite(BOMBA2LIGADA,HIGH); //Desliga a Bomba de pressão 2
  127. digitalWrite(BOMBA1LIGADA,LOW); //Liga a Bomba de pressão 1
  128. }
  129.  
  130. // BOMBA 2 LIGADA
  131. if ((selecao == 1) && (NIVELATUAL > 20)){
  132. digitalWrite(BOMBA1LIGADA,HIGH); //Desliga a Bomba de pressão1
  133. digitalWrite(BOMBA2LIGADA,LOW); //Liga a Bomba de pressão 2
  134. }
  135.  
  136. if (NIVELATUAL <= 15){
  137. digitalWrite(BOMBA1LIGADA,HIGH); //Desliga a Bomba de pressão1
  138. digitalWrite(BOMBA2LIGADA,HIGH); //Liga a Bomba de pressão 2
  139. }
  140.  
  141. switch(estadoNivel) { //Controle On-off bomba do poço.
  142. case 0:
  143. if(NIVELATUAL <= 15) {
  144. digitalWrite(POCO,LOW); //liga a bomba do poço
  145. digitalWrite(BDOSADORA,LOW); //liga a bomba dosadora
  146. Pagua = 1; //retorna o valor 1
  147. estadoNivel = 1;
  148. }
  149. else
  150. digitalWrite(POCO,HIGH); //desliga a bomba do poço
  151. digitalWrite(BDOSADORA,HIGH); //desliga a bomba dosadora
  152. Pagua = 0;
  153. break;
  154.  
  155. case 1:
  156. if(NIVELATUAL >= 100) {
  157. digitalWrite(POCO,HIGH); //liga a bomba do poço
  158. digitalWrite(BDOSADORA,HIGH); //liga a bomba dosadora
  159. Pagua = 0; //retorna o valor 1
  160. estadoNivel = 0;
  161. }
  162. else
  163. digitalWrite(POCO,LOW); //desliga a bomba do poço
  164. digitalWrite(BDOSADORA,LOW); //desliga a bomba dosadora
  165. Pagua = 1;
  166. break;
  167.  
  168. }
  169.  
  170. TEMPOATUAL = millis(); //recebe o tempo atual desde o início da execução do arduino
  171. TVERIFICACAO = 15000; //tempo de espera até a verificação
  172.  
  173. // VERIFICA SE A BOMBA DO POÇO ESTA LIGADA
  174. if (Pagua == 1){
  175. if (contp==0){
  176. TPEDEAGUA = millis();
  177. contp=1;
  178. NivelAl = NIVELATUAL;
  179. }
  180.  
  181. // CONTA O TEMPO E VERIFICA SE O NÍVEL AINDA ESTÁ IGUAL OU DIMINUINDO
  182. if ((TEMPOATUAL - TPEDEAGUA > TVERIFICACAO) && (NivelAl >= NIVELATUAL)){
  183. alar = 1;
  184. }
  185. }
  186.  
  187. if (Pagua == 0){
  188. contp = 0;
  189. }
  190. }
  191. }
  192.  
  193. PRESSAOATUAL = analogRead(PRESSAO); //Faz a leitura da entrada analógica
  194. PRESSAOATUAL = map(PRESSAOATUAL,0,1023,0,30); //converte o valor
  195. if (PRESSAOATUAL <= 10) {
  196. alar = 1;
  197. }
  198.  
  199. if (alar ==1){ //Etapa do alarme
  200. digitalWrite(ALARME, LOW); //Liga o Alarme
  201. digitalWrite(POCO,HIGH); //desliga a bomba do poço
  202. digitalWrite(BDOSADORA,HIGH); //desliga a bomba dosadora
  203. digitalWrite(BOMBA1LIGADA,HIGH); //desliga a bomba de pressão 1
  204. digitalWrite(BOMBA2LIGADA,HIGH); //desliga a bomba de pressão 2
  205. conta = 1;
  206. }
  207.  
  208. bomb = bomb +1; //Etapa de troca de bombas booster, como o loop tem em torno de 1.5 segundos devido aos delays a cada 30s as bombas se alternam
  209. if (bomb >= 20){
  210. if ((selecao1 == 1) && (selecao2 == 0)) {
  211. selecao1 = 0;
  212. selecao2 = 1;
  213. selecao = 0;
  214. bomb = 0;
  215. }
  216. }
  217. if (bomb >= 20){
  218. if ((selecao1 == 0) && (selecao2 == 1)) {
  219. selecao1 = 1;
  220. selecao2 = 0;
  221. selecao = 1;
  222. bomb = 0;
  223. }
  224. }
  225. delay(500);
  226.  
  227. //ATUALIZA VARIAVEIS MODBUS
  228. Mb.R[10] = NIVELATUAL;
  229. Mb.R[13] = PRESSAOATUAL;
  230. Mb.C[14] = digitalRead(ALARME);
  231. Mb.C[15] = digitalRead(botEmer);
  232. Mb.C[16] = digitalRead(BOMBA1LIGADA);
  233. Mb.C[17] = digitalRead(BOMBA2LIGADA);
  234. Mb.C[18] = digitalRead(BDOSADORA);
  235. Mb.C[19] = digitalRead(POCO);
  236. }
  237. //=================================================================================================================================================
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement