Остановка программы при определенных условиях

Я приветствую вас сегодня с программным вопросом для моего проекта, в котором свет используется как вход для сервопривода на стене. В комнату будет поступать свет и тень будет опускаться, а при отсутствии света тень будет отступать. Я хотел бы сделать два условия в цикле void в коде arduino применимыми только один раз, если условие не изменится. Говоря это, я имею в виду, что я хочу, чтобы этот цикл пустоты работал постоянно, в котором у меня есть два условия. И если одно и то же условие выполняется два раза подряд (т. е. показания датчика между 800 и 10000, например, 5000, а затем 6032), ничего не запустится. Если выполняется одно условие, а затем выполняется другое, это нормально. Вот мой код и любая помощь в отношении того, какие справочные команды я должен использовать или мой следующий план действий, будет принята с благодарностью.

// Reports the frequency from the TSL230, higher number means brighter
// Part: http://www.sparkfun.com/products/8940
// Article:  http://bildr.org/2011/08/tsl230r-arduino/ 

#include <Servo.h>
Servo myservo1;
int TSL230_Pin = 4; //TSL230 output
int TSL230_s0 = 3; //TSL230 sensitivity setting 1
int TSL230_s1 = 2; //TSL230 sensitivity setting 2

int TSL230_samples = 30; //higher = slower but more stable and accurate

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


void loop(){

  float lightLevel = readTSL230(TSL230_samples);
  Serial.println(lightLevel);

if(lightLevel>800 && lightLevel<1000)
  {
    myservo1.attach(5);
    myservo1.writeMicroseconds(1300);delay(1000);
    myservo1.writeMicroseconds(1500);delay(5000000);  

}

else if(lightLevel<800)
{
  myservo1.attach(5);
  myservo1.writeMicroseconds(1700);delay(5000);
  myservo1.writeMicroseconds(1500);delay(5000000);
}
}

void setupTSL230(){
  pinMode(TSL230_s0, OUTPUT); 
  pinMode(TSL230_s1, OUTPUT); 

  //configure sensitivity - Can set to
  //S1 LOW  | S0 HIGH: low
  //S1 HIGH | S0 LOW:  med
  //S1 HIGH | S0 HIGH: high

  digitalWrite(TSL230_s1, LOW);
  digitalWrite(TSL230_s0, HIGH);
}



float readTSL230(int samples){
//sample light, return reading in frequency
//higher number means brighter

  float start = micros();  
  int readings = 0;

  while(readings < samples){
   pulseIn(TSL230_Pin, HIGH);
   readings ++;
  }

  float length = micros() - start;
  float freq = (1000000 / (length / samples)) * 10;

  return freq;
}

person user3625133    schedule 11.05.2014    source источник
comment
В приведенном выше коде нет цикла (когда я пишу этот комментарий).   -  person Cheers and hth. - Alf    schedule 11.05.2014


Ответы (1)


Сначала добавьте это в свою настройку...

void setup(){
Serial.begin(9600);
setupTSL230();
pinMode(5,OUTPUT);
myservo1.attach(5);

}

Затем создайте новую переменную и добавьте ее в свои операторы if.

Boolean once; // declare this with your other int variables 
if(lightLevel > 800 && lightLevel < 1000 && once==True)
  {
    myservo1.writeMicroseconds(1300);delay(1000);
    myservo1.writeMicroseconds(1500);delay(1000);
    once = False;
  }
 else if(lightLevel<800 && once == False)
  {
    myservo1.writeMicroseconds(1700);delay(5000);
    myservo1.writeMicroseconds(1500);delay(1000);
    once = True;
   }
person Eugene    schedule 11.05.2014
comment
Могу ли я добавить один раз к своим предыдущим переменным int как логическое значение один раз = True и логическое значение один раз = False? Или я бы просто присвоил ему число в моих переменных int как boolean Once=6; - person user3625133; 11.05.2014
comment
Хорошо, я один раз поставил логическое значение как целое число, но теперь оно находится в нижнем условии, оно будет работать непрерывно, чего я не хочу. - person user3625133; 11.05.2014
comment
Нет, переменная когда-то имеет тип Boolean, а не целое число. Если вы хотите объявить его как целое число, вы можете просто заменить true и false любыми двумя числами, которые вы хотите. - person Eugene; 12.05.2014