terça-feira, 3 de junho de 2025

Exemplo de código com comunicação serial para placa BluePill (STM32F103C6T6) no Arduino. (método polling)

 // Código Exemplo para Comunicação Serial com STM32F1 (ex: Blue Pill) usando Arduino IDE

// Autor: Aguivone M.Fogia
// Data: 03/06/2025
// Descrição: Demonstrar envio e recebimento de dados via porta serial (USART1), lendo um botao e acionando led.
//    modo polling

/*
  material necessario
  1. Placa STM32F103C8T6 ou C6T6 (Blue Pill ou similar).
  2. Programador ST-Link V2 ou conversor USB-Serial (para upload e/ou comunicação).
  3. Core STM32 para Arduino IDE instalado (veja instruções no exemplo blink anterior).
  4. Configuração da Placa no Arduino IDE:
     - Ferramentas > Placa: "Generic STM32F103C series" ou similar.
     - Ferramentas > Variant: "STM32F103C6T6"
     - Ferramentas > Upload method: "STLink" ou "Serial".
     - Ferramentas > Porta: Selecione a porta COM correspondente ao seu conversor USB-Serial ou ST-Link (se aplicável para comunicação).

  --- Conexão Física (para USART1) ---
  - Conecte o pino PA9 (TX1) do STM32 ao pino RX do seu conversor USB-Serial.
  - Conecte o pino PA10 (RX1) do STM32 ao pino TX do seu conversor USB-Serial.
  - Conecte o GND do STM32 ao GND do conversor USB-Serial.
  - Alimente a placa STM32 (via ST-Link, USB ou fonte externa).

  --- Nota sobre Portas Seriais ---
  - O objeto `Serial` no core STM32 para Arduino geralmente se refere à USART1 (pinos PA9/PA10).
  - Algumas configurações de placa/core podem mapear `Serial` para a porta USB CDC (Comunicação via cabo USB direto, se a placa tiver bootloader compatível ou hardware USB nativo configurado).
  - Se você precisar usar outras portas seriais (USART2, USART3), use os objetos `Serial1`, `Serial2`, `Serial3`, etc., e conecte aos pinos correspondentes (verifique o pinout da sua placa e a documentação do core).
    - Serial1: PA9 (TX), PA10 (RX)
    - Serial2: PA2 (TX), PA3 (RX)
    - Serial3: PB10 (TX), PB11 (RX)
*/

// --- Configurações ---
  #define LED    PC13
  #define BOTAO  PA7
  long           baudRate = 9600; // Taxa de comunicação serial (bits por segundo)
  // --- Variáveis Globais ---
  String         pacote = ""; // String para armazenar dados recebidos
  unsigned long  tempo_atual;
  unsigned long  tempo_anterior;
  unsigned long  tempo_led = 100;
  int           comando_botao=0;
 
// --- Função Setup: Executada uma vez ---
void setup()
{
  // Inicializa a comunicação serial (USART1 por padrão)
  Serial.begin(baudRate);
  pinMode(LED, OUTPUT); //LED
  pinMode(BOTAO, INPUT);
  // Espera um pouco para a porta serial estabilizar (opcional, mas útil)
  delay(100);
  Serial.println("Comunicação serial com STM32F103C6T6 \n\r");
  Serial.print("Usando botão pra mudar velocidade do led ou a serial\n\r");
}

// --- Função Loop: Executada repetidamente ---
void loop()
{
  // --- Leitura de Dados da Serial ---
  if (Serial.available() > 0) { // Verifica se há dados chegando
    char caracter = Serial.read(); // Lê um caractere
       if(caracter == 'A')//vel1
       {
          Serial.println("velocidade 1 = 100 \n\r");
          tempo_led = 100;
          comando_botao = 0;
          delay(100);//debounce para botao
       }
       if(caracter == 'B')//vel2
       {
          Serial.println("velocidade 2 = 500 \n\r");
          tempo_led = 500;
          comando_botao = 1;
          delay(100);//debounce para botao
       }
       if(caracter == 'C')//vel3
       {
          Serial.println("velocidade 3 = 1000 \n\r");
          tempo_led = 1000;
          comando_botao = 2;
          delay(100);//debounce para botao
       }
     
  }
  else
  {
    if(digitalRead(BOTAO)== 1)
    {
        comando_botao++;
        if(comando_botao > 2)
        {
            comando_botao = 0;
        }
        if(comando_botao == 0)//vel1
       {
          Serial.println("velocidade 1 = 100 \n\r");
          tempo_led = 100;
       }
       if(comando_botao == 1)//vel2
       {
          Serial.println("velocidade 2 = 500 \n\r");
          tempo_led = 500;
       }
       if(comando_botao == 2)//vel3
       {
          Serial.println("velocidade 3 = 1000 \n\r");
          tempo_led = 1000;
       }
       delay(500);//debounce para botao
    }

    tempo_atual = millis();
    if(tempo_atual - tempo_anterior >= tempo_led)
        {
          digitalWrite(LED, !digitalRead(LED));
          tempo_anterior = tempo_atual;
        }
  }

}

Nenhum comentário :

Postar um comentário

olá,digite aqui seu comentário!