Помогите написать простенькую программу.

SuperTesto
Offline
Зарегистрирован: 10.06.2016

Помогите написать код: при кручении потенциометра по часовой стрелке один светодиод увеличивает яркость, а второй наоборот - уменьшает. 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016
Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

поможем конечно, давай свой код... или давай

void setup
{

}
void loop
{

}

я начну...

alexvs
Offline
Зарегистрирован: 22.07.2014

Mr.Privet пишет:

поможем конечно, давай свой код... или давай

void setup
{

}
void loop
{

}

я начну...

Типа крестики-нолики или морской бой?

Stas0232
Offline
Зарегистрирован: 11.06.2016
val = analogRead(pin_1);
analogWrite(pin_2, val / 4);
analogWrite(pin_3, (1023 - val) / 4);

Вроде как так.

SuperTesto
Offline
Зарегистрирован: 10.06.2016

.

SuperTesto
Offline
Зарегистрирован: 10.06.2016

Mr.Privet пишет:

поможем конечно, давай свой код... или давай

void setup
{

}
void loop
{

}

я начну...

Вот мой код, но он только для 1 диода. 

// даём имена пинов со светодиодом

// и потенциометром

#define led 9

#define pot A0

void setup()

{

// пин со светодиодом — выход

pinMode(led, OUTPUT);

// пин с потенциометром - вход

pinMode(pot, INPUT);

}

void loop()

{

// объявляем переменную x

int x;

// считываем напряжение с потенциометра:

// будет получено число от 0 до 1023

// делим его на 4, получится число в диапозоне

// 0-255 (дробная часть будет отброшена)

x = analogRead(pot) / 4;

// выдаём результат на светодиод

analogWrite(led, x);

}

 

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

продолжаем...

#define pin_2 A1
#define pin_3 A2
#dafine pin_1 A0
void setup
{
pinMode(pin_led_1,OUTPUT);
pinMode(pin_led_2,OUTPUT);
pinMode(pin_pot,INPUT);
}
void loop
{
int val = analogRead(pin_1);
analogWrite(pin_2, val / 4);
analogWrite(pin_3, (1023 - val) / 4);
}

ну пины свои поставь...

SuperTesto
Offline
Зарегистрирован: 10.06.2016

Mr.Privet пишет:

продолжаем...

#define pin_2 A1
#define pin_3 A2
#dafine pin_1 A0
void setup
{
pinMode(pin_led_1,OUTPUT);
pinMode(pin_led_2,OUTPUT);
pinMode(pin_pot,INPUT);
}
void loop
{
int val = analogRead(pin_1);
analogWrite(pin_2, val / 4);
analogWrite(pin_3, (1023 - val) / 4);
}

ну пины свои поставь...

Загрузил вот такой код, не работает. 

#define led 9
#define pot A0
#define led2 11

