Skocz do zawartości

Pomocna odpowiedź

Napisano

Szukałem, myślałem, ale nie znalazłem rozwiązania.

Mam do wykonania jakiś pomiar, uruchamiam go po otrzymaniu Serial Read- czyli np dokonywanie pomiaru w kółko co 1s, jak zrobić, aby program się zatrzymał po otrzymaniu innego serial read?

 

pseudokod




while(1)
{
 char c = serial.read(); // czy coś tam w arduino
 if( c == 'a')
  {
 	pomiar();   
  }
}  

 

Wtedy pomiar jest wykonywany tylko 1 raz po wpisaniu 'a'

while(1)
{

char c = Serial.read();
if(c == 'a')
  
{

  delay(1000); // To makeit light on 

 uint16_t r, g, b, c, colorTemp, lux;

  tcs.getRawData(&r, &g, &b, &c);
  // colorTemp = tcs.calculateColorTemperature(r, g, b);
  colorTemp = tcs.calculateColorTemperature_dn40(r, g, b, c);
  lux = tcs.calculateLux(r, g, b);

  Serial.print("Color Temp: "); Serial.print(colorTemp, DEC); Serial.print(" K - ");
  Serial.print("Lux: "); Serial.print(lux, DEC); Serial.print(" - ");
  Serial.print("R: "); Serial.print(r, DEC); Serial.print(" ");
  Serial.print("G: "); Serial.print(g, DEC); Serial.print(" ");
  Serial.print("B: "); Serial.print(b, DEC); Serial.print(" ");
  Serial.print("C: "); Serial.print(c, DEC); Serial.print(" ");
  Serial.println(" ");
  delay(500);

 }
}
}

 

Nie wiem czy o to chodziło, ale:

void loop() {
  static char c='x'; // static żeby pamiętać co było poprzednio
  if (Serial.available()) { // ktoś coś nacisnął
    c=Serial.read(); // ciekawe co nacisnął
    while (Serial.available()) Serial.read(); // czyścimy bufor serial
  }

// i dalej jak było

  if (c == 'a') { 

A twoje while(1) to po co? Przecież loop i tak się w kółko kręci...

  • Lubię! 1

albo z dodatkową flagą 

bool flaga_pomiar = false;

if(c == 'a') flaga_pomiar = true;
if(c == 'x') flaga_pomiar = false;
// i potem
if(flaga_pomiar == true)
{
  ....
  }

 

Jak zatrzymasz program, to już nic więcej nie zrobisz, zadziała tylko przycisk reset. Nawet jak program nie pokazuje żadnej aktywności, to dlatego, że pomija się wykonywanie rzeczy sygnalizujące jakąś aktywność - liczenie, czytanie czy miganie. 

Taki stan z while(1) nie różniłby się niczym od nieprzywidzianego zawieszenia się programu. Loop powinien wykonywać się wciąż i najszybciej jak to możliwe, więc po prostu pomiń wykonywanie pomiarów, gdy ich nie chcesz.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...