Помогите разобраться новичку

shuher781
Offline
Зарегистрирован: 14.07.2014

Собрал светильник для морского аквариума ! Запитал от 9 пин с шим изменением яркости ! Проще говоря все четыре сборки светодиодов запитаны от одного пин ! Хотелось бы запитать от нескольких выходов - но не знаю как написать прогу ! Сейчас пользуюсь вот этой только немного измененой. ! /*

 Пример управления яркостью светодиода
 на выходе 9 контроллера Arduino
 функцией analogWrite().
 */
int brightness = 0;    // уставливаем начально значение яркости
int fadeAmount = 5;    // шаг приращения/убывания яркости
 
void setup()  {
  // устанваливаем пин 9 в режим выхода
  pinMode(9, OUTPUT);
}
 
void loop()  {
  // устанавливаем значение широты импульса на выходе 9
  // задавая яркость светодиода
  analogWrite(9, brightness);   
 
  // измением значение в переменной для яркости
  brightness = brightness + fadeAmount;
 
  // при достижение крайних значений для яркости
  // меняем знак переменной шага приращения/убывания яркости
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;
  }   
  // делаем паузу для достижения плавного наращивания/убывания яркости  
  delay(30);                           
}
как вписать другие пины для изменения шим ? Заранее благодарен ! 
 
shuher781
Offline
Зарегистрирован: 14.07.2014

По сути нужен рассвет и закат ! 

shuher781
Offline
Зарегистрирован: 14.07.2014

Нужен простейший пример для дольнейшей разработки ! 

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

как вы представляете рассвет и закат на светоидодах? просто плавное включение и выключение?

shuher781
Offline
Зарегистрирован: 14.07.2014

Да но рассвет примерно должен занимать около двух часов ! 

shuher781
Offline
Зарегистрирован: 14.07.2014

И на четырех пинах - раздная яркость ! 

shuher781
Offline
Зарегистрирован: 14.07.2014

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

zhenious
Offline
Зарегистрирован: 03.07.2014

2 часа = 7 200 000 мс

ШИМ = 256 единиц

7200000/256 = 28125 мс

ставите delay(28125) и будет вам 2х часовой рассвет !

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

У Вас дядя на фабрике восклицательных знаков работает? Или Вы так нас заинтересовать пытаетесь?

Если Вы не понимаете как работает скрипт из 20 строчек, то либо учиться с начала (например моргать дидом), либо в "ищу исполнителя"

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

много писать. почитайте сначала

http://arduino.ru/Reference/AnalogWrite

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

shuher781
Offline
Зарегистрирован: 14.07.2014

Пока просто что бы сначала разгорался один канал предположим до 50 процентов потом второй и так далее . Сейчас все каналы разгораются одновременно и с одинаковой мощностью .

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

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

а дальше уже программу писать

shuher781
Offline
Зарегистрирован: 14.07.2014

Куда цеплять я разобрался ! Прблема с прогой - как написать на несколько пинов . Нужен пример ( простой пример ) я задействовал 9 пин как задействовать следующий в программе ? 

shuher781
Offline
Зарегистрирован: 14.07.2014

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
analogWrite(11, 127);

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

потренируйтесь сначала в uart слать числа из цикла например

почитайте 

http://arduino.ru/Reference

shuher781
Offline
Зарегистрирован: 14.07.2014

С начала я написал прогу по этому примеру - // даём разумное имя для пина №9 со светодиодом

// (англ. Light Emitting Diode или просто «LED»)
// Так нам не нужно постоянно вспоминать куда он подключён
#define LED_PIN 9
 
void setup()
{
  // настраиваем пин со светодиодом в режим выхода,
  // как и раньше
  pinMode(LED_PIN, OUTPUT);
}
 
void loop()
{
  // выдаём неполное напряжение на светодиод
  // (он же ШИМ-сигнал, он же PWM-сигнал).
  // Микроконтроллер переводит число от 0 до 255 к напряжению
  // от 0 до 5 В. Например, 85 — это 1/3 от 255,
  // т.е. 1/3 от 5 В, т.е. 1,66 В.
  analogWrite(LED_PIN, 1);
  // держим такую яркость 6000миллисекунд
  delay(6000);
НУ И ТОГДАЛЕЕ ДО 255 и дальше на понижение 
 
  // выдаём 170, т.е. 2/3 от 255, или иными словами — 3,33 В.
  // Больше напряжение — выше яркость!
  analogWrite(LED_PIN, 170);
  delay(250);
 
  // все 5 В — полный накал!
  analogWrite(LED_PIN, 255);
  // ждём ещё немного перед тем, как начать всё заново
  delay(250);
}
в принципе все устраивает - но опять же нужно на насколько каналов ! 
shuher781
Offline
Зарегистрирован: 14.07.2014