void setup()
{
  pinMode(led, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(pot, INPUT);
}

void loop()
{
  int x = analogRead(pot) / 4;
  analogWrite(led, x / 4);
  analogWrite(led2, (1023 - x) / 4);
}

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Два раза на 4  зачем дЕлите?

У вас диапазон для первого леда получается  0 - 64,  для второго  255 - 191

Stas0232
Offline
Зарегистрирован: 11.06.2016

SuperTesto пишет:

Загрузил вот такой код, не работает. 

#define led 9
#define pot A0
#define led2 11

void setup()
{
  pinMode(led, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(pot, INPUT);
}

void loop()
{
  int x = analogRead(pot) / 4;
  analogWrite(led, x / 4);
  analogWrite(led2, (1023 - x) / 4);
}

Ну это не совсем правда. Он работает, просто не особо заметны изменения. Выше в посте уже было написано. Из вот этой строки 

int x = analogRead(pot) / 4;

нужно убрать "/4".

с A0 вы получаете значение в диапазоне 0-1023, а на пины 9 и 11 выдавать должны 0-255, в итоге просто при подаче на пины вы и делите полученные 0-1023 на 4 и получаете 0-255. Перейдите выше по ссылкам на функции analogRead() и analogWrite(), там все описано.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Stas0232 пишет:

SuperTesto пишет:

void loop()
{
  int x = analogRead(pot) / 4;
  analogWrite(led, x / 4);
  analogWrite(led2, (1023 - x) / 4);
}

Ну это не совсем правда. Он работает, просто не особо заметны изменения. Выше в посте уже было написано. Из вот этой строки 

int x = analogRead(pot) / 4;

нужно убрать "/4".

с A0 вы получаете значение в диапазоне 0-1023, а на пины 9 и 11 выдавать должны 0-255, в итоге просто при подаче на пины вы и делите полученные 0-1023 на 4 и получаете 0-255. Перейдите выше по ссылкам на функции analogRead() и analogWrite(), там все описано.

Логичнее и красивее сначала поделить....

void loop() { 
   int x = analogRead(pot) / 4; 
   analogWrite(led, x ); 
   analogWrite(led2, (255 - x)); 
}

 

SuperTesto
Offline
Зарегистрирован: 10.06.2016

Stas0232 пишет:

SuperTesto пишет:

Загрузил вот такой код, не работает. 

#define led 9
#define pot A0
#define led2 11

void setup()
{
  pinMode(led, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(pot, INPUT);
}

void loop()
{
  int x = analogRead(pot) / 4;
  analogWrite(led, x / 4);
  analogWrite(led2, (1023 - x) / 4);
}

Ну это не совсем правда. Он работает, просто не особо заметны изменения. Выше в посте уже было написано. Из вот этой строки 

int x = analogRead(pot) / 4;

нужно убрать "/4".

с A0 вы получаете значение в диапазоне 0-1023, а на пины 9 и 11 выдавать должны 0-255, в итоге просто при подаче на пины вы и делите полученные 0-1023 на 4 и получаете 0-255. Перейдите выше по ссылкам на функции analogRead() и analogWrite(), там все описано.

Исправил, всё равно плохо работает, при максимальном значении потенциометра диод не тухнет.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

выводите в сериал значения которые у вас получаются при максимальном потенциометре, и отрегулируйте диапазон функцией map http://arduino.ru/Reference/Map

SuperTesto
Offline
Зарегистрирован: 10.06.2016

Куда регулировать то, я просто новичок в программировании пока. С таким кодом всё тоже самое 

#define led 9
#define pot A0
#define led2 11

void setup()
{
  pinMode(led, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(pot, INPUT);
}

void loop()
{
  int val = analogRead(pot);
  int val2 = analogRead(pot);
  val = map(val, 0, 1023, 0, 255);
  analogWrite(led, val);
  val2 = map(val2, 0, 1023, 255, 0);
  analogWrite(led2, val2);
}

 

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

просто когда у Вас потенциометр выкручен полностью у Вас на вход приходит не 0, а скажем 400, попробуйте в строках 16 и 18 вместо первого 0 подставлять значения 200,300,400,500 пока не получите желаемый результат

Stas0232
Offline
Зарегистрирован: 11.06.2016

Видимо "SuperTesto" нужно более конкретное описание действий. Ну не всем охото рыться долгое время в источниках нужной инфы, чтобы сделать простенькую програмку. Поэтому напишу более развернуто.

Сперва залейте такой скетч и откройте монитор компорта(в верхнем правом углу arduino IDE). 

#define led 9
#define pot A0
#define led2 11

void setup()
{
  pinMode(led, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(pot, INPUT); 
  Serial.begin(9600);
}

void loop()
{
  int val = analogRead(pot);
  Serial.print("P ---> ");
  Serial.println(val);
  val = map(val, 0, 1023, 0, 255);
  analogWrite(led, val);
  analogWrite(led2, 255 - val);
  //delay(1000);
}

Должны приходить значения в диапазоне 0-1023 приходящие с потенциометра(правда будет спамить. Если спам мешает, то раскомментируйте строку //delay(1000);). Выкрутите потенциометр до предела на минимум - посмотрите что приходит на компорт, потом выкрутите до максимума - снова гляньте значения в компорту. В принципе это и есть ваш "реальный" диапазон. От него и нужно отталкиваться. Если дальше не получится, то пишите.

P.S. а да, я выкинул из вашего кода все касающееся val2. У вас данные приходят с одного потенциометра. Просто первый светодиод у вас будет увеличивать яркость симметрично возрастанию значения на потенциометре(от 0 до 255), а второй наоборот это полученное значение будет отнимать от маскимума и уменьшаться(от 255 до 0).