Хочу,чтобы мотор стартовал при включении кнопки и если нег сигнала с датчиком, то останавливался. Датчик считает обороты мотора за секунду и 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(); } }
для начало откомментируйте код! и не забываем про Ctir+t в программе! замените цифровые значения на определения! ну и как я вижу мотор у вас должен запуститься при условии что z будет ровна истине (хотя переменная не boolean)
Переписал код по другому Код (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); // из вот этого кода, то работает как надо. Если строчки не убираю, то программа не делает вообще ничего.
Пока код не будет отформатирован и откомментирован, вероятность дождаться помощи весьма мала. Мало у кого есть желание разбираться в этой каше. Что за сложность нажать Ctrl+T в Arduino IDE перед вставкой кода на форум? Зачем было определять константу PWM_pin, если вместо нее в коде повсюду написано "5"? Чтобы было проще отладить код, уберите из него все, что не относится к текущей проблеме. Добавьте в проблемных местах отладочный вывод в последовательный порт, тогда будете понимать, как код работает на самом деле.
Откоментировал и отформатировал. Надеюсь так понятнее Код (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); // }