Как вписать сюда 11 пин  ? 

shuher781
Offline
Зарегистрирован: 14.07.2014

Те же функции для 11 го пина ? 

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

почитайте как правильно вставлять код

http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

делаем еще один пин на выход, черзе analogWrite управляем на этом пине шимом

фунция таже, только пин другой

shuher781
Offline
Зарегистрирован: 14.07.2014

Может кто сможет написать пример а не перенаправлять на другие ветки ? // даём разумное имя для пина №9 со светодиодом

// (англ. Light Emitting Diode или просто «LED»)
// Так нам не нужно постоянно вспоминать куда он подключён
#define LED_PIN 9
 
void setup()
{
  // настраиваем пин со светодиодом в режим выхода,
  // как и раньше
  pinMode(LED_PIN, OUTPUT);
}
 
void loop()
{
  // выдаём неполное напряжение на светодиод
  // (он же ШИМ-сигнал, он же PWM-сигнал).
  // Микроконтроллер переводит число от 0 до 255 к напряжению
  // от 0 до 5 В. Например, 85 — это 1/3 от 255,
  // т.е. 1/3 от 5 В, т.е. 1,66 В.
  analogWrite(LED_PIN, 85);
  // держим такую яркость 250 миллисекунд
  delay(250);
 
  // выдаём 170, т.е. 2/3 от 255, или иными словами — 3,33 В.
  // Больше напряжение — выше яркость!
  analogWrite(LED_PIN, 170);
  delay(250);
 
  // все 5 В — полный накал!
  analogWrite(LED_PIN, 255);
  // ждём ещё немного перед тем, как начать всё заново
  delay(250);
}
пример для 9 го пина как вставить в программу 11 пин к примеру . Требуется разгорание одного канала потом следующего и тд и далее затухание ??????? Как все это соединить в одну прогу ? 
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

какие другие ветки? это инфа для обучения, чтобы вы понимали о чем я вам говорю и правильно вставляли код

shuher781
Offline
Зарегистрирован: 14.07.2014

Я прочитал все инструкции - там сказано только про один пин как связать два пина не сказано ! 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

jeka_tm пишет:

какие другие ветки? это инфа для обучения, чтобы вы понимали о чем я вам говорю и правильно вставляли код

Гы. Ему не нужна инфа для обучения. Ему нужен готовый код, что тут не понятного? Ну-ка быстро метнулся и накатал! И поблагодарить потом не забудь!

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

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

а по программе я уже сказал как

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

это я понимаю. но пусть пытается. не писать же за него. это просто, поэтому сам дойдет если намекнуть как

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

shuher781
Offline
Зарегистрирован: 14.07.2014

Поясните пожалуста - я нажимаю на кнопку вставить код и вставляю прогу для другого пина в разрыв своей проги ( в любом месте ) ? Я правильно понял ? 

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

вставляете код и код вставится в тексте. а про разрыв не понял

вы хоть попробуйте

shuher781
Offline
Зарегистрирован: 14.07.2014
/*
 Пример управления яркостью светодиода
 на выходе 9 контроллера Arduino
 функцией analogWrite().
 */
int brightness = 0;    // уставливаем начально значение яркости
int fadeAmount = 5;    // шаг приращения/убывания яркости
 
void setup()  {
  // устанваливаем пин 9 в режим выхода
  pinMode(9, OUTPUT);
}
 
void loop()  {
  // устанавливаем значение широты импульса на выходе 9
  // задавая яркость светодиода
  analogWrite(9, brightness);   
 
  // измением значение в переменной для яркости
  brightness = brightness + fadeAmount;
 
  // при достижение крайних значений для яркости
  // меняем знак переменной шага приращения/убывания яркости
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;
  }   
  // делаем паузу для достижения плавного наращивания/убывания яркости  
  delay(30);                           
}
/*
 Пример управления яркостью светодиода
 на выходе 9 контроллера Arduino
 функцией analogWrite().
 */
int brightness = 0;    // уставливаем начально значение яркости
int fadeAmount = 5;    // шаг приращения/убывания яркости
 
