Arduino с неработающим IF

Nik_Frol
Offline
Зарегистрирован: 28.10.2020

Всех приветствую. Есть скетч программы по управлению Реверсом и Переключением передач для лодочного мотора:

//гав
#include <Servo.h>
Servo servo_kpp;
Servo servo_throtle;
/*=================Номера пинов подключения серво и др. оборудования==================*/
#define SERVO_KPP 2
#define SERVO_TRO 3  
#define MODE_SW 4 //Пин подключения тумблера для переключения режимов работы
#define PIN_ENG_STAT 10 //Пин подключения сигнального выхода с двигателя
/*================================================================*/






/*=================Диапазон значений потенциометра КПП============*/

#define MAX_R_POT 0
#define MIN_R_POT 460

#define MIN_N_POT 480
#define MAX_N_POT 520

#define MIN_F_POT 540
#define MAX_F_POT 1024
/*================================================================*/

/*=================Диапазон значений потенциометра Дросселя============*/
#define DROS_POT_MIN_R 40 
#define DROS_POT_MAX_R 440

#define DROS_POT_MIN_F 560
#define DROS_POT_MAX_F 960
/*=====================================================================*/

 

/*=================Диапазон значений ШИМ КПП============*/

#define MAX_R_PWM 500
#define MIN_R_PWM 1400

#define MIN_N_PWM 1450 
#define MAX_N_PWM 1550

#define MIN_F_PWM 1600
#define MAX_F_PWM 2500

/*================================================================*/


/*=================Диапазон значений ШИМ Дросселя============*/
#define DROS_PWM_MIN_R 1000 
#define DROS_PWM_MAX_R 1400

#define DROS_PWM_MIN_F 1600
#define DROS_PWM_MAX_F 2000
/*=====================================================================*/

/*=================Значения положений серво КПП в микросекундах==================*/
#define R_DEG 600
#define N_DEG 1500
#define F_DEG 2400
/*===============================================================================*/

/*=================Значения положений MIN-MAX дросселя в микросекундах==================*/
#define DROS_MIN 600
#define DROS_MAX 2400
/*======================================================================================*/

#define DELAY_DROS 1000 //Delay перед поворотом дросселя после включения передач (В милисекундах)

/*=================Диапазон значений КПП (Задаётся в цикле в зависимости от выбранного переключателя)============*/

int MIN_R;
int MAX_R;

int MIN_N;
int MAX_N;

int MIN_F;
int MAX_F;
/*================================================================*/





/*=================Системные (НЕ ТРОГАТЬ)=============================*/

boolean delay_stat =  1;
int valpot2 = 0;
/*
int valpot; // переменная для хранения значения потенциометра
int valpwm; // переменная для хранения значения ШИМ
*/
int val; //Значение зависимое от выбора переключателя (Между ШИМ или потенциметром)
int POT=A0; // Аналоговый вход A0 для подключения потенциометра
int PWM=5; // Аналоговый вход A0 для подключения источника ШИМ
bool stat_sw; // Переменная состояния переключателя (Между ШИМ и Потенциометром)
byte stat = 0; // Переменная состояния дросселей (Всего два типа: 0 - серво не работает, 1 - серво работает в реверсе 2 - серво работает в форварде
int angleservo_forward = 0; // переменная для хранения угла поворота сервы с потенциометра
int angleservo_rewerse = 0; // переменная для хранения угла поворота сервы с потенциометра
int angleservo_forward_pwm = 0; // переменная для хранения угла поворота сервы с шим
int angleservo_rewerse_pwm = 0; // переменная для хранения угла поворота сервы с шим
/*=====================================================================*/


void setup() {
servo_kpp.attach(SERVO_KPP);
servo_throtle.attach(SERVO_TRO);
Serial.begin(115200);
servo_kpp.write(0);
servo_throtle.write(0);
pinMode(MODE_SW, INPUT);


}





