помогите чайнику

Тема в разделе "Arduino & Shields", создана пользователем Arduinator, 3 фев 2014.

  1. Arduinator

    Arduinator Нуб

    Хочу,чтобы мотор стартовал при включении кнопки и если нег сигнала с датчиком, то останавливался. Датчик считает обороты мотора за секунду и ecли x==x_old, мотор должен останавливатся. Но не заводится вообще


    Код (Text):
    #include <TimerOne.h>
    #define PWM_pin  5
    #define Motor_pin 7
    volatile unsigned long x = 0;
    volatile unsigned long z=0;
    volatile unsigned long x_old;
    unsigned long previousMillis = 0;

         
         
        byte pwm = 150;
       
            int Lightsensor=2;
            int switch=3;
     
        void setup()
        {
          Serial.begin(9600);
     
          pinMode(PWM_pin, OUTPUT);
          pinMode(Motor_pin, OUTPUT);
              pinMode(Lightsensor, INPUT); //
              pinMode(switch,INPUT);
           
     
         
       
          attachInterrupt(0, count, RISING);
         
        }
    void loop (){

      if (digitalRead(3)==HIGH)
      {  x = 0;
          delay(1000);
          noInterrupts();
              if (z==!0)  {
                    analogWrite(5,200);
                 
      } else {
        analogWrite(5,0);
                 
      }
      interrupts();

      }
    }

    void count()
        {
     
      x++;                  

      if (x==1) {                //
        previousMillis=millis();  //
        x_old=0;
      }

      if (millis()-previousMillis>1000){  //
        z = x - x_old;          //
        x_old = x;                    
        previousMillis=millis();
      }
    }
     
  2. lerik2703

    lerik2703 Гик

    для начало откомментируйте код! и не забываем про Ctir+t в программе! замените цифровые значения на определения! ну и как я вижу мотор у вас должен запуститься при условии что z будет ровна истине (хотя переменная не boolean)
     
    Megakoteyka нравится это.
  3. Arduinator

    Arduinator Нуб

    Переписал код по другому
    Код (Text):
          #include <avr/sleep.h>
    #include <TimerOne.h>
    #include <LiquidCrystal_I2C.h>  //
    #include <Sensirion.h>      //
    #include <Wire.h>          
    #include <DS1307RTC.h>
    #include <Time.h>
    #include <SD.h>

    const int PWM_pin =  5;
    const int Lightsensor = 2;
    const int switch = 3;
    const uint8_t dataPin  =  6; //
    const uint8_t clockPin =  7; //
    const int chipSelect  = 10;
    static boolean Start = true;
    byte pwm=200;

    float Temperature=0; //
    float Humidity=0;
    float dew_point=0;

    volatile unsigned long x = 0; //
    unsigned long previousMillis = 0;
    volatile unsigned long y = 0;

    Sensirion Temperatursensor = Sensirion(dataPin, clockPin);
    LiquidCrystal_I2C lcd(0x20,16,2);

    void setup(){
      Serial.begin(9600);
      lcd.init();
      lcd.backlight();
      pinMode(PWM_pin, OUTPUT);
      pinMode(Lightsensor, INPUT); //
      pinMode(switch,INPUT);

      attachInterrupt(0, count, RISING);
      //attachInterrupt(1, wake, HIGH);
    Timer1.initialize(8000000); //
    Timer1.attachInterrupt(mesure); //
    }

    void mesure()
    {
    ...
    }
    void wake ()      //
    {
      sleep_disable();
      detachInterrupt(1);
      Serial.println("waking up");
    }



    void loop (){
      if (digitalRead(switch)==HIGH)  {    //  Включаю кнопку, мотор вращается.
        if (Start){  //
          y=0;
          Serial.println("Start Motor.");  //
          analogWrite(PWM_pin,pwm);
          previousMillis = millis();          //
       
          x = 0;                              //
          Start = false;
        }
        if (millis()-previousMillis>1000){  //
       
       
          previousMillis = millis();        //  жду секунду, контролирую обороты
        Serial.print("RPM= ");Serial.print(x*60);Serial.println("RPM");  //
          if ( x*60<2520)
            { analogWrite(5,pwm++);}
          if ( x*60>2550)
              { analogWrite(5, pwm--);}
            if ( x*60==0)
            { analogWrite( 5, 0);}
       
          y+=x;
          x = 0;                                //
      }
     
     
      }else {                      // кнопка выключена, ардуино спит
        Start = true;
     
      sleep();
      }
    } // end loop()

    void count(){      
      x++;
                //
               
    }


    void sleep()              //
    {
        Serial.println("going to sleep");
        delay(50);
     
     
        set_sleep_mode (SLEEP_MODE_PWR_DOWN);
        sleep_enable();
     
        attachInterrupt (1, wake, HIGH);
        sleep_disable();
        detachInterrupt(1);
     
    }                                              
    Такая проблема:
    Если убираю строчки
    Код (Text):
    Timer1.initialize(8000000); //
    Timer1.attachInterrupt(mesure); //


    из вот этого кода, то работает как надо. Если строчки не убираю, то программа не делает вообще ничего.
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    Пока код не будет отформатирован и откомментирован, вероятность дождаться помощи весьма мала. Мало у кого есть желание разбираться в этой каше. Что за сложность нажать Ctrl+T в Arduino IDE перед вставкой кода на форум?

    Зачем было определять константу PWM_pin, если вместо нее в коде повсюду написано "5"?

    Чтобы было проще отладить код, уберите из него все, что не относится к текущей проблеме.
    Добавьте в проблемных местах отладочный вывод в последовательный порт, тогда будете понимать, как код работает на самом деле.
     
  5. Arduinator

    Arduinator Нуб

    Откоментировал и отформатировал. Надеюсь так понятнее
    Код (Text):
    #include <avr/sleep.h>
    #include <TimerOne.h>

    #include <Sensirion.h>      //
    #include <Wire.h>        
    #include <DS1307RTC.h>
    #include <Time.h>
    #include <SD.h>

    const int PWM_pin =  5; // мотор
    const int Lightsensor = 2; // сенсор для подчсета оборотов
    const int switchpin = 3;      // кнопка для активации программы
    const uint8_t dataPin  =  6; // темп. сенсор
    const uint8_t clockPin =  7; // темп. сенсор
    const int chipSelect  = 10;  // SD карта
    static boolean Start = true; //сигнал для старта
    byte pwm=200;

    float Temperature=0; //
    float Humidity=0;
    float dew_point=0;

    volatile unsigned long x = 0; // для подсчета оборотов за одну петлю
    unsigned long previousMillis = 0; // время
    volatile unsigned long y = 0;  // для подсчета  общего количества оборотов

    Sensirion Temperatursensor = Sensirion(dataPin, clockPin);


    void setup(){
      Serial.begin(9600);


      pinMode(PWM_pin, OUTPUT);  // мотор на выходе
      pinMode(Lightsensor, INPUT); // датчик на входе
      pinMode(switchpin,INPUT);    // кнопка прерывание

      attachInterrupt(0, count, RISING); // прерыввание
      //attachInterrupt(1, wake, HIGH);
      Timer1.initialize(8000000); //    функция  должна вызыватся каждые 8 секунд
      Timer1.attachInterrupt(mesure); //

    }

    void mesure()
    {

    }

    void wake ()      //  сон
    {
      sleep_disable();
      detachInterrupt(1);
      Serial.println("waking up");

    }



    void loop (){

      if (digitalRead(switchpin)==HIGH)  {    //  Включаю кнопку, мотор вращается.
        if (Start){  //
          y=0;                            //  общие обороты равны нулю                          
          Serial.println("Start Motor.");  //
          analogWrite(PWM_pin,pwm);
          previousMillis = millis();          // обновление времени

          x = 0;                              //
          Start = false;                      // старт прошел
        }
        if (millis()-previousMillis>1000){  //  жду секунду, контролирую обороты


          previousMillis = millis();        //  обновляется время
          Serial.print("RPM= ");
          Serial.print(x*60);
          Serial.println("RPM");  // контроль оборотов
          if ( x*60<2520)
          {
            analogWrite(5,pwm++);
          }
          if ( x*60>2550)
          {
            analogWrite(5, pwm--);
          }
          if ( x*60==0)
          {
            analogWrite( 5, 0);
          }

          y+=x;                        // прежде чем обнулить показания датчика они сохраняются
          x = 0;                                //  обнуляю датчик

        }


      }
      else {                      // кнопка выключена, ардуино спит
        Start = true;            

        sleep();
      }
    } // end loop()

    void count(){          //cчитаются обороты
      x++;


    }


    void sleep()              //
    {
      Serial.println("going to sleep");
      delay(50);



      set_sleep_mode (SLEEP_MODE_PWR_DOWN);  //режим сна
      sleep_enable();                      // активировать сон            

      attachInterrupt (1, wake, HIGH);    // кнопка активна
      sleep_disable();                  // деактивировать сон  
      detachInterrupt(1);                //

    }