void setup()  {
  // устанваливаем пин 9 в режим выхода
  pinMode(11, OUTPUT);
}
 
void loop()  {
  // устанавливаем значение широты импульса на выходе 9
  // задавая яркость светодиода
  analogWrite(9, brightness);   
 
  // измением значение в переменной для яркости
  brightness = brightness + fadeAmount;
 
  // при достижение крайних значений для яркости
  // меняем знак переменной шага приращения/убывания яркости
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;
  }   
  // делаем паузу для достижения плавного наращивания/убывания яркости  
  delay(30);                           
}
Как то так ? 
 
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

читайте еще раз))) не так

http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

оформление должно стать таким
и только таким
а не в кавычки и т.п.

 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Внизу кнопка - "предпросмотр". Без отправки...

shuher781
Offline
Зарегистрирован: 14.07.2014
/*
 Пример управления яркостью светодиода
 на выходе 9 контроллера Arduino
 функцией analogWrite().
 */
int brightness = 0;    // уставливаем начально значение яркости
int fadeAmount = 5;    // шаг приращения/убывания яркости
 
void setup()  {
  // устанваливаем пин 9 в режим выхода
  pinMode(9, OUTPUT);
}
 
void loop()  {
  // устанавливаем значение широты импульса на выходе 9
  // задавая яркость светодиода
  analogWrite(9, brightness);   
 
  // измением значение в переменной для яркости
  brightness = brightness + fadeAmount;
 
  // при достижение крайних значений для яркости
  // меняем знак переменной шага приращения/убывания яркости
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;
  }   
  // делаем паузу для достижения плавного наращивания/убывания яркости  
  delay(30);                           
}
/*
 Пример управления яркостью светодиода
 на выходе 9 контроллера Arduino
 функцией analogWrite().
 */
int brightness = 0;    // уставливаем начально значение яркости
int fadeAmount = 5;    // шаг приращения/убывания яркости
 
void setup()  {
  // устанваливаем пин 9 в режим выхода
  pinMode(11, OUTPUT);
}
 
void loop()  {
  // устанавливаем значение широты импульса на выходе 9
  // задавая яркость светодиода
  analogWrite(11, brightness);   
 
  // измением значение в переменной для яркости
  brightness = brightness + fadeAmount;
 
  // при достижение крайних значений для яркости
  // меняем знак переменной шага приращения/убывания яркости
  if (brightness == 0 || brightness == 200) {
    fadeAmount = -fadeAmount ;
  }   
  // делаем паузу для достижения плавного наращивания/убывания яркости  
  delay(30);                           
}

ЧТО НЕ ТАК ? 

 

shuher781
Offline
Зарегистрирован: 14.07.2014

И так можно добавлять сколько угодно пинов ? 

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

читайте снова))) похоже вы очень невнимательно читаете, или читаете не все

http://arduino.ru/Reference/AnalogWrite

 

shuher781
Offline
Зарегистрирован: 14.07.2014
/*
 Пример управления яркостью светодиода
 на выходе 9 контроллера Arduino
 функцией analogWrite().
 */
int brightness = 0;    // уставливаем начально значение яркости
int fadeAmount = 5;    // шаг приращения/убывания яркости
 
void setup()  {
  // устанваливаем пин 9 в режим выхода
  pinMode(11, OUTPUT);
}
 
void loop()  {
  // устанавливаем значение широты импульса на выходе 9
  // задавая яркость светодиода
  analogWrite(11, brightness);   
 
  // измением значение в переменной для яркости
  brightness = brightness + fadeAmount;
 
  // при достижение крайних значений для яркости
  // меняем знак переменной шага приращения/убывания яркости
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;
  }   
  // делаем паузу для достижения плавного наращивания/убывания яркости  
  delay(30);                           
}
Оба скетча нужно вставлять через эту кнопку ?

 

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

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

почитали только на каких пинах есть аппаратный шим?

 

shuher781
Offline
Зарегистрирован: 14.07.2014

Спасибо за помощь ! Я думаю методом тыка я и сам разберусь ! Извените за отнятое время ! 

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

вот именно. то что вам нужно делатья вам сказал. объявить 2 пина и управлять ими. хоть один за другим

передали на 1 пин, следующей строкой на второй и делаете дальше что нужно. экспериментируйте, так интереснее

если бы задача более сложная была еще понадобилась помощь, а тут и сами разберетесь

shuher781
Offline
Зарегистрирован: 14.07.2014