void loop() {
if (MODE_SW == 1) {
  stat_sw = 1; //Если высоко, то потенциометр
}
else if (MODE_SW == 0) {
  stat_sw = 0; //Если низкое то ШИМ
}

Serial.println(digitalRead(MODE_SW));
Serial.println(stat_sw);



if (stat_sw == 1) {
  val = analogRead(POT); // чтение данных потенциометра
  
  Serial.print("Val = ");
  Serial.println(val);
  
  MIN_R = MIN_R_POT;
  MAX_R = MAX_F_POT;
 
  MIN_N = MIN_N_POT;
  MAX_N = MAX_N_POT;

  MIN_F = MIN_F_POT;
  MAX_F = MAX_F_POT;
  
}


else  {
  
  val = pulseIn(PWM, HIGH); // чтение данных ШИМа
  Serial.print("VAL "); 
  Serial.println(val);
  
  MIN_R = MIN_R_PWM;
  MAX_R = MAX_F_PWM;
 
  MIN_N = MIN_N_PWM;
  MAX_N = MAX_N_PWM;

  MIN_F = MIN_F_PWM;
  MAX_F = MAX_F_PWM;
}


angleservo_forward=map(val,MIN_F,MAX_F,DROS_MIN,DROS_MAX); //Значение сервопривода ДРОССЕЛЯ при фоварде
angleservo_rewerse=map(val,MAX_R,MIN_R,DROS_MAX,DROS_MIN); //Значение сервопривода ДРОССЕЛА при реверсе

//===========================Инструкция для Фоварда===========================//
if (val >= MIN_F) {
  servo_throtle.writeMicroseconds(F_DEG);
  Serial.println("Forward");
  if (delay_stat == 1) {
    delay(DELAY_DROS);
    delay_stat = 0;
  }
  stat = 1;
}

//===========================Инструкция для Нейтрали===========================//
else if (val >= MIN_N) {
  if (val <= MAX_N) {
    servo_throtle.writeMicroseconds(N_DEG);
    Serial.println("Neutral");
    delay_stat = 1;
    stat = 0;
  }
}
//===========================Инструкция для Реверса===========================//
else if (val <= MIN_R) {
    servo_throtle.writeMicroseconds(R_DEG);
    Serial.println("Reverse");
    if (delay_stat == 1) {
      delay(DELAY_DROS);
      delay_stat = 0;
  }
    stat = 2;
  
}

if (stat == 1) {
  
      servo_kpp.writeMicroseconds(angleservo_forward);
    
  
}
else if (stat == 2) {
  
      servo_kpp.writeMicroseconds(angleservo_rewerse);
    }
  
else if (stat != 1) {
  servo_kpp.writeMicroseconds(DROS_MIN);
}

}






 

В начале блока loop должен работать цикл:

if (MODE_SW == 1) {
  stat_sw = 1; //Если высоко, то потенциометр
}
else if (MODE_SW == 0) {
  stat_sw = 0; //Если низкое то ШИМ
}

 

 

По какой-то причине, он не работает (Было проверено благодаря выводу значения). Точнее не присваивается значение переменной stat_sw которое должно. Всем коллективом обломали голову, надеемся на вашу помощь..

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Nik_Frol пишет:

#define MODE_SW 4 //Пин подключения тумблера для переключения режимов работы
//...тут куча глупой фигни....

if (MODE_SW == 1) {
  stat_sw = 1; //Если высоко, то потенциометр
}
else if (MODE_SW == 0) {
  stat_sw = 0; //Если низкое то ШИМ
}

 

 

По какой-то причине, он не работает

Интересно, а как в твоих влажных фантазиях должно это работать????

if (4 == 1)

--------------------

Чтобы подгнившие извилины не мучал: ты забыл digitalRead() написать ;))))))))))))))))

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

If сломался... срочно в ремонт :)

Слышал что нибудь про pinMode, digitalRead , digitalWrite ? Веб странички наверное красивые рисуешь :))))

Пока писал про веб странички, Граф меня опередил :(

Nik_Frol
Offline
Зарегистрирован: 28.10.2020

Реально, мозг подгнил.. Забыл про digitalRead :). Усталость и выгорание даёт о себе знать. Спасибо)

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

brokly пишет:

Пока писал про веб странички, Граф меня опередил :(

Мазл тов! ;)))))

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

wdrakula пишет:

Мазл тов! ;)))))

Мин сезне котлыйм :)))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

brokly пишет:

wdrakula пишет:

Мазл тов! ;)))))

Мин сезне котлыйм :)))

ә нәрсә белән?