Выполнить некоторые команды только 1 раз.
- Войдите на сайт для отправки комментариев
Чт, 25/08/2016 - 07:15
Делаю тестер аккумуляторов.
Весь код выглядит вот так:
#include <LiquidCrystal.h> int sensorPin = 0; // к пину Analog IN 0 int sensor2Pin = 2; // к пину Analog IN 2 int ledPin = 13; // пин к затвору транзистора LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // initialize the library with the numbers of the interface pins int sensorValue = 0; // variable to store the value coming from the sensor int sensor2Value = 0; // variable to store the value coming from the sensor float LiMinThreshold = 2700; // Lithium Minimal Voltage for load removal float LiMaxThreshold = 4200; // Lithium Max Voltage for load removal float NmhMinThreshold = 950; // NMH Minimal Voltage for load removal float NmhMaxThreshold = 1600; // NMH Max Voltage for load removal float SelectedMinThreshold = 5000; float current; int i; int BatVoltage = 5000; int FetVoltage = 5000; long TotalCurrent = 0; boolean done = false; unsigned long PrevMillis ; unsigned long MillisPassed ; void CL2(){ lcd.setCursor(0, 1);// Second line first char lcd.print(" "); lcd.setCursor(0, 1);// Second line first char } void CL1(){ lcd.setCursor(0, 0);// First line first char lcd.print(" "); lcd.setCursor(0, 0);// First line first char } void setup() { pinMode(ledPin, OUTPUT);//activation led and enable for FET lcd.begin(16, 2);// set up the LCD's number of rows and columns: lcd.print(" HELLO "); // Print a message to the LCD. lcd.setCursor(0, 1);// Second line first char lcd.print("Detecting Bat"); // print voltage value delay(2000); lcd.setCursor(0, 1);// Second line first char lcd.print(" "); lcd.setCursor(0, 1);// Second line first char digitalWrite(ledPin, HIGH); // set the LED on sensorValue = analogRead(sensorPin); // read the value from the sensor: digitalWrite(ledPin, LOW); // set the LED off // Detecting battery type BatVoltage = sensorValue*4.887; if (BatVoltage > 4500){ lcd.print("Warning high-V! "); done = true;} else if (BatVoltage > LiMinThreshold){ lcd.print("Type:Li-Ion Bat "); SelectedMinThreshold = LiMinThreshold;} else if (BatVoltage > NmhMinThreshold){ lcd.print("Type:NiMH/Cd Bat "); SelectedMinThreshold = NmhMinThreshold;} else{ lcd.print("Unknown Bat V < 1"); done = true;} lcd.print("V="); lcd.print(sensorValue*4.887); // print voltage value delay(3000); CL2(); PrevMillis = millis(); } void loop() { int time = millis() / 1000; if (BatVoltage > SelectedMinThreshold && !done) { digitalWrite(ledPin, HIGH); // set the LED on sensorValue = analogRead(sensorPin); // read the value from the sensor: sensor2Value = analogRead(sensor2Pin); // read the value from the FET: FetVoltage = (sensor2Value*4.887); BatVoltage = (sensorValue*4.887); current = (BatVoltage/3.3); lcd.clear(); lcd.setCursor(0, 0);// First line first char TotalCurrent=TotalCurrent+MillisPassed/1000*(BatVoltage-FetVoltage)/3.3/3.6; lcd.print(" I="); lcd.print(TotalCurrent/1000); lcd.print("mAH"); lcd.setCursor(0, 1);// Second line first char lcd.print("V="); lcd.print(BatVoltage/1000.0); // print voltage value lcd.print("V "); lcd.print("A="); lcd.print(current/1000); lcd.print("A"); delay(1000); MillisPassed = millis()- PrevMillis; PrevMillis = millis(); } else { done=true; digitalWrite(ledPin, LOW); // set the LED off - stop loading CL2(); lcd.setCursor(4, 0); if (time / 60 / 60 < 10) { lcd.print ("0"); //часы } lcd.print (time / 60 / 60); lcd.print (":"); if (time / 60 % 60 < 10) { lcd.print ("0"); //минуты } lcd.print ((time / 60) % 60); lcd.print (":"); if (time%60<10) { lcd.print ("0"); }//секунды lcd.print (time%60); sensorValue = analogRead(sensorPin); // read the value from the sensor: BatVoltage = (sensorValue*4.887); lcd.setCursor(0, 1);// Second line first char lcd.print("V="); lcd.print(BatVoltage/1000.0); // print voltage value lcd.print("V "); lcd.print("I="); lcd.print(TotalCurrent/1000); lcd.print("mAH"); delay(1000); } }
Когда тест заканчивается, выполняется все, что под:
done = true;
С самого начала теста у меня идет отсчет времени и в конце должно отображаться время, затраченное на тест(грубо говоря на "void loop()").
Но у меня время тикает после теста тоже.
Нужно выполнить этот кусок кода только один раз. Вывод сделан так:
lcd.setCursor(4, 0); if (time / 60 / 60 < 10) { lcd.print ("0"); //часы } lcd.print (time / 60 / 60); lcd.print (":"); if (time / 60 % 60 < 10) { lcd.print ("0"); //минуты } lcd.print ((time / 60) % 60); lcd.print (":"); if (time%60<10) { lcd.print ("0"); }//секунды lcd.print (time%60);
вначале сделай какую нибудь булевую переменную, приравняй к ложь, сделай вывод при условии что это переменная ложь. когда сделаешь вывод проровняй ее к тру и больше этот вывод проводиться не будет.
После этого блока подожди до нажатия чего нибудь, потом перезапусти все сначала программным ресетом.
Я в ардуино совсем новичок. Пробовал много разных способов, в итоге у меня получилось!!. Не знаю правильно ли это, но зато работает))
ну можно и так а то про что я говорил в Вашем случае i должна быть булевой, то есть инициироваться она должна bool i=false;
в строке 1 пишем if(!i)//восклицательный знак перед переменной возвращает "инвертированное" ее значение, то есть в скобках у нас должно быть тру, так чтобы код в if фигурных скобках выполнялся,( тоже самое про while но это немного другое), а так как у нас i изначально равно false то !i=true. или можно было написать if(i==false). чем мне нравятся булевые переменные так это тем что не нужно под них писать равны они чему или нет, просто их указывать в скобках. if(i) или if(!i) или if(i&&y) или if(i&&!y)..
в строке 3 пишем i=true;
ПС если вы новичек то помогает обильные коментарии в скетче, берите готовые и читайте их, поймете как что делается...
ну можно и так а то про что я говорил в Вашем случае i должна быть булевой, то есть инициироваться она должна bool i=false;
булевая не булевая... лично мне на фелс и тру проверять не очень нравиться: в памяти мк ей отводиться байт, а используется только два значения... чуете к чему я? в переменную можно загнать не один флаг, а больше. каждый бит можно как флаг использовать. вместо 8 булевых, которые в памяти займут 8 байт - можно занять 1 байт.
Смотри.
булевая не булевая... лично мне на фелс и тру проверять не очень нравиться: в памяти мк ей отводиться байт, а используется только два значения... чуете к чему я? в переменную можно загнать не один флаг, а больше. каждый бит можно как флаг использовать. вместо 8 булевых, которые в памяти займут 8 байт - можно занять 1 байт.
Ну да, только новичка это еще больше запутает, и большенство наших скетчиков в память не упираются. Хотя лучьше измальства учиться экономить