Advertisement
programlogicpro

Protocol RS485 Arduino Master

Nov 17th, 2022
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Arduino 6.77 KB | Software | 0 0
  1. #include <SoftwareSerial.h>
  2.  
  3. const byte rxPin = 8;
  4. const byte txPin = 9;
  5. const int EnTxPin =  2; // HIGH:TX y LOW:RX
  6. // Configurem un nou objecte Softserial
  7. SoftwareSerial rs485 (rxPin, txPin);
  8.  
  9. int red = 0, green = 0, blue = 0;
  10.  
  11. //Pins ID
  12. int redPin = 6; //Dada a llegir
  13. int greenPin = 5;
  14. int bluePin = 3;
  15. //Variables Globals
  16. char Paquet[18];
  17. String Trama_Sencera;
  18. String ID_Desti;
  19. String ID_Font;
  20. String Funcio;
  21. String FuncioRGB;
  22. String FuncioDelay;
  23. String temps_delay;
  24. String iteracions;
  25. String Red;
  26. String Green;
  27. String Blue;
  28.  
  29. String Dades;
  30. bool funcio = false;
  31.  
  32. /***************Configuració Inicial**************/
  33.  
  34.  
  35. void setup() {
  36.  
  37.   //Configurem IO
  38.   pinMode(redPin, OUTPUT); //definir pin sortida
  39.   pinMode(greenPin, OUTPUT); //definir pin sortida
  40.   pinMode(bluePin, OUTPUT); //definir pin sortida
  41.  
  42.   // Definim els modes de funcionament per TX i RX
  43.   pinMode(rxPin, INPUT);
  44.   pinMode(txPin, OUTPUT);
  45.   pinMode(EnTxPin, OUTPUT);
  46.  
  47.   // Configura la velocitat del nou objecte Softserial
  48.   rs485.begin(9600);
  49.   rs485.setTimeout(100); //Establim un temps d'espera de 100 ms
  50.   //Configura veloctiat del port serie
  51.   Serial.begin(9600);
  52.  
  53.   digitalWrite(EnTxPin, LOW); //RS485 com a mestre, però per defecte posem com a escolta
  54. }
  55.  
  56. /******** LECTURA PORT SERIE + VALIDAR MIDA DEL PAQUET *********/
  57.  
  58. int LecturaPort()
  59. {
  60.   int num_caracter;
  61.   if (Serial.available() > 0)
  62.   {
  63.     while (Serial.available() > 0)
  64.     {
  65.       char caracter = Serial.read();
  66.       if (caracter == '[')
  67.       {
  68.         // iniciem el recompte de bit
  69.         num_caracter = 0;
  70.       }
  71.       else if (caracter == ']')
  72.       {
  73.         // Recompte de caracters
  74.         if (num_caracter == 18)
  75.         {
  76.           return 1; //Paquet correcte
  77.         }
  78.         else
  79.         {
  80.           return 2; //Paquet incorrecte
  81.         }
  82.       }
  83.       else
  84.       {
  85.         Paquet [num_caracter] = caracter; //Guardem caracters dins de l'array Paquet
  86.         num_caracter++; //Incrementeme la posició de l'array
  87.  
  88.       }
  89.     }
  90.   }
  91.   else
  92.   {
  93.     return 0;
  94.   }
  95. }
  96.  
  97. /******** LECTURA RS-485 + VALIDAR MIDA DEL PAQUET *********/
  98.  
  99. int LecturaPort_rs485()
  100. {
  101.   int num_caracter;
  102.   if (rs485.available() > 0)
  103.   {
  104.     while (rs485.available() > 0)
  105.     {
  106.       char caracter = rs485.read();
  107.       if (caracter == '[')
  108.       {
  109.         // iniciem el recompte de bit
  110.         num_caracter = 0;
  111.       }
  112.       else if (caracter == ']')
  113.       {
  114.         // Recompte de caracters
  115.         if (num_caracter == 18)
  116.         {
  117.           return 1; //Paquet correcte
  118.         }
  119.         else
  120.         {
  121.           return 2; //Paquet incorrecte
  122.         }
  123.       }
  124.       else
  125.       {
  126.         Paquet [num_caracter] = caracter; //Guardem caracters disn l'array Paquet
  127.         num_caracter++; //Incrementeme la posició de l'array
  128.  
  129.       }
  130.     }
  131.   }
  132.   else
  133.   {
  134.     return 0;
  135.   }
  136. }
  137.  
  138. /******** FUNCIÓ SI EL PAQUET REBUT ES PER MI *********/
  139.  
  140. void comprova_funcio(String temps_delay, String iteracions, int Estat_Paquet, String red, String green, String blue  ) {
  141.  
  142.   int temps = String(temps_delay).toInt();
  143.   int f = String(iteracions).toInt();
  144.   int delay_t = temps * 100;
  145.  
  146.   int vermell = String(red).toInt();
  147.   int verd = String(green).toInt();
  148.   int blau = String(blue).toInt();
  149.  
  150.   if (Funcio == "1") {
  151.  
  152.     analogWrite(redPin, vermell);
  153.     analogWrite(greenPin, verd);
  154.     analogWrite(bluePin, blau);
  155.  
  156.   } else if (Funcio == "2") {
  157.  
  158.     analogWrite(redPin, vermell);
  159.     analogWrite(greenPin, verd);
  160.     analogWrite(bluePin, blau);
  161.  
  162.   } else if (Funcio == "3") {
  163.  
  164.     for (int i = 0; i <= f; i++) {
  165.  
  166.       analogWrite(redPin, vermell);
  167.       analogWrite(greenPin, verd);
  168.       analogWrite(bluePin, blau);
  169.       delay(delay_t);
  170.       analogWrite(redPin, 0);
  171.       analogWrite(greenPin, 0);
  172.       analogWrite(bluePin, 0);
  173.       delay(delay_t);
  174.  
  175.     }
  176.  
  177.     f = 0;
  178.     Funcio = "0";
  179.     //Reinicialitzar Variables
  180.     ID_Desti = "";
  181.     ID_Font = "";
  182.     Trama_Sencera = "";
  183.     Estat_Paquet = 0;
  184.     Serial.flush();
  185.  
  186.  
  187.   } else if (Funcio == "0") {
  188.  
  189.     analogWrite(redPin, 0);
  190.     analogWrite(greenPin, 0);
  191.     analogWrite(bluePin, 0);
  192.     Serial.flush();
  193.  
  194.  
  195.   } else {
  196.  
  197.     Serial.println("FUNCIÓ NO RECONEGUDA");
  198.   }
  199.   Estat_Paquet = 0;
  200.  
  201. }
  202.  
  203. /**************Programa Principal***************/
  204.  
  205.  
  206. void loop() {
  207.   // put your main code here, to run repeatedly:
  208.   // LECTURA POR SERIE
  209.   int Estat_Paquet = LecturaPort();
  210.   int Estat_Paquet2 = LecturaPort_rs485();
  211.   if (Estat_Paquet == 1 || Estat_Paquet2 == 1)
  212.   {
  213.     //Reinicialitzar Variables
  214.     ID_Desti = "";
  215.     ID_Font = "";
  216.     Trama_Sencera = "";
  217.  
  218.     Estat_Paquet = 0;
  219.     //Passar array a string
  220.     for (int i = 0; i <= 17; i++)
  221.     {
  222.       Trama_Sencera = Trama_Sencera + Paquet[i];
  223.     }
  224.     Serial.println("S ha rebut la trama correctament, longitud -> " + Trama_Sencera.length());
  225.  
  226.     Serial.println("ID Destí -> " + Trama_Sencera.substring(0, 2)); ID_Desti = Trama_Sencera.substring(0, 2);
  227.     Serial.println("ID Font -> " + Trama_Sencera.substring(2, 4)); ID_Font = Trama_Sencera.substring(2, 4);
  228.     Serial.println("ID Funció -> " + Trama_Sencera.substring(4, 5)); Funcio = Trama_Sencera.substring(4, 5);
  229.     Serial.println("ID Dades -> " + Trama_Sencera.substring(5, 18)); Dades = Trama_Sencera.substring(5, 18);
  230.  
  231.     FuncioRGB = Dades.substring(0, 9);
  232.     FuncioDelay = Dades.substring(9, 13);
  233.  
  234.  
  235.     temps_delay = FuncioDelay.substring(0, 2);
  236.     iteracions = FuncioDelay.substring(2, 4);
  237.  
  238.     Red = FuncioRGB.substring(0, 3);
  239.     Green = FuncioRGB.substring(3, 5);
  240.     Blue = FuncioRGB.substring(5, 8);
  241.  
  242.  
  243.  
  244.     /**************COMPROVA PER QUI ÉS EL PAQUET REBUT ***************/
  245.  
  246.     if (ID_Desti == "10") {
  247.  
  248.       comprova_funcio(temps_delay, iteracions, Estat_Paquet, Red, Green, Blue);
  249.  
  250.     } else {
  251.  
  252.       digitalWrite(EnTxPin, HIGH); //RS485 com a mestre
  253.       rs485.print("["+Trama_Sencera+"]");
  254.       delay(500);
  255.       digitalWrite(EnTxPin, LOW); // Torna a posar en escolta
  256.       //rs485.flush();
  257.       //Serial.flush();
  258.      
  259.     }
  260.    
  261.  
  262.     Estat_Paquet = 0;
  263.     Estat_Paquet2 = 0;
  264.   }
  265.   else if (Estat_Paquet > 1 || Estat_Paquet2 > 1)
  266.   {
  267.     Serial.println("Paquet erroni");
  268.     Estat_Paquet = 0;
  269.     Estat_Paquet2 = 0;
  270.   }
  271. }
  272.  
  273. /*
  274.   while(Serial.available() > 0){
  275.  
  276.  
  277.   // BUSCA LA SEGÜENT CADENA DE NÚMEROS ENTERS VÀLIDS I ASSIGNA EL VALOR CONVERTIT A ENTER A LA VARIABLE CORRESPONENT AL COLOR
  278.   red = Serial.parseInt();
  279.   // TORNA A BUSCAR
  280.   green = Serial.parseInt();
  281.   // TORNA A BUSCAR
  282.   blue = Serial.parseInt();
  283.  
  284.   // IMPRIMIM PER PANTALLA ELS VALORS
  285.   Serial.println(red);
  286.   Serial.println(green);
  287.   Serial.println(blue);
  288.  
  289.   analogWrite(redPin,red);
  290.   analogWrite(greenPin,green);
  291.   analogWrite(bluePin,blue);
  292.  
  293.  
  294.   }
  295. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement