Замена штатного имо Калина

voriag1
Offline
Зарегистрирован: 28.11.2015

Прошу помощи. Машина калина 1 Накрылся имо делаю ему замену на ардуино нано. Возникла сложность с плавным включением и выключением света, узучил кучу примеров,но все не то( При  открытии водительской двери на ногу мк приходит минус, а при закрытой передней и открытой задней поступант модульный сигнал, т.е +меняется на- и обратно.ю. но если открыта передняя дверь идет только -.

Момогите реализавать вежливую подсветку.

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

И что? Вы написали скетч, а он не работает? Скетч в студию! Или Вы хотите, чтобы кто-то написал за Вас? Тогда в "ищу исполнителя".

voriag1
Offline
Зарегистрирован: 28.11.2015
Вот, что-то вроде. Не пллучается оставить яркость на одном уровне
#define led 9  //LED Pin

int pin = 10;
int on = 0;

int brightness = 0;    // переменная отвечающая за яркость

int fadeAmount = 5;    // переменная, которая задает скорость изменения яркости за цикл




// настройки:

void setup()
{
  pinMode(led, OUTPUT);
  pinMode (pin, INPUT);
  pinMode(led,LOW);
  
}



// основной цикл:

void loop()  {

  // устанавливаем яркость светодиода на выводе  9:

   on = digitalRead (pin);

   if (on >0)
   { analogWrite(led, brightness);  
  brightness = brightness + fadeAmount;
   
    
   }
   else 
   {
     analogWrite(led, brightness);  
    brightness = brightness + fadeAmount;
   }
    
  } 
    

 

voriag1
Offline
Зарегистрирован: 28.11.2015

я совсем недавно начал изучать ардуино 

voriag1
Offline
Зарегистрирован: 28.11.2015

при подачи питания светодиод  должен гореть 20 минут,  а за тем гаснуть

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

voriag1 пишет:

я совсем недавно начал изучать ардуино 

Лучше бы Вы сначала поизучали программирование.

Вот теперь берите Ваш код и построчно сами себе (можете и мне, но себе в первую очередь) говорите словами, что именно Вы в этой строчке делаете.

Пока же я вижу следующее: в строках 34-44 написано "если on>0 сделать что-то, а иначе сделать то же самое. Вы это хотели написать?

Теперь, прибавляя приращение к яркости 1) неплохо контролировать выход за границы допустимого значения, а то у Вас яркость растёт неограничено и 2) вы, выдимо, хотели плавного изменения яркости, так надо ж дать светодиоду хоть немного с текущей яркостью погореть, а Вы дергаете его при каждом вызове loop, т.е. 120 тысяч раз в секунду примерно. Вы действительно надеетесь успеть заметить так быстро меняющуюся яркость?