Да я то разберусь - могли бы и наглядно показать ! А так умничать знающий в своей сфере может каждый ! 

shuher781
Offline
Зарегистрирован: 14.07.2014

Что вы делаете на этом форуме с 2012 года гыкаете ? А наглядно помочь - я думаю будет толку как от козла - молока ! 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

shuher781 пишет:

Что вы делаете на этом форуме с 2012 года гыкаете ? А наглядно помочь - я думаю будет толку как от козла - молока ! 

А Вы не думайте, Вам это похоже вредно. И как раз поэтому "наглядно" и не помогаем - будет толку как от козла - молока !(с) Конечно же Ваш.

 

shuher781
Offline
Зарегистрирован: 14.07.2014

Я разобрался ! Добрый человек накидал скетч - немного именю и вуаля ! А вам советую не умничать - люди не любят умников ! А да вам советы не нужны - вы и так все знаете ! 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

shuher781 пишет:

Я разобрался ! Добрый человек накидал скетч - немного именю и вуаля ! А вам советую не умничать - люди не любят умников ! А да вам советы не нужны - вы и так все знаете ! 


А вы думаете нам нужна любовь тупых людей которые даже основы не могут прочитать и осмыслить. Я сильно сомневаюсь что вы специалист в какой либо области, исключая уборку помещений.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Ну вот зачем сразу так взять и обидеть? Теперь уборщицы расстроены...

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Упссс ты думаешь они нас читают?

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

а ты думал они на распбери? Или, окстись!, на пандаборде работают?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Конечно на пандаборде, они любят панд и там круче полюбому

Leshiy
Offline
Зарегистрирован: 19.07.2014

Таки я не понял, ленты должны загоратся плавно и последовательно? Сначала одна лента плавно зажигается два часа, потом другая итд? Или ленты должны зажигаться одновременно, но с разной скоростью? Типа одна светит на 100%, вторая на 75%, третья на 50%, четвёртая на 25%? Должны, в итоге, ленты светить с одинаковой яркостью, или нет?

Так-то вроде не особо сложно всё выходит, только вот внятного описания задачи и нет, есть код, который "чота не так работает" и вопрос, как сделать, чтобы он "так работал". А как "так" и непонятно.

Coffe_Box
Offline
Зарегистрирован: 25.07.2014

Доброго времени суток, заранее извиняюсь за так сказать "изврат" в идее, а идея такова: Нужно собрать DJ Деку на Arduino Uno R3. Не буду томить и так к сути.

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

При компиляции вылетают ошибки. как я понял все они вызваны тем что скетч был написан довольно давно и на новом софте работает не правильно. скажите пожалуйста как это можно исправить или переписать.

Код скетча:

//---FOR DEBUG
//#include <SoftwareSerial.h>
//---FOR DEBUG

#include <MIDI.h>
#include <A5020.h>

// MIDI Channel
#define CHANNEL_1 1

// TODO:H/W (10 less than ideal setting value) do NOT make a noise suppression
#define VIBRATE_FILTER 15
#define DIGITAL_THRESHOLD 1000

// Numark MIXTRACK
#define DECK_A_PLAY 0x3B
#define DECK_B_PLAY 0x42
#define DECK_A_CUE 0x33
#define DECK_B_CUE 0x3C
#define DECK_A_SYNC 0x40
#define DECK_B_SYNC 0x47
#define DECK_A_SHUTTER 0x4A
#define DECK_B_SHUTTER 0x4C
#define DECK_A_SCRATCH 0x48
#define DECK_B_SCRATCH 0x50
#define DECK_A_VOLUME 0x08
#define DECK_B_VOLUME 0x09
#define DECK_A_PFL 0x65
#define DECK_B_PFL 0x66
#define DECK_A_EQ_HI 0x10
#define DECK_B_EQ_HI 0x11
#define DECK_A_EQ_MID 0x12
#define DECK_B_EQ_MID 0x13
#define DECK_A_EQ_LO 0x14
#define DECK_B_EQ_LO 0x15
#define DECK_A_FIL 0x21
#define DECK_B_FIL 0x22
#define DECK_A_JOG 0x19
#define DECK_B_JOG 0x18
#define DECK_A_JOGTOUCH 0x4E
#define DECK_B_JOGTOUCH 0x4D
#define DECK_A_FX 0x63
#define DECK_B_FX 0x64
#define DECK_A_DRYWET 0x1C
#define DECK_B_DRYWET 0x1F
#define DECK_A_FXAMOUNT 0x1D
#define DECK_B_FXAMOUNT 0x20
#define DECK_A_FXSELECT 0x1B
#define DECK_B_FXSELECT 0x1E
#define CROSSFADER 0x0A
#define HEAD_VOLUME 0x0B
#define HEAD_MIX 0x0C
#define MASTER_VOLUME 0x17

