Код для лампы с RGB диодом

kotik
kotik аватар
Offline
Зарегистрирован: 18.01.2014

Всем привет.

Идея - как бы арт-лампа, работающая только если её держать в руках. Меняет цвета под разными наклонами. Есть, собсно, сенсор, что прикосновения чувствует capacitive sensor library), три меркуриевых сенсора наклона ("кнопки!"), RGB диод. Оно работает, да, диод светит белым, и базовыми цветами. Но иной цвет не задается, если работают две "кнопки". Светит белым и все. Диод "кривой", с одной катодной лапой, цветовые - аноды. Так что на включение "low"

Простой код.

#include <CapacitiveSensor.h>

CapacitiveSensor   cs_4_2 = CapacitiveSensor(4,2); 

const int buttonPin1 = 8;     //tilt1
const int buttonPin2 = 12;     // tilt22
const int buttonPin3 = 13;     // tilt3
const int red = 9;
const int green = 10;
const int blue = 11;

int buttonState1 = 0;     
int buttonState2 = 0; 
int buttonState3 = 0; 

void setup() {
      cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF);
  pinMode(red, OUTPUT);      
    pinMode(green, OUTPUT);     
    pinMode(blue, OUTPUT);   
  pinMode(buttonPin1, INPUT);     
    pinMode(buttonPin2, INPUT);    
    pinMode(buttonPin3, INPUT);    
}

void loop(){
    long start = millis();
    long total1 =  cs_4_2.capacitiveSensor(30);
    Serial.print(millis() - start);    
  // read the state of the pushbutton value:
  buttonState1 = digitalRead(buttonPin1);
    buttonState2 = digitalRead(buttonPin2);
    buttonState3 = digitalRead(buttonPin3);

  // check if the pushbutton is pressed.    
  // if it is, the buttonState is HIGH:
  if (buttonState1 == HIGH && total1>200) {     
    digitalWrite(red, LOW);  
        digitalWrite(green, HIGH);  
         digitalWrite(blue, HIGH);  
  } 
  else  if (buttonState2 == HIGH && total1>200) {
    digitalWrite(red, HIGH); 
    digitalWrite(green, LOW); 
        digitalWrite(blue, HIGH); 
  }     
         else  if (buttonState3 == HIGH && total1>200) {
    digitalWrite(red, HIGH); 
    digitalWrite(green, HIGH); 
        digitalWrite(blue, LOW); 
  }
    else  if (buttonState1 == HIGH && buttonState2 == HIGH && total1>200) {
    digitalWrite(red, LOW); 
    digitalWrite(green, LOW); 
        digitalWrite(blue, HIGH); 
  }     
    else  if (buttonState2 == HIGH && buttonState3 == HIGH && total1>200) {
    digitalWrite(red, HIGH); 
    digitalWrite(green, LOW); 
        digitalWrite(blue, LOW); 
  }     
    else  if (buttonState1 == HIGH && buttonState3 == HIGH && total1>200) {
    digitalWrite(red, LOW); 
    digitalWrite(green, HIGH); 
        digitalWrite(blue, LOW); 
  }     
  
    else  if ( total1>200) {
    digitalWrite(red, LOW); 
    digitalWrite(green, LOW); 
        digitalWrite(blue, LOW); 
  }
    else  {
    digitalWrite(red, HIGH); 
    digitalWrite(green, HIGH); 
        digitalWrite(blue, HIGH); 
  }
  
}

Я все ещё нуб в этом, сижу пробую как и что работает : )

http://youtu.be/rmAw0z8N0CI

maksim
Offline
Зарегистрирован: 12.02.2012

kotik пишет:

Так что на включение "low"

Значит наоборот - диод имеет общий анод и три катода.

#include <CapacitiveSensor.h>

CapacitiveSensor   cs_4_2 = CapacitiveSensor(4,2); 

#define buttonPin1  8     //tilt1
#define buttonPin2 12     // tilt22
#define buttonPin3 13     // tilt3
#define red    9
#define green 10
#define blue  11

void setup() 
{
  cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF);
  pinMode(red, OUTPUT);      
  pinMode(green, OUTPUT);     
  pinMode(blue, OUTPUT);    
}

void loop()
{
  unsigned long start = millis();
  unsigned long total1 =  cs_4_2.capacitiveSensor(30);
  Serial.print(millis() - start);    
  if (total1 > 200) 
  {    
    digitalWrite(red, !digitalRead(buttonPin1));  
    digitalWrite(green, !digitalRead(buttonPin2));  
    digitalWrite(blue, !digitalRead(buttonPin3));  
  }
  else
  {
    digitalWrite(red, 1);  
    digitalWrite(green, 1);  
    digitalWrite(blue, 1); 
  }
}

или даже так:

#include <CapacitiveSensor.h>

CapacitiveSensor   cs_4_2 = CapacitiveSensor(4,2); 

#define buttonPin1  8     //tilt1
#define buttonPin2 12     // tilt22
#define buttonPin3 13     // tilt3
#define red    9
#define green 10
#define blue  11

byte btns[3] = {buttonPin1, buttonPin2, buttonPin3};
byte leds[3] = {red, green, blue};

void setup() 
{
  cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF);
  for(byte i = 0; i < 3; i++) pinMode(leds[i], OUTPUT);   
}

void loop()
{
  unsigned long start = millis();
  unsigned long total1 =  cs_4_2.capacitiveSensor(30);
  Serial.print(millis() - start);    
  if (total1 > 200) 
    for(byte i = 0; i < 3; i++) 
      digitalWrite(leds[i], !digitalRead(btns[i]));
  else 
    for(byte i = 0; i < 3; i++) 
    digitalWrite(leds[i], 1);
}

 

kotik
kotik аватар
Offline
Зарегистрирован: 18.01.2014

О, прелестно, спасибо огромное, работает :D Второй код. Надо понять как это работает!

А как ещё сделать, чтобы просто при прикосновении к сенсору зажигался случайный цвет? или просто белый? :3 с простым кодом работало.

kotik
kotik аватар
Offline
Зарегистрирован: 18.01.2014

...принцип, как понимаю, в if-else как-то прописать, что " если сенсор > 200 && тилты=0" то диод работает на белый. Только как выключатели прописать в таком виде кода? :D