voriag1
Offline
Зарегистрирован: 28.11.2015
for (int i=0; i <= 255; i++){
      analogWrite(PWMpin, i);
      delay(10);

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

 

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

Я рад за этот кусок кода, но мы вроде не его обсуждаем, а Ваш, так же? Вот и читайте мой пост №5 и делайте, что сказано.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Самое смешное, что и эта проблема также решается путем blink without delay.

voriag1
Offline
Зарегистрирован: 28.11.2015

andriano пишет:

Самое смешное, что и эта проблема также решается путем blink without delay.

вместо того, чтобы смеяться тыкнул носом, как это сделать

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

если сработало условие то запускаем цикла из 6 поста и запоминаем время текущее используя millis(). если текущее время millis()-время которое запомнили больше 20 минут выключить светодиод

voriag1
Offline
Зарегистрирован: 28.11.2015
int led = 9;  //LED Pin
int pin = 10;
int i=0;
int on=0;


void setup()
{
  pinMode(led, OUTPUT);светодиод
  pinMode (pin, INPUT);\\кнолпка
  pinMode(led, LOW);состояние светодиода на время запуска ардуино

}



// основной цикл:

void loop()  {
  
  on = digitalRead (pin);
  if (on>0)
  { 
    analogWrite(led,i); 
  i = i + 1;}
  delay (23);
    }


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

  


 

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

voriag1 пишет:

andriano пишет:

Самое смешное, что и эта проблема также решается путем blink without delay.

вместо того, чтобы смеяться тыкнул носом, как это сделать

Дык я ж Вас уже тыкал! Читайте пост №5 - для начала объясните сами себе словами что там делается и что должно делаться.

Или Вы не понимаете что делается в этом скетче? Совсем не понимате? Тогда просто идите в "ищу исполнителя" и там Вам всё сделают.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

voriag1 пишет:

andriano пишет:

Самое смешное, что и эта проблема также решается путем blink without delay.

вместо того, чтобы смеяться тыкнул носом, как это сделать

У Вас в скетче присутствуют какие-то второстепенные переменные, но отсутствуют главные - описывающие состояния системы.

 

По сути, любой скетч должен содержать в loop три последовательно выполняющихся блока:

1. Принимает информацию из окружающего мира: кнопки, таймер (millis()), датчики...

2. Вычисляет на основе текущего состояния и информации, добытой на этапе 1, следующее состояние системы.

3. Реализует управляющие воздействия, соответствующие текущему состоянию, вычисленному в 2, на исполнительные органы: светодиоды, сервоприводы, дисплеи, пищалки, моторы...

 

Причем, такая структура легко масштабируется: при необходимости одновременно управлять различными объектами при разных управляющих воздействиях соответствующие фрагменты кода помещаются в соответствующие блоки без изменения структуры скетча.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

флагов не хватает чтобы знать включен светоидиод или нет, была нажата кнопка или нет

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

voriag1"не понятно как его оставить зажжонным и плавно погасить, когда условие перестанет выполняться?"

int led = 9;  //LED Pin
int pin = 10;
int i=0;
int on=0;


void setup()
{
  pinMode(led, OUTPUT);светодиод
  pinMode (pin, INPUT);\\кнолпка
  pinMode(led, LOW);состояние светодиода на время запуска ардуино

}



// основной цикл:

void loop()  {
  
  on = digitalRead (pin);
  if (on>0 && i<255) //Здесь плавно зажигаем и останавливаем
  { 
    analogWrite(led,i); 
    i = i + 1;
    delay (23);
  }
 if (on==0 && >0)//Здесь плавно тушим и останавливаем
  {
   analogWrite(led,i); 
   i = i - 1;
   delay (23);
  }
}

 

voriag1
Offline
Зарегистрирован: 28.11.2015
int led = 9;  //LED Pin
int pin = 10;
int i=0;//переменная шага затухания
int on=0;// переменная хранящая состояние кнопки
 
 
void setup()
{
  pinMode(led, OUTPUT);//светодиод выход
  pinMode (pin, INPUT);//кнолпка вход
  pinMode(led, LOW);//состояние светодиода на время запуска ардуино
 
}
 
// основной цикл:
 
void loop() 
{
    on = digitalRead (pin);
  if (on>0 && i<255) //Здесь плавно зажигаем и останавливаем
  { 
    analogWrite(led,i); 
    i = i + 1; // тут не понятно как ардуино понимает, когда остановиться
    delay (23);
  }
 if (on == 0 && i>0)  //Здесь компилятор начал ругаться, видимо нехватает переменной i плавно тушим и останавливаем
  {
   analogWrite(led,i); 
   i = i - 1;// свветодиод до конца не гаснет
   delay (23);
  }
}
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

У Вас код не соответствует описанию.

Например,

int on=0;// переменная хранящая состояние кнопки

Ничего эта переменная не хранит. Она переопределяется первым же оператором в loop(), сответственно, играет роль локальной переменной, хотя и определена как глобальная.

Дальше не смотрел.

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

Во первых научитесь правильно вставлять код.

Код я Вш не компилировал, взял Ваш а там были ошибки и просто набросал принцып, Сейчас проверил исправил 

int led = 9;  //LED Pin
int pin = 10;
int i=0;
int on=0;


void setup()
{
  pinMode(led, OUTPUT);//светодиод
  pinMode (pin, INPUT);//кнолпка
  pinMode(led, LOW);//состояние светодиода на время запуска ардуино

}



// основной цикл:

void loop()  {
  
  on = digitalRead (pin);
  if (on>0 && i<255) //Здесь плавно зажигаем и останавливаем
  { 
    i = i + 1;
    analogWrite(led,i); 
    delay (23);
  }
 if (on==0 && i>0)//Здесь плавно тушим и останавливаем
  {
  i = i - 1;
    analogWrite(led,i); 
    delay (23);
  }
}

 

voriag1
Offline
Зарегистрирован: 28.11.2015

спасибо, работает, сейчас вставляю таймер

voriag1
Offline
Зарегистрирован: 28.11.2015

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

int led = 9;  //LED Pin
int pin = 10;
int i=0;
int on=0;



unsigned long TIME = 10000; //В миллисекундах (10сек) время работы светодиода после запуска
unsigned long start_time = 0; //время когда был зажжон светодиод

void setup()
{
  pinMode(led, OUTPUT);//светодиод
  pinMode (pin, INPUT);//кнолпка
  pinMode(led, LOW);//состояние светодиода на время запуска ардуино

}

// основной цикл:

void loop()  {
  
  on = digitalRead (pin);
  if (on>0 && i<255&&millis() < TIME) //Здесь плавно зажигаем 
  { 
    i = i + 1;
    analogWrite(led,i); 
    start_time = millis();
    delay (23);
  }
   
 
 if (on==0 && i>0 ||millis()>= start_time + TIME)  //Здесь плавно тушим и останавливаем
  {
  i = i - 1;
    
    analogWrite(led,i); 
    delay (23);
  }
  
}

 

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

Вот в этой строчке if (on==0 && i>0 ||millis()>= start_time + TIME)  //Здесь плавно тушим и останавливаем

Вы проверяете i достигло 0 или закончилось 10 сек. Так вот у Вас время выходит раньше чем i=0. Уберите проверку времени, пусть он сам потухнет, если очень долго то сократите delay
voriag1
Offline
Зарегистрирован: 28.11.2015

vosara пишет:

Вот в этой строчке if (on==0 && i>0 ||millis()>= start_time + TIME)  //Здесь плавно тушим и останавливаем

Вы проверяете i достигло 0 или закончилось 10 сек. Так вот у Вас время выходит раньше чем i=0. Уберите проверку времени, пусть он сам потухнет, если очень долго то сократите delay

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

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

Чтобы ускориться поставте i=i-3 или 5-25

voriag1
Offline
Зарегистрирован: 28.11.2015

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

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

delay (10);

voriag1
Offline
Зарегистрирован: 28.11.2015

тоже, только быстрее. Можно как-нибудь зафиксировать таймер до следующего нажатия?

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

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

voriag1
Offline
Зарегистрирован: 28.11.2015

промерно 6.2 сек

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

Я понял у Вас просто не фиксируется время. Сейчас посмотрю как исправить!

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

Пробуйте отзывайтесь

int led = 9;  //LED Pin
int pin = 10;
int i=0;
int on=0;
bool f_time=0;



unsigned long TIME = 10000; //В миллисекундах (10сек) время работы светодиода после запуска
unsigned long start_time = 0; //время когда был зажжон светодиод

void setup()
{
  pinMode(led, OUTPUT);//светодиод
  pinMode (pin, INPUT);//кнолпка
  pinMode(led, LOW);//состояние светодиода на время запуска ардуино

}

// основной цикл:

void loop()  {
  
  on = digitalRead (pin);
  if (on > 0 && i < 255) //Здесь плавно зажигаем 
  { 
    
    i = i + 1;
    analogWrite(led,i); 
    f_time = 0;
    delay (23);
  }
   
 
 if (on==0 && i>0)  //Здесь плавно тушим и останавливаем
  {
   if(f_time==0)
	{
	start_time = millis(); 
	f_time=1;
	}
  if(millis()>= start_time + TIME){
    i = i - 1;
    analogWrite(led,i); 
    delay (23);
   }
  }
  
}

 

voriag1
Offline
Зарегистрирован: 28.11.2015

появилась задержка на включение, а после включения и прохождения 10 сек не гаснет

voriag1
Offline
Зарегистрирован: 28.11.2015

а что дает строчка f_time=1;

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

Это флаг для фиксации времени один раз

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

Даже не знаю что сказать, должно работать. Попробуйте еще так

int led = 9;  //LED Pin
int pin = 10;
int i=0;
int on=0;
int f_time = 0;



//unsigned long TIME = 10000; //В миллисекундах (10сек) время работы светодиода после запуска
unsigned long start_time = 0; //время когда был зажжон светодиод

void setup()
{
  pinMode(led, OUTPUT);//светодиод
  pinMode (pin, INPUT);//кнолпка
  pinMode(led, LOW);//состояние светодиода на время запуска ардуино

}

// основной цикл:

void loop()  {
  
  on = digitalRead (pin);
  if (on > 0 && i < 255) //Здесь плавно зажигаем 
  { 
    
    i = i + 1;
    analogWrite(led,i); 
    f_time = 0;
    delay (23);
  }
   
 
 if (on==0 && i>0)  //Здесь плавно тушим и останавливаем
  {
   if(f_time==0)
    {
     start_time = millis(); 
     f_time=1;
    }

  if(millis() - start_time >= 10000){
    i = i - 1;
    analogWrite(led,i); 
    delay (23);
   }
  }
  
}

 

voriag1
Offline
Зарегистрирован: 28.11.2015

работает но не так, зажигается с задержкой и гаснет только при отключении кнопки

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

Понял,тогда давайте розбираться с логикой. 1) Вы открыли дверь свет должен загореться - Чему при этом будет равен on ==1 или on==0