//MUX Control pins
#define CONTROL0 5    
#define CONTROL1 4
#define CONTROL2 3
#define CONTROL3 2

//MUX Input pins
#define MUX0 0
#define MUX1 1
#define MUX2 2

//PWM Pin
#define PWM_PIN 7
// MIN:7
#define INTERVAL_ON 9
#define INTERVAL_OFF 35
 int pwm_count = 0;

//LED Address
enum ledStatus{
  STOP = 0x01,
  PLAY = 0x02,
  HEADOFF = 0x04,
  HEADON = 0x08,
  SCH = 0x10,
  SYNC = 0x20,
  FX = 0x40,
  NOTASSIGN = 0x80,
};

// Port Type
// 0 => DIGITAL, 1 => ANALOG, 2=> UNUSE
//
const unsigned int portTypeMux0[16] = {
  //2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
  0,0,0,0,0,0,1,1,0,2,2,2,2,2,2,2
    //2,2,2,2,2,0,1,1,2,2,2,2,2,2,2,2
};
const unsigned int portTypeMux1[16] = {
  0,0,0,0,0,0,1,1,0,2,2,2,2,2,2,2
    //2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
};
const unsigned int portTypeMux2[16] = {
  1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2
    //2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
};

//Pin Assign
const unsigned char ifAssignMux0[16] = {
  DECK_A_PLAY,
  DECK_A_CUE,
  DECK_A_SYNC,
  DECK_A_SHUTTER,
  DECK_A_PFL,
  DECK_A_FX,
  DECK_A_DRYWET,
  DECK_A_FXAMOUNT,
  DECK_A_SCRATCH,
  0,0,0,0,0,0,0
};
const unsigned char ifAssignMux1[16] = {
  DECK_B_PLAY,
  DECK_B_CUE,
  DECK_B_SYNC,
  DECK_B_SHUTTER,
  DECK_B_PFL,
  DECK_B_FX,
  DECK_B_DRYWET,
  DECK_B_FXAMOUNT,
  DECK_B_SCRATCH,
  0,0,0,0,0,0,0
};
const unsigned char ifAssignMux2[16] = {
  DECK_A_EQ_HI,
  DECK_A_EQ_MID,
  DECK_A_EQ_LO,
  DECK_A_FIL,
  DECK_B_EQ_HI,
  DECK_B_EQ_MID,
  DECK_B_EQ_LO,
  DECK_B_FIL,
  HEAD_VOLUME,
  HEAD_MIX,
  DECK_A_VOLUME,
  DECK_B_VOLUME,
  CROSSFADER,0,0,0
};

//MUXValue
//M0
int currMux0Value[16] = {
  0};
int prevMux0Value[16] = {
  0};
int diffAnalogValueMux0;
//M1
int currMux1Value[16] = {
  0};
int prevMux1Value[16] = {
  0};
int diffAnalogValueMux1;
//M2
int currMux2Value[16] = {
  0};
int prevMux2Value[16] = {
  0};
int diffAnalogValueMux2;

// Display state of LED 
// With define what LED is or has been assigned to each array
char ledStatus_decka = 0xFF;
char ledStatus_deckb = 0xFF;

// Shift register pin
const int latchPin = 17;
const int clockPin = 18;
const int dataPin = 19;

//(clock(green), data(white), ncs(purple))   
A5020 jog_a(8,9,10);
A5020 jog_b(11,12,13);
char jog_a_touched = 0;
char jog_b_touched = 0;

//---FOR DEBUG
//SoftwareSerial mySerial(11, 12, true);
//---FOR DEBUG

