Advertisement
programlogicpro

Protocol RS485 Arduino Slave

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