спасибо! Но опять таки я не смогу сделать именно чтоб реагировал на трение, что лампу будут тереть, а не дотрагиваться до нее?)
А если поставить два датчика рядом, и смотреть, что включается то один то второй? (именно такое поведение будет, если его тереть)
Спасибо за помощь. Но сейчас у нас очень мало времени и мы не справляемся. Поэтому мы хотим использовать вот этот код для нашей лампы. http://blog.simtronyx.de/en/mood-la...lass-and-a-few-parts-from-the-hardware-store/ Но для вкл/выкл использовать датчик прикосновения с 4 лапками, то есть чтоб вкл/выкл нужно дотронуться до 4 сенсоров. Можете сказать пожалуйста код, который включает в себя тот код выше и соединение датчика прикосновения. (сказазала не совсем коректно, но суть понятна вроде)
Про датчик прикосновения (там же библиотека) http://www.seeedstudio.com/wiki/Grove_-_I2C_Touch_Sensor
как мы поняли, это должно быть так? Только не понятно, почему там два выхода в 5в, и куда выходят 4,5,6 нога? нужны ли вспомогательные материалы, в виде транз или резизт?
Это не 2 выхода 5 В, это просто обозначение, что эти выводы надо подключать к 5 вольтам. Так принято) Схема правильная. Правда можно 10-й вывод к 5 вольтам не подключать. Но можно и подключить) Можно обойтись без транзисторов. Резисторы должны быть на 220 Ом так, как я вам рисовал. 4,5,6 нога где? на этой схеме? На этой схеме все входы (1-7) ULN2003 должны идти на ардуино. Правда тут другая версия ULN2003 - ULN2803. Она отличается тем, что у неё 8 входов, а у ULN2003 - 7 входов.
Код (Text): unsigned char Prescaler = 0; #define PrescalerOverflowValue 4 ISR(TIMER2_OVF_vect) { if (Prescaler < PrescalerOverflowValue) Prescaler++; else { Prescaler = 0; Multiplex(); } } unsigned char CurrentLED = 1; unsigned char LEDValues[8][3]; bool LEDMoveDir[8][3]; void Multiplex(void) { PORTD &= 0b00000011; // Control pin 0-5 PORTB &= 0b11101110; // Control pin 6-7 analogWrite(9, 255-LEDValues[CurrentLED][0]); analogWrite(10, 255-LEDValues[CurrentLED][1]); analogWrite(11, 255-LEDValues[CurrentLED][2]); switch (CurrentLED) { case 0: //digitalWrite(2, 1); // Turn on LED 1 PORTD |= 0b00000100; break; case 1: //digitalWrite(3, 1); // Turn on LED 1 PORTD |= 0b00001000; break; case 2: //digitalWrite(4, 1); // Turn on LED 1 PORTD |= 0b00010000; break; case 3: //digitalWrite(5, 1); // Turn on LED 1 PORTD |= 0b00100000; break; case 4: //digitalWrite(6, 1); // Turn on LED 1 PORTD |= 0b01000000; break; case 5: //digitalWrite(7, 1); // Turn on LED 1 PORTD |= 0b10000000; break; case 6: //digitalWrite(8, 1); // Turn on LED 1 PORTB |= 0b00000001; break; case 7: //digitalWrite(12, 1); // Turn on LED 1 PORTB |= 0b00010000; break; } CurrentLED++; if (CurrentLED > 7) CurrentLED = 0; } void setPwmFrequency(int pin, int divisor) { byte mode; if(pin == 5 || pin == 6 || pin == 9 || pin == 10) { switch(divisor) { case 1: mode = 0x01; break; case 8: mode = 0x02; break; case 64: mode = 0x03; break; case 256: mode = 0x04; break; case 1024: mode = 0x05; break; default: return; } if(pin == 5 || pin == 6) { TCCR0B = TCCR0B & 0b11111000 | mode; } else { TCCR1B = TCCR1B & 0b11111000 | mode; } } else if(pin == 3 || pin == 11) { switch(divisor) { case 1: mode = 0x01; break; case 8: mode = 0x02; break; case 32: mode = 0x03; break; case 64: mode = 0x04; break; case 128: mode = 0x05; break; case 256: mode = 0x06; break; case 1024: mode = 0x7; break; default: return; } TCCR2B = TCCR2B & 0b11111000 | mode; } } int Red, Green, Blue; int Hue1, Hue2, Hue3, Hue4, Hue5, Hue6, Hue7, Hue8, Saturation, Value; void setup(void) { //Set the pin we want the ISR to toggle for output. pinMode(2,OUTPUT); pinMode(3,OUTPUT); pinMode(4,OUTPUT); pinMode(5,OUTPUT); pinMode(6,OUTPUT); pinMode(7,OUTPUT); pinMode(8,OUTPUT); pinMode(12,OUTPUT); pinMode(9,OUTPUT); pinMode(10,OUTPUT); pinMode(11,OUTPUT); digitalWrite(2, 0); // Turn off LED 4 digitalWrite(3, 0); // Turn off LED 4 digitalWrite(4, 0); // Turn off LED 4 digitalWrite(5, 0); // Turn off LED 4 digitalWrite(6, 0); // Turn off LED 4 digitalWrite(7, 0); // Turn off LED 4 digitalWrite(8, 0); // Turn off LED 4 digitalWrite(12, 0); // Turn off LED 4 digitalWrite(9, 1); digitalWrite(10, 1); digitalWrite(11, 1); setPwmFrequency(9, 8); setPwmFrequency(10, 8); setPwmFrequency(11, 8); analogWrite(9, 255); analogWrite(10, 255); analogWrite(11, 255); LEDValues[0][0] = 100; LEDValues[0][1] = 0; LEDValues[0][2] = 20; LEDValues[1][0] = 0; LEDValues[1][1] = 30; LEDValues[1][2] = 144; LEDValues[2][0] = 66; LEDValues[2][1] = 245; LEDValues[2][2] = 3; LEDValues[3][0] = 30; LEDValues[3][1] = 30; LEDValues[3][2] = 200; //Start up the serial port Serial.begin(19200); //Signal the program start Serial.println("RGB LED Controller"); // Enable Timer 2 interrupt (also used for PWM though) // This interrupt is divided by a prescaler, and takes care of the multiplexing TIMSK2 = 1<<TOIE2; Hue1 = 0; Hue2 = 10; Hue3 = 20; Hue4 = 30; Hue5 = 40; Hue6 = 50; Hue7 = 60; Hue8 = 70; Saturation = 255; Value = 255; } unsigned char incomingByte = 0; unsigned char getNumPos = 0; unsigned char tempNum = 0; unsigned char LEDSetNum = 0; unsigned char LEDSetColor = 0; void loop(void) { delay(20); HSVtoRGB(&Red, &Green, &Blue, Hue1, Saturation, Value); LEDValues[0][0] = Red; LEDValues[0][1] = Green; LEDValues[0][2] = Blue; Hue1++; if (Hue1 > 359) Hue1 = 0; HSVtoRGB(&Red, &Green, &Blue, Hue2, Saturation, Value); LEDValues[1][0] = Red; LEDValues[1][1] = Green; LEDValues[1][2] = Blue; Hue2++; if (Hue2 > 359) Hue2 = 0; HSVtoRGB(&Red, &Green, &Blue, Hue3, Saturation, Value); LEDValues[2][0] = Red; LEDValues[2][1] = Green; LEDValues[2][2] = Blue; Hue3++; if (Hue3 > 359) Hue3 = 0; HSVtoRGB(&Red, &Green, &Blue, Hue4, Saturation, Value); LEDValues[3][0] = Red; LEDValues[3][1] = Green; LEDValues[3][2] = Blue; Hue4++; if (Hue4 > 359) Hue4 = 0; HSVtoRGB(&Red, &Green, &Blue, Hue5, Saturation, Value); LEDValues[4][0] = Red; LEDValues[4][1] = Green; LEDValues[4][2] = Blue; Hue5++; if (Hue5 > 359) Hue5 = 0; HSVtoRGB(&Red, &Green, &Blue, Hue6, Saturation, Value); LEDValues[5][0] = Red; LEDValues[5][1] = Green; LEDValues[5][2] = Blue; Hue6++; if (Hue6 > 359) Hue6 = 0; HSVtoRGB(&Red, &Green, &Blue, Hue7, Saturation, Value); LEDValues[6][0] = Red; LEDValues[6][1] = Green; LEDValues[6][2] = Blue; Hue7++; if (Hue7 > 359) Hue7 = 0; HSVtoRGB(&Red, &Green, &Blue, Hue8, Saturation, Value); LEDValues[7][0] = Red; LEDValues[7][1] = Green; LEDValues[7][2] = Blue; Hue8++; if (Hue8 > 359) Hue8 = 0; } void HSVtoRGB( int *r, int *g,int *b, int h, int s, int v ) { int f; long p, q, t; if( s == 0 ) { *r = *g = *b = v; return; } f = ((h%60)*255)/60; h /= 60; p = (v * (256 - s)) / 256; q = (v * ( 256 - (s * f)/256 ))/256; t = (v * ( 256 - (s * ( 256 - f ))/256))/256; switch( h ) { case 0: *r = v; *g = t; *b = p; break; case 1: *r = q; *g = v; *b = p; break; case 2: *r = p; *g = v; *b = t; break; case 3: *r = p; *g = q; *b = v; break; case 4: *r = t; *g = p; *b = v; break; default: *r = v; *g = p; *b = q; break; } }
вот этот код не можем настроить под нашу систему. Вот ссылка http://blog.tkjelectronics.dk/2011/08/arduino-rgb-led-controller/
ммм. немного не так. Когда я говорил, что можно обойтись без транзисторов, я имел ввиду, что можно обойтись без транзисторов) А если вы решили всё-таки использовать транзисторы (это более правильно, но требует обвязки) то нужно к ним добавить ещё и обвязку в виде резисторов, как на той схеме выше (только R4, R5, R6 должны быть на 220 Ом) Простите, что капитаню. Решили с транзисторами - похвально, только добавьте между ардуиной и базой транзисторов резистор на 1 кОм. Далее. Не занимайте выводы 0 и 1 ардуины - они вам понадобятся для отладки. Пины, которые идут на R, G и B нужно подключить на пины 9,10 и 11. A4 и A5 не занимайте. Оставшиеся можно использовать для ULN2003. Ссылка не открывается. Код надо будет сильно модифицировать
вот мы убрали транзисторы и два леда. У нас появился ритм плавного загорания и потухания, но цвет только красный.
Это с каким кодом? с тем что сверху? А какой эффект хотите получить то в итоге? Сейчас попробую накидать для этой схемы какую-нибудь переливалку
Код (Text): unsigned char Prescaler = 0; #define PrescalerOverflowValue 4 ISR(TIMER2_OVF_vect) { if (Prescaler < PrescalerOverflowValue) Prescaler++; else { Prescaler = 0; Multiplex(); } } unsigned char CurrentLED = 1; unsigned char LEDValues[8][3]; bool LEDMoveDir[8][3]; void Multiplex(void) { PORTD &= 0b00000011; // Control pin 0-5 PORTB &= 0b11101110; // Control pin 6-7 analogWrite(9, 255-LEDValues[CurrentLED][0]); analogWrite(10, 255-LEDValues[CurrentLED][1]); analogWrite(11, 255-LEDValues[CurrentLED][2]); switch (CurrentLED) { case 0: //digitalWrite(2, 1); // Turn on LED 1 PORTD |= 0b00000100; break; case 1: //digitalWrite(3, 1); // Turn on LED 1 PORTD |= 0b00001000; break; case 2: //digitalWrite(4, 1); // Turn on LED 1 PORTD |= 0b00010000; break; case 3: //digitalWrite(5, 1); // Turn on LED 1 PORTD |= 0b00100000; break; case 4: //digitalWrite(6, 1); // Turn on LED 1 PORTD |= 0b01000000; break; case 5: //digitalWrite(7, 1); // Turn on LED 1 PORTD |= 0b10000000; break; case 6: //digitalWrite(8, 1); // Turn on LED 1 PORTB |= 0b00000001; break; case 7: //digitalWrite(12, 1); // Turn on LED 1 PORTB |= 0b00010000; break; } CurrentLED++; if (CurrentLED > 7) CurrentLED = 0; } void setPwmFrequency(int pin, int divisor) { byte mode; if(pin == 5 || pin == 6 || pin == 9 || pin == 10) { switch(divisor) { case 1: mode = 0x01; break; case 8: mode = 0x02; break; case 64: mode = 0x03; break; case 256: mode = 0x04; break; case 1024: mode = 0x05; break; default: return; } if(pin == 5 || pin == 6) { TCCR0B = TCCR0B & 0b11111000 | mode; } else { TCCR1B = TCCR1B & 0b11111000 | mode; } } else if(pin == 3 || pin == 11) { switch(divisor) { case 1: mode = 0x01; break; case 8: mode = 0x02; break; case 32: mode = 0x03; break; case 64: mode = 0x04; break; case 128: mode = 0x05; break; case 256: mode = 0x06; break; case 1024: mode = 0x7; break; default: return; } TCCR2B = TCCR2B & 0b11111000 | mode; } } int Red, Green, Blue; int Hue1, Hue2, Hue3, Hue4, Hue5, Hue6, Hue7, Hue8, Saturation, Value; void setup(void) { //Set the pin we want the ISR to toggle for output. pinMode(2,OUTPUT); pinMode(3,OUTPUT); pinMode(4,OUTPUT); pinMode(5,OUTPUT); pinMode(6,OUTPUT); pinMode(7,OUTPUT); pinMode(8,OUTPUT); pinMode(12,OUTPUT); pinMode(9,OUTPUT); pinMode(10,OUTPUT); pinMode(11,OUTPUT); digitalWrite(2, 0); // Turn off LED 4 digitalWrite(3, 0); // Turn off LED 4 digitalWrite(4, 0); // Turn off LED 4 digitalWrite(5, 0); // Turn off LED 4 digitalWrite(6, 0); // Turn off LED 4 digitalWrite(7, 0); // Turn off LED 4 digitalWrite(8, 0); // Turn off LED 4 digitalWrite(12, 0); // Turn off LED 4 digitalWrite(9, 1); digitalWrite(10, 1); digitalWrite(11, 1); setPwmFrequency(9, 8); setPwmFrequency(10, 8); setPwmFrequency(11, 8); analogWrite(9, 255); analogWrite(10, 255); analogWrite(11, 255); LEDValues[0][0] = 100; LEDValues[0][1] = 0; LEDValues[0][2] = 20; LEDValues[1][0] = 0; LEDValues[1][1] = 30; LEDValues[1][2] = 144; LEDValues[2][0] = 66; LEDValues[2][1] = 245; LEDValues[2][2] = 3; LEDValues[3][0] = 30; LEDValues[3][1] = 30; LEDValues[3][2] = 200; //Start up the serial port Serial.begin(19200); //Signal the program start Serial.println("RGB LED Controller"); // Enable Timer 2 interrupt (also used for PWM though) // This interrupt is divided by a prescaler, and takes care of the multiplexing TIMSK2 = 1<<TOIE2; Hue1 = 0; Hue2 = 10; Hue3 = 20; Hue4 = 30; Hue5 = 40; Hue6 = 50; Hue7 = 60; Hue8 = 70; Saturation = 255; Value = 255; } unsigned char incomingByte = 0; unsigned char getNumPos = 0; unsigned char tempNum = 0; unsigned char LEDSetNum = 0; unsigned char LEDSetColor = 0; void loop(void) { delay(20); HSVtoRGB(&Red, &Green, &Blue, Hue1, Saturation, Value); LEDValues[0][0] = Red; LEDValues[0][1] = Green; LEDValues[0][2] = Blue; Hue1++; if (Hue1 > 359) Hue1 = 0; HSVtoRGB(&Red, &Green, &Blue, Hue2, Saturation, Value); LEDValues[1][0] = Red; LEDValues[1][1] = Green; LEDValues[1][2] = Blue; Hue2++; if (Hue2 > 359) Hue2 = 0; HSVtoRGB(&Red, &Green, &Blue, Hue3, Saturation, Value); LEDValues[2][0] = Red; LEDValues[2][1] = Green; LEDValues[2][2] = Blue; Hue3++; if (Hue3 > 359) Hue3 = 0; HSVtoRGB(&Red, &Green, &Blue, Hue4, Saturation, Value); LEDValues[3][0] = Red; LEDValues[3][1] = Green; LEDValues[3][2] = Blue; Hue4++; if (Hue4 > 359) Hue4 = 0; HSVtoRGB(&Red, &Green, &Blue, Hue5, Saturation, Value); LEDValues[4][0] = Red; LEDValues[4][1] = Green; LEDValues[4][2] = Blue; Hue5++; if (Hue5 > 359) Hue5 = 0; HSVtoRGB(&Red, &Green, &Blue, Hue6, Saturation, Value); LEDValues[5][0] = Red; LEDValues[5][1] = Green; LEDValues[5][2] = Blue; Hue6++; if (Hue6 > 359) Hue6 = 0; HSVtoRGB(&Red, &Green, &Blue, Hue7, Saturation, Value); LEDValues[6][0] = Red; LEDValues[6][1] = Green; LEDValues[6][2] = Blue; Hue7++; if (Hue7 > 359) Hue7 = 0; HSVtoRGB(&Red, &Green, &Blue, Hue8, Saturation, Value); LEDValues[7][0] = Red; LEDValues[7][1] = Green; LEDValues[7][2] = Blue; Hue8++; if (Hue8 > 359) Hue8 = 0; } void HSVtoRGB( int *r, int *g,int *b, int h, int s, int v ) { int f; long p, q, t; if( s == 0 ) { *r = *g = *b = v; return; } f = ((h%60)*255)/60; h /= 60; p = (v * (256 - s)) / 256; q = (v * ( 256 - (s * f)/256 ))/256; t = (v * ( 256 - (s * ( 256 - f ))/256))/256; switch( h ) { case 0: *r = v; *g = t; *b = p; break; case 1: *r = q; *g = v; *b = p; break; case 2: *r = p; *g = v; *b = t; break; case 3: *r = p; *g = q; *b = v; break; case 4: *r = t; *g = p; *b = v; break; default: *r = v; *g = p; *b = q; break; } } Код, который мы использовали. Теперь нам надо подключить Touch Sensor. 1 - Как его подключить к самим LED-ам? 2 - Как его закодировать, чтобы наша лампа меняла яркость в зависимости от скорости трения: чем медленнее трешь, тем медленнее перелив цвета и лампа менее яркая, и наоборот, чем быстрее трение, тем быстрее перелив цвета и лампа горит ярче.