void setup() {
  // mySerial.begin(9600);
  // mySerial.println("Hello, world?");

  // Initialization of the shift register pin
  pinMode(latchPin, OUTPUT);
  // Initialization of LED
  ledRenew();

  // MUX I want to control the OUTPUT pin
  pinMode(CONTROL0, OUTPUT);
  pinMode(CONTROL1, OUTPUT);
  pinMode(CONTROL2, OUTPUT);
  pinMode(CONTROL3, OUTPUT);

  // Fan control pin
  pinMode(PWM_PIN, OUTPUT);
  digitalWrite(PWM_PIN, 1);
  delay(300);


  // Initialize the optical sensor
  jog_a.reset();
  delay(100);
  jog_b.reset();
  delay(100);

  // MIDI (Open serial baud rate 31250) library initialization
  MIDI.begin(MIDI_CHANNEL_OMNI);
  //MIDI.turnThruOff();
  MIDI.setHandleNoteOn(HandleNoteOn);
  MIDI.setHandleNoteOff(HandleNoteOff);
  MIDI.setHandleControlChange(HandleControlChange);
  Serial.begin(38400);

  // setup Notice in the light of the completion
  digitalWrite(latchPin, 0);
  shiftOut(dataPin, clockPin, 0xFF);   
  shiftOut(dataPin, clockPin, 0xFF);
  digitalWrite(latchPin, 1);
  delay(300);
  digitalWrite(latchPin, 0);
  shiftOut(dataPin, clockPin, 0x00);   
  shiftOut(dataPin, clockPin, 0x00);
  digitalWrite(latchPin, 1);
}

void loop() {
  for (int i=0; i<16; i++){
    // MUX Control of(0000~1111)
    digitalWrite(CONTROL0, (i&15)>>3); 
    digitalWrite(CONTROL1, (i&7)>>2);  
    digitalWrite(CONTROL2, (i&3)>>1);  
    digitalWrite(CONTROL3, (i&1));     

    // MUX Value of reading
    currMux0Value[i] = analogRead(MUX0);
    currMux1Value[i] = analogRead(MUX1);
    currMux2Value[i] = analogRead(MUX2);

    // Compared with the previous reading
    diffAnalogValueMux0 = abs(currMux0Value[i] - prevMux0Value[i]);
    diffAnalogValueMux1 = abs(currMux1Value[i] - prevMux1Value[i]);
    diffAnalogValueMux2 = abs(currMux2Value[i] - prevMux2Value[i]);

    // Mux0
    if(currMux0Value[i] != prevMux0Value[i]){
      // In the case of: (0 port type) digital port
      if(portTypeMux0[i] == 0){
        if(diffAnalogValueMux0 >= DIGITAL_THRESHOLD){
          MIDI.sendNoteOn(ifAssignMux0[i], convAD(currMux0Value[i]), CHANNEL_1);
          prevMux0Value[i] = currMux0Value[i];
        }
      }
      else if(portTypeMux0[i] == 1){
        // If not noise, and output as CC readings
        if(diffAnalogValueMux0 >= VIBRATE_FILTER){
          MIDI.sendControlChange(ifAssignMux0[i], currMux0Value[i]/8, CHANNEL_1);
          prevMux0Value[i] = currMux0Value[i];
        }
      }
      else if(portTypeMux0[i] == 2){
        // It is not nothing
      }
    }

    // Mux1
    if(currMux1Value[i] != prevMux1Value[i]){
      // In the case of: (0 port type) digital port
      if(portTypeMux1[i] == 0){
        if(diffAnalogValueMux1 >= DIGITAL_THRESHOLD){
          MIDI.sendNoteOn(ifAssignMux1[i], convAD(currMux1Value[i]), CHANNEL_1);
          prevMux1Value[i] = currMux1Value[i];
        }
      }
      else if(portTypeMux1[i] == 1){
        // If not noise, and output as CC readings
        if(diffAnalogValueMux1 >= VIBRATE_FILTER){
          MIDI.sendControlChange(ifAssignMux1[i], currMux1Value[i]/8, CHANNEL_1);
          prevMux1Value[i] = currMux1Value[i];
        }
      }
      else if(portTypeMux1[i] == 2){
        // It is not nothing
      }
    }

    // Mux2
    if(currMux2Value[i] != prevMux2Value[i]){
      // In the case of: (0 port type) digital port
      if(portTypeMux2[i] == 0){
        if(diffAnalogValueMux2 >= DIGITAL_THRESHOLD){
          MIDI.sendNoteOn(ifAssignMux2[i], convAD(currMux2Value[i]), CHANNEL_1);
          //ccSend(1,ifAssignMux2[i],convAD(currMux2Value[i]));
          prevMux2Value[i] = currMux2Value[i];
        }
      }
      else if(portTypeMux2[i] == 1){
        // If not noise, and output as CC readings
        if(diffAnalogValueMux2 >= VIBRATE_FILTER){
          MIDI.sendControlChange(ifAssignMux2[i], (int)currMux2Value[i]/8, CHANNEL_1);
          //ccSend(1,ifAssignMux2[i],currMux2Value[i]/8);
          prevMux2Value[i] = currMux2Value[i];
        }
      }
      else if(portTypeMux2[i] == 2){
        // It is not nothing
      }
    }
  }

  // I read the state of the jog of A deck
  jog_a.read();
  // If there is movement, sent as MIDI data
  if(jog_a.motion){
    if(jog_a_touched == 0){
      MIDI.sendNoteOn(DECK_A_JOGTOUCH, 1, CHANNEL_1);
      jog_a_touched = 1;
    }
    MIDI.sendControlChange(DECK_A_JOG, conv_midiscale(jog_a.delta_y), CHANNEL_1);
    //Serial.println(jog_a.delta_y,DEC);
  }
  else if(jog_a_touched == 1){
    MIDI.sendNoteOn(DECK_A_JOGTOUCH, 0, CHANNEL_1);
    jog_a_touched = 0;
  }

  // I read the state of the jog of B deck
  jog_b.read();
  // If there is movement, sent as MIDI data
  if(jog_b.motion){
    if(jog_b_touched == 0){
      MIDI.sendNoteOn(DECK_B_JOGTOUCH, 1, CHANNEL_1);
      jog_b_touched = 1;
    }
    MIDI.sendControlChange(DECK_B_JOG, conv_midiscale(jog_b.delta_y), CHANNEL_1);
    //Serial.println(jog_b.delta_y,DEC);
  }
  else if(jog_b_touched == 1){
    MIDI.sendNoteOn(DECK_B_JOGTOUCH, 0, CHANNEL_1);
    jog_b_touched = 0;
  }

  // Reading MIDI data received
  MIDI.read();

  // Simple PWM to control the rotational speed of the fan
  if(digitalRead(PWM_PIN) == 1 && pwm_count == INTERVAL_ON){
    pwm_count = 0;
    digitalWrite(PWM_PIN, 0);
  }
  else if(digitalRead(PWM_PIN) == 0 && pwm_count == INTERVAL_OFF){
    pwm_count = 0;
    digitalWrite(PWM_PIN, 1);
  }
  pwm_count++;
}

