прирвать loop
- Войдите на сайт для отправки комментариев
Пнд, 13/01/2014 - 21:02
Всем привет, подскажите есть ли у Arduino возможность прирвать петлю, при определенном условии, то есть чтобы программа польностью останавливалась?
А что нужно делать после полной остановки программы?
только потом прийдется ресетить МК, чтобы он заново начал работать.
а функиция, которая вызывается, например, каждые 5 секунд тоже деактивируется?
Какие такие функции?
Они откуда возьмутся. Если сами напишите - сами и деактивируете.
Начните с того, что Вы хотите сделать и для чего....
Управляю мотором, фототранзистор считает обороты мотора. Каждые 5 секунд отороты мотора + показатели температурного датчика записываются на SD-карточку. Если датчик не фиксирует отороты мотор останавливается. Хочу чтобы программа полностью прекращала работу, тоесть на SD карту тоже ни чего не должно писатся. Попробывал так
void loop (){ { if ( millis ()-prev_Miliis>1000) { if (x==x_old) / { analogWrite ( 3,0); digitalWrite(A0, HIGH); //lcd.print ( " Error") while (1); Продолжает писать на карту. В void setup() я сформулировал фунцию void (mesure), которая вызывается каждые 5 сенунд, меряет температуру и записывает на SD. Вот и ворос. Как сделать, чтобы она тож деактивироваласьначните с банального мигания светодиодом........
Ура! Давайте мы будем угадывать что там еще все в скетче есть, а Вы говорить горячо-холодно?
Вот это весь скэтч. Как указано выше, при ощибках программа должна полностью прикращать работу. Как можно это добавить в скэтч? #include <TimerOne.h> #include <LiquidCrystal_I2C.h> // #include <Sensirion.h> // #include <Wire.h> #include <DS1307RTC.h> #include <Time.h> #include <SD.h> // #define PWM_pin 3 //. #define Motor_pin 4 // const uint8_t dataPin = 5; // const uint8_t clockPin = 6; // const int chipSelect = 10; int Sensor=2;// float Tempture=0; float Humidity=0; volatile unsigned long x = 0; // int z=0; // long x1=0; // long x2=0; // unsigned long previousMillis = 0; // int x_State=1; // long prev_Miliis=0; long x_old=0; byte pwm = 150;// Sensirion Tempsensor = Sensirion(dataPin, clockPin); LiquidCrystal_I2C lcd (0x40,16 ,2);// IC2 LCD Display void setup() { // Pins pinMode(PWM_pin, OUTPUT); // pinMode(Motor_pin, OUTPUT); // pinMode(Sensor, INPUT); // pinMode(A0, OUTPUT); // attachInterrupt(0, count, RISING); Timer1.initialize(8000000); // Timer1.attachInterrupt(Mesure); // Serial.begin(9600); while (!Serial) { ; } setSyncProvider(RTC.get); // Serial.print("Initialising SD..."); pinMode(10, OUTPUT); if (!SD.begin(10)) { Serial.println("Failure Initializing"); digitalWrite(A0, HIGH); analogWrite(3,0); return; } Serial.println("Initializing successful."); analogWrite(3,pwm); } void Mesure() // { Serial.begin (9600); Tempsensor.mesure(&Tempture, &Humidity) File MesureFile = SD.open("mesured.txt", FILE_WRITE); // if (MesureFile) { MesureFile.print("Tempture: "); MesureFile.print(Tempture); // MesureFile.println("°C"); MesureFile.prin("Humidity: "); MesureFile.print(Humidity); MesureFile.prin("%"); MesureFile.prin ("cycles"); MesureFile.prin (x); MesureFile.print(day()); MesureFile.print(":"); MesureFile.prin(month()); MesureFile.prin(":"); MesureFile.print(year()); MesureFile.prin("; "); MesureFile.print(hour()); MesureFile.prin(":"); MesureFile.print(minute()); MesureFile.print(":"); MesureFile.prin(second()); MesureFile.prin("; "); MesureFile.prin.close(); } else { Serial.println("Failure to open mesure.txt"); digitalWrite(A0, HIGH); } } void loop (){ { if ( millis ()-prev_Miliis>1000) { if (x==x_old) { analogWrite ( 3,0); digitalWrite(A0, HIGH); //lcd.print ( " Error") z=47; } x_old=x; prev_Miliis=millis(); if (z<40){ analogWrite(3,pwm++); Serial.println ("pwm:"); Serial.println(pwm); } if (z>50) { analogWrite(3,pwm--); Serial.println ("pwm:"); Serial.println(pwm); } } } } // ISR void count() { x++; if (x==1) { // previousMillis=millis(); x_alt=0; } if (millis()-previousMillis>1000){ switch (x_State){ // case 1: // x1=x; // x_State=2; // break; case 2: x2=x; z=x2-x1; x_State=3; break; case 3: x1=x; z=x1-x2; x_State=2; / break; } previousMillis=millis(); } }Неважно для чего , но тобы прервать лууп, организуйте собственный в сетапе, с выходами по условию в основной пустой лууп, в котором все закончится до ресета, или срабатывания вочдога, что собственно тоже ресет.