Упровление вытяжкой

rusincor
Offline
Зарегистрирован: 26.08.2018

Привет форумчанам.

Я навичек в этом деле --- могли-бы Вы подсказать правелен ли код

Есть вентилятор и две кнопки управлением скоростью вращения --- код который внизу глючит

обороты то сами увеличятся то не реагирует на нажатие кнопки -- либо нажимаешь уменьшение а он прибовляет обороты

int switchPin1 = 8;
int switchPin2 = 7;
int PWMpin = 9;
boolean lastButton = LOW;
boolean currentButton = LOW;
boolean lastButton1 = LOW;
boolean currentButton1 = LOW;
int PWMlevel = 165;



void setup()
{
  pinMode(switchPin1, INPUT);
  pinMode(switchPin2, INPUT);
  pinMode(PWMpin, OUTPUT);
  Serial.begin(9600);
  // ШИМ 8 разрядов, 62,5 кГц
  TCCR1A = TCCR1A & 0xe0 | 1;
  TCCR1B = TCCR1B & 0xe0 | 0x09;  
  analogWrite(9, 25); // на выводе 9 ШИМ=10%
  
  }

boolean debounce(boolean last)
{
  boolean current = digitalRead(switchPin1);
  if (last != current)
  {
    delay(5);
    current = digitalRead(switchPin1);
  }
  return current;
  }
boolean debounce1(boolean last1)
{
    boolean current1 = digitalRead(switchPin2);
  if (last1 != current1)
  {
    delay(5);
    current1 = digitalRead(switchPin2);
  }
  return current1;
}



void loop()

{
  
  currentButton = debounce(lastButton);
  if (lastButton == LOW && currentButton == HIGH)
  {
    PWMlevel = PWMlevel + 15;
  }
  lastButton = currentButton;
  
  if (PWMlevel > 255) PWMlevel = 255;
  analogWrite(PWMpin, PWMlevel);


  currentButton1 = debounce1(lastButton1);
  if (lastButton1 == LOW && currentButton1 == HIGH)
  {
    PWMlevel = PWMlevel - 15;
  }
  lastButton1 = currentButton1;
  
  if (PWMlevel < 75) PWMlevel = 75;
  analogWrite(PWMpin, PWMlevel);
  Serial.print("POWER - ");Serial.println(PWMlevel);
}

 

Logik
Offline
Зарегистрирован: 05.08.2014

Так дебажте! Натыкайте Serial.print в ключевых местах и смотрите где и что пошло не  так.

Про вытяжку. Знакомый делал, начал с датчика качества воздуха. Работает, но есть недостаток - внезапно включается и шумит мешая людям разговаривать. Добавил микрофон, чтоб не включалась во время разговоров на полную. Стала не включатся при работающем телевизоре. Последнее, знаю, дорабатывал привязку к включенности телика. Таков путь домашнего автоматизатора )))

rusincor
Offline
Зарегистрирован: 26.08.2018

а каким образом отследить что не так и куда натыкать сериал

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

rusincor пишет:

а каким образом отследить что не так и куда натыкать сериал

Через строчку тычьте и печатайте все переменные, а потом внимательно разбирайтесь. Со временем научитесь тыкать что надо и куда надо.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну такой скетч вам точно не пойдет. Не проверял в работе

/**/
unsigned long mill; // переменная под millis()
//------Cl_Btn----------------------
class Cl_Btn {
  public:
    enum event_t {onNONE = 0, onClick}; /*события не изменилось/клик*/
  protected:
    const byte pin;
    event_t event;
    bool bounce = 0;
    bool btn = 1, oldBtn;
    unsigned long past;
  public:
    Cl_Btn(byte p): pin(p) {}
    /*инициализация-вставить в setup()*/
    void init() {
      pinMode(pin, INPUT_PULLUP);
    }
    /*работа-вставить в loop()*/
    void run() {
      event = onNONE;
      bool newBtn = digitalRead(pin);
      if (!bounce && newBtn != btn) {
        bounce = 1;
        past = mill;
      }
      if (bounce && mill - past >= 10) {
        bounce = 0 ;
        oldBtn = btn;
        btn = newBtn;
        if (!btn && oldBtn) event = onClick;
      }
    }
    byte is(event_t e) {
      return e == event;
    }
};
//--------------------------------
class Cl_Fan {
  protected:
    byte pin;
    byte val;
    const byte step = 10;
    const byte maxVal = 255;
    const byte minVal = 0;
    void write(byte v) {
      if (v > maxVal) v = maxVal;
      if (v < minVal) v = minVal;
      val = v;
      analogWrite(pin, val);
    }
  public:
    Cl_Fan(byte p): pin(p) {}
    void init() {
      write(0);
    }
    void up() {
      write(val + step);
    }
    void down() {
      write(val - step);
    }
};
//---Компоновка-----------------------------
Cl_Fan Fan(/*пин*/9);
Cl_Btn Btn1(/*пин*/8);
Cl_Btn Btn2(/*пин*/7);
//--------------------------------
void setup() {
  Btn1.init();
  Btn2.init();
  Fan.init();
}

void loop() {
  mill = millis();
  Btn1.run();
  Btn2.run();
  if (Btn1.is(Cl_Btn::onClick))Fan.up();
  if (Btn2.is(Cl_Btn::onClick))Fan.down();
}
/**/

 

nikolaki
nikolaki аватар
Offline
Зарегистрирован: 14.02.2013

ЕвгенийП пишет:

 Со временем научитесь тыкать что надо и куда надо.

А со временем вообще перестанете тыкать лишний раз.Опыт приходит с годами.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

nikolaki пишет:

А со временем вообще перестанете тыкать лишний раз.Опыт приходит с годами.

Не перестанет. У меня вон уж сколько опыта и лет, а надысь затрахался искать почему сотировка не работает. Истыкался всего пока не стал уже через строчку тыкать и таки дошло, вместо n+i написано n+1, а в шфрите того редактора мне это было не по глазам. Исправил и сменил шрифт, кто что может гарантировтать?

rusincor
Offline
Зарегистрирован: 26.08.2018

Блин я не могу понять что куда вставлять :)

я совсем профан в этом деле --- но завтра обязательно попробую с вашим кодом

после отпишусь

rusincor
Offline
Зарегистрирован: 26.08.2018

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

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

rusincor пишет:

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

Что и куда вставлять? Если вы про мой код, так http://arduino.ru/forum/programmirovanie/tsifrovye-avtomaty-v-klassakh-po-qwone  Но я же говорил, можете мой код проигнорировать.

rusincor
Offline
Зарегистрирован: 26.08.2018

ссылка не работает

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
rusincor
Offline
Зарегистрирован: 26.08.2018

Да это для меня тёмный лес

 

rusincor
Offline
Зарегистрирован: 26.08.2018

Подскажите как поправить мой код для коректной работы

Или может он вообще корявый

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

rusincor пишет:

Подскажите как поправить мой код для коректной работы

Или может он вообще корявый

Для начала поймите, а о чем Ваша программа. Для этого вставьте комментарии хоть в каждую строку типа

;// Здесь я уменьшаю обороты с помощью переменной "Ы"

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mykaida пишет:

;// Здесь я уменьшаю обороты с помощью переменной "Ы"

А "Ы" - чтобы никто не догадался ( https://www.youtube.com/watch?v=N8TYZabKUNA )

rusincor
Offline
Зарегистрирован: 26.08.2018

вот поэтому ничего и не расписано --- что бы никто не догадался :)))