Loop al recibir valor

Buenas tardes,
Estoy empezando a realizar proyectos con arduino y me he encontrado con mi primer problema.
Necesito que el programa realice un bucle u otro en función del valor de la variable que reciba.
Es para activar o desactivar un buzzer.
El sonido constante activado y desactivado ya he conseguido hacer que funcione al introducir un 0 o un 1, pero los ciclos while para las opciones A y B no soy capaz de hacerlos funcionar.
Adjunto el código que hasta el momento he realizado.
Espero me puedan aportar algo de luz.
Muchas gracias!!

#include <pt.h>
#include <EEPROM.h>


byte pinAlarma1 = 3;
byte pinAlarma2 = 4;
byte pinAlarma3 = 5;
byte pinBuzzer = 6;

byte pinEstadoOK = 12;
byte pinEstadoParado = 11;

byte pinPulsador1 = 7;
byte pinPulsador2 = 8;
byte pinPulsador3 = 9;

int eeAddressEstadoSistema = 0;
int eeAddressEntradaPython = 1;
int eeAddressBuzzer = 2;

char valorRecibidoBuzzer;
char valorActualizadoBuzzer;


void setup() {
  Serial.begin(9600);
  pinMode(pinBuzzer, OUTPUT);
}

void loop() {
  if (Serial.available()>0) {
      valorRecibidoBuzzer = Serial.read();
      if ((valorRecibidoBuzzer) == '0') {
        digitalWrite(pinBuzzer, LOW);
        Serial.println (valorRecibidoBuzzer);
      }
      if ((valorRecibidoBuzzer) == '1') {
        digitalWrite(pinBuzzer, HIGH);
        Serial.println (valorRecibidoBuzzer);
      }
      if ((valorRecibidoBuzzer) == 'A') {
        while ((valorRecibidoBuzzer) == 'A') {
          digitalWrite(pinBuzzer, HIGH);
          delay(500);
          digitalWrite(pinBuzzer, LOW);
          delay(500);
          Serial.println (valorRecibidoBuzzer);
          if (Serial.available()>0) {
            valorRecibidoBuzzer = Serial.read();
          }
        }
      }
      if ((valorRecibidoBuzzer) == 'B') {
        while ((valorRecibidoBuzzer) == 'B') {
          digitalWrite(pinBuzzer, HIGH);
          delay(1000);
          digitalWrite(pinBuzzer, LOW);
          delay(1000);
          Serial.println (valorRecibidoBuzzer);
          if (Serial.available()>0) {
            valorRecibidoBuzzer = Serial.read();
          }
        }
      }
   }
}

Buenas noches,
debe manejar las entradas de forma asincrónica y sin demora ()
Una máquina de estados puede ser útil

--> programa escrito directamente aquí, así que compruebe

enum : byte {WAITING, VALOR_A, VALOR_B} state = WAITING;
const byte pinBuzzer = 6;

void buzz(unsigned long halfPeriod) {
  static unsigned long lastBuzz;
  if (millis() - lastBuzz >= halfPeriod) {
    if (digitalRead(pinBuzzer) == HIGH) digitalWrite(pinBuzzer, LOW);
    else digitalWrite(pinBuzzer, HIGH);
    lastBuzz = millis();
  }
}

void manageCommands() {
  if (Serial.available() == 0) return;
  switch (Serial.read()) {
    case '0': digitalWrite(pinBuzzer, LOW);  state = WAITING; break;
    case '1': digitalWrite(pinBuzzer, HIGH); state = WAITING; break;
    case 'A': state = VALOR_A; break;
    case 'B': state = VALOR_B; break;
    default: break;
  }
}

void manageState() {
  switch (state) {
    case VALOR_A: buzz(500);  break;
    case VALOR_B:  buzz(1000); break;
    default: break;
  }
}

void setup() {
  Serial.begin(9600);
  pinMode(pinBuzzer, OUTPUT);
}

void loop() {
  manageCommands();
  manageState();
}

Muchas gracias Jackson,
Me fue de gran utilidad tu ayuda.
Quiero dar un paso más en mi programa, y quiero además de recibir una variable (desde python) y que el buzzer se active, que pueda enviar a python informacion del estado de un pulsador, para que en una interface grafica se muestre el estado del pulsador (activado o desactivado).
He conseguido realizar las acciones de forma independiente, es decir, o envio desde python a arduino, o lo hago desde arduino a python, pero no consigo hacer que se puedan enviar los datos en ambas direcciones.
Necesitaria un poco de luz en este aspecto.
Muchas gracias por vuestro tiempo!!

Lo que @J-M-L te sugirió te permite enviar comandos de Python al arduino.
Para enviar de Arduino a Python solo usa

Serial.print(comando);

y tu crea la serie de comandos.

Buenas tardes una vez más!!
Con la ayuda que me habéis facilitado, he conseguido enviar datos de python a arduino y viceversa, pero con programas de python que realizan una cosa o la otra..
Ahora necesito implementar en python, tanto la lectura como el envio de informacion a arduino.
Para realizar esto, tengo que recurrir a los hilos.
El hilo principal de python se encarga de enviar los valores a arduino cuando es necesario, y un segundo hilo se encarga (en un bucle while) de estar permanentemente a la escucha de los valores que pueda recibir de arduino. Pues esta es la teoría perfecta.. y al arrancar el programa de python funciona correctamente (ya que solo esta a la escucha), pero en el momento que envío algún dato a arduino me dice que el puerto esta en uso y se detiene la ejecución del programa..
No sé si mi planteamiento es correcto o deba de realizarse de otro modo.. pero me veo sin salida y es el último paso de mi proyecto.
A ver si alguien me puede arrojar algo de luz a cerca de cómo solventar este problema en python y del mismo modo también me indica los pasos a seguir en el arduino.. porque le ocurre lo mismo..
Muchas gracias por vuestra ayuda y un saludo familia!!

Pero este es un foro de Arduino no de Python.

Buenas tardes!!
Al volver a leer el mensaje que escribí la semana pasada, es cierto que no me expliqué con demasiada claridad.. lo que necesito es ayuda para realizar la implementación de las lecturas y escrituras simultáneas en Arduino.
Los problemas con Python ya los corregiré de algún modo, aunque si alguien me da alguna directriz a seguir tampoco me va a venir mal.. jejejje..
Disculpad por mi falta de experiencia en este foro y mezclar los conceptos.
Muchas gracias de nuevo por vuestra atención.

Si vas a comunicarlos por puerto serie, con Serial.print() o Serial.write() (según quieras trabajar con los datos como texto o directamente bytes) envías los datos al PC. Con Serial.read() lees los datos que llegan del PC.
Hay miles de tutoriales en internet sobre puerto serie que te van a servir de ayuda.

Saludos

Es eso lo que pretendo conseguir, pero en el momento en que inicializo el puerto serie del arduino con Serial.begin(nº puerto), sólo me permite enviar datos del arduino al PC, pero no recibir datos del PC, ya que cuando lo intento me aparece un error en el que se me informa de que el puerto de comunicación (que es el mismo) está en uso..
Este es mi problema.. que necesito enviar datos del Arduino al PC y del PC al arduino.
A ver si con esta explicación alguien puede echarme una mano.
Gracias!!

Pero eso es un tema de manejo del puerto por Python, no un problema de Arduino, como ya te lo dijo @Surbyte

Tenés que ver si no estás cometiendo un error o te falta hacer algo en el código de Python.

Saludos

Pones en Google : Python recibir datos desde arduino y seguramente encontrarás la solucion. Debe haber muchos tutoriales al respecto.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.