char convAD(int analogVal){
  if(analogVal > DIGITAL_THRESHOLD) return 1;
  else return 0;
}

char conv_midiscale(char value){
  unsigned char range = 7;
  if (value >= 1){
    return (value / range) + 1;
  }
  else{
    return 127 + (value / range);
  }
}

void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
  // This shifts 8 bits out MSB first, 
  //on the rising edge of the clock,
  //clock idles low

  //internal function setup
  int i=0;
  int pinState;
  pinMode(myClockPin, OUTPUT);
  pinMode(myDataPin, OUTPUT);

  //clear everything out just in case to
  //prepare shift register for bit shifting
  digitalWrite(myDataPin, 0);
  digitalWrite(myClockPin, 0);

  //for each bit in the byte myDataOut
  //NOTICE THAT WE ARE COUNTING DOWN in our for loop
  //This means that %00000001 or "1" will go through such
  //that it will be pin Q0 that lights. 
  for (i=7; i>=0; i--)  {
    digitalWrite(myClockPin, 0);

    //if the value passed to myDataOut and a bitmask result 
    // true then... so if we are at i=6 and our value is
    // %11010100 it would the code compares it to %01000000 
    // and proceeds to set pinState to 1.
    if ( myDataOut & (1<<i) ) {
      pinState= 1;
    }
    else {
      pinState= 0;
    }

    //Sets the pin to HIGH or LOW depending on pinState
    digitalWrite(myDataPin, pinState);
    //register shifts bits on upstroke of clock pin  
    digitalWrite(myClockPin, 1);
    //zero the data pin after shift to prevent bleed through
    digitalWrite(myDataPin, 0);
  }

  //stop shifting
  digitalWrite(myClockPin, 0);
}

