прирвать loop

crecker
Offline
Зарегистрирован: 15.12.2013

Всем привет, подскажите есть ли у Arduino возможность прирвать петлю, при определенном условии, то есть чтобы программа польностью останавливалась?

gena
Offline
Зарегистрирован: 04.11.2012

  А что нужно делать после полной остановки программы? 

maksim
Offline
Зарегистрирован: 12.02.2012
if(условие) wyile(1);

 

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

только потом прийдется ресетить МК, чтобы он заново начал работать.

crecker
Offline
Зарегистрирован: 15.12.2013

а  функиция, которая  вызывается, например, каждые 5 секунд тоже деактивируется?

Looka
Offline
Зарегистрирован: 24.04.2012

Какие такие функции?
Они откуда возьмутся. Если сами напишите - сами и деактивируете.

Начните  с того,  что Вы хотите сделать и для чего....

crecker
Offline
Зарегистрирован: 15.12.2013

Управляю мотором, фототранзистор считает обороты мотора. Каждые 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. 
 Вот и ворос. Как сделать, чтобы она тож деактивировалась

 

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

начните с банального мигания светодиодом........

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Ура! Давайте мы будем угадывать что там еще все в скетче есть, а Вы говорить горячо-холодно?

crecker
Offline
Зарегистрирован: 15.12.2013
Вот это весь скэтч. Как указано выше, при ощибках программа должна полностью прикращать работу. Как можно это добавить в скэтч?
#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();  
  }
}

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

Неважно для чего , но тобы прервать лууп, организуйте собственный в сетапе, с выходами по условию в основной пустой лууп, в котором все закончится до ресета, или срабатывания вочдога, что собственно тоже ресет.