2) Вы закрыли дверь, нужно подождать 10 секунд и плавно потушить свет. Если я правильно понял напишите чему равен on при открытой двери

voriag1
Offline
Зарегистрирован: 28.11.2015

Правильно. открыли  дверь появился минус, это получается== 1  закрыли, минус пропал. 

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

Минус появился где на digitalRead (pin)? Если так то минус никогда не распознавался как 1  это есть 0

voriag1
Offline
Зарегистрирован: 28.11.2015

тогда я не прав, появляется 0

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
int led = 9;  //LED Pin
int pin = 10;
int i=0;
int on=0;
int f_time = 0;



//unsigned long TIME = 10000; //В миллисекундах (10сек) время работы светодиода после запуска
unsigned long start_time = 0; //время когда был зажжон светодиод

void setup()
{
  pinMode(led, OUTPUT);//светодиод
  pinMode (pin, INPUT_PULLUP);//кнолпка пин, как вход + подтягивающий резистор
  pinMode(led, LOW);//состояние светодиода на время запуска ардуино

}

// основной цикл:

void loop()  {
  
  on = digitalRead (pin);
  if (on == 0 && i < 255) //Здесь плавно зажигаем 
  { 
    
    i = i + 1;
    analogWrite(led,i); 
    f_time = 0;
    delay (23);
  }
   
 
 if (on > 0 && i>0)  //Здесь плавно тушим и останавливаем
  {
   if(f_time==0)
    {
     start_time = millis(); 
     f_time=1;
    }

  if(millis() - start_time >= 10000){
    i = i - 1;
    analogWrite(led,i); 
    delay (23);
   }
  }
  
}

 

voriag1
Offline
Зарегистрирован: 28.11.2015

Спасибо, что потратили время но все равно, не то, сломал уже себе голову.

Скажите,а можно подключить на прямую ногу ардуино к -12, чтобы получить логический 0?

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

Нет нельзя сгорит 12>5 в 2 слишним раза. Лучше использовать оптоторн.

voriag1
Offline
Зарегистрирован: 28.11.2015

земля же вроде общая

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

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

Лучше использовать оптоторн.

voriag1
Offline
Зарегистрирован: 28.11.2015

понял, спасибо