void HandleNoteOn(byte channel, byte pitch, byte velocity) {
  //mySerial.write(pitch);
  // I turn on the corresponding LED by the data at the time of NoteOn
  /*
   * When at the time of 00001000, PLAY (0x01) has been pressed the state of LED,
   * Since performing an OR operation with 0x01 and the current state,
   * 00001000 OR 00000001 = 00001001
   * Without affecting the next state, the LED on the other, the state of the LED of the corresponding
   * I can be (1) ON.
   */
  switch(pitch){
  case DECK_A_PLAY:
    ledStatus_decka &= ~PLAY;
    ledStatus_decka |= STOP;
    break;
  case DECK_B_PLAY:
    ledStatus_deckb &= ~PLAY;
    ledStatus_deckb |= STOP;
    break;
  case DECK_A_PFL:
    ledStatus_decka &= ~HEADON;
    ledStatus_decka |= HEADOFF;
    break;
  case DECK_B_PFL:
    ledStatus_deckb &= ~HEADON;
    ledStatus_deckb |= HEADOFF;
    break;
  case DECK_A_FX:
    ledStatus_decka &= ~FX;
    break;
  case DECK_B_FX:
    ledStatus_deckb &= ~FX;
    break;
  case DECK_A_SCRATCH:
    ledStatus_decka &= ~SCH;
    break;
  case DECK_B_SCRATCH:
    ledStatus_deckb &= ~SCH;
    break;
  case DECK_A_SYNC:
    ledStatus_decka &= ~SYNC;
    break;
  case DECK_B_SYNC:
    ledStatus_deckb &= ~SYNC;
  }
  ledRenew();
}

void HandleNoteOff(byte channel, byte pitch, byte velocity) {
  //mySerial.write(pitch);
  // I turn off the LED by a corresponding data at the time of NoteOn 
  /*
   * When at the time of 00001001, PLAY (0x01) has been pressed the state of LED,
   * Because it performs an AND operation between those NOT PLAY operation and the current state,
   * NOT(00000001) = 11111110
   * 00001001 AND 11111110 = 00001000
   * Without affecting the next state, the LED on the other, the state of the LED of the corresponding
   * I can be (0) OFF.
   */
  switch(pitch){
  case DECK_A_PLAY:
    ledStatus_decka |= PLAY;
    ledStatus_decka &= ~STOP;
    break;
  case DECK_B_PLAY:
    ledStatus_deckb |= PLAY;
    ledStatus_deckb &= ~STOP;
    break;
  case DECK_A_PFL:
    ledStatus_decka |= HEADON;
    ledStatus_decka &= ~HEADOFF;
    break;
  case DECK_B_PFL:
    ledStatus_deckb |= HEADON;
    ledStatus_deckb &= ~HEADOFF;
    break;
  case DECK_A_FX:
    ledStatus_decka |= FX;
    break;
  case DECK_B_FX:
    ledStatus_deckb |= FX;
    break;
  case DECK_A_SCRATCH:
    ledStatus_decka |= SCH;
    break;
  case DECK_B_SCRATCH:
    ledStatus_deckb |= SCH;
    break;
  case DECK_A_SYNC:
    ledStatus_decka |= SYNC;
    break;
  case DECK_B_SYNC:
    ledStatus_deckb |= SYNC;
    break;
  }
  ledRenew();
}

void HandleControlChange(byte channel, byte number, byte value){
  switch(number){
  case DECK_A_FXSELECT:
    /*
      * When you change the type of the effector,
      * Since the position of the knob is reset,
      * I will send the state of the knob of the controller
     */
    MIDI.sendControlChange(ifAssignMux0[7], currMux0Value[7]/8, CHANNEL_1);
    break;
  case DECK_B_FXSELECT:
    MIDI.sendControlChange(ifAssignMux1[7], currMux1Value[7]/8, CHANNEL_1);
    break;
  }
}


void ledRenew(){
  // Output LED
  digitalWrite(latchPin, 0);
  shiftOut(dataPin, clockPin, ledStatus_decka);   
  shiftOut(dataPin, clockPin, ledStatus_deckb);
  digitalWrite(latchPin, 1);
}

void ccSend(int channel, int control, int value)
{
  int channel_message;
  channel_message = 0xB0 + channel;
  Serial.write(0xB0);
  Serial.write(control);
  Serial.write(value);
}

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

о еще один, скеч на 500+ строк и ошибки которые нужно на кофейной гуще выгадывать.. чем ближе осень, тем больше обострений?

Coffe_Box
Offline
Зарегистрирован: 25.07.2014

Очень прошу, если возможно, помогите!!!! очень нужно, я прям руки опускаю незнаю как быть =( если необходимо вышлю все файлы что у меня есть если они помогут.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Coffe_Box пишет:

Очень прошу, если возможно, помогите!!!! очень нужно, я прям руки опускаю незнаю как быть =( если необходимо вышлю все файлы что у меня есть если они помогут.

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