我制作了简单的程序,用于连接RGB diod,并通过i2c从键盘接收信息。
我有一个奇怪的问题,i2c在调用void函数后无法正常工作。当我用常规循环切换功能时,会发生同样的情况。
首先我认为它与analog4和analog5端口连接,但在更改功能之后,显然这与此无关。
评论Potentiometer(i)后循环方法键盘正在作为魅力
在我的代码
之下 #include <Wire.h>
#include "Adafruit_MPR121.h"
Adafruit_MPR121 cap = Adafruit_MPR121();
uint16_t lasttouched = 0;
uint16_t currtouched = 0;
int RGB1[] = { 22, 23, 24 };
int RGB2[] = { 25, 26, 27 };
int RGB3[] = { 28, 29, 30 };
int RGB4[] = { 31, 32, 33 };
void setup()
{
for (int i = 0; i < 3; i++){
pinMode(RGB1[i], OUTPUT);
digitalWrite(RGB1[i], HIGH);
pinMode(RGB2[i], OUTPUT);
digitalWrite(RGB2[i], HIGH);
pinMode(RGB3[i], OUTPUT);
digitalWrite(RGB3[i], HIGH);
pinMode(RGB4[i], OUTPUT);
digitalWrite(RGB4[i], HIGH);
}
Serial.begin(9600);
Serial.println("Adafruit MPR121 Capacitive Touch sensor test");
if (!cap.begin(0x5A)) {
Serial.println("MPR121 not found, check wiring?");
while (1);
}
Serial.println("MPR121 found!");
}
void loop()
{
currtouched = cap.touched();
for (uint8_t i=0; i<12; i++) {
// it if *is* touched and *wasnt* touched before, alert!
if ((currtouched & _BV(i)) && !(lasttouched & _BV(i)) ) {
Serial.print(i); Serial.println(" touched");
}
// if it *was* touched and now *isnt*, alert!
if (!(currtouched & _BV(i)) && (lasttouched & _BV(i)) ) {
Serial.print(i); Serial.println(" released");
}
}
// reset our state
lasttouched = currtouched;
Potentiometer(0);
Potentiometer(1);
Potentiometer(2);
Potentiometer(3);
// comment out this line for detailed data from the sensor!
return;
// debugging info, what
Serial.print("\t\t\t\t\t\t\t\t\t\t\t\t\t 0x"); Serial.println(cap.touched(), HEX);
Serial.print("Filt: ");
for (uint8_t i=0; i<12; i++) {
Serial.print(cap.filteredData(i)); Serial.print("\t");
}
Serial.println();
Serial.print("Base: ");
for (uint8_t i=0; i<12; i++) {
Serial.print(cap.baselineData(i)); Serial.print("\t");
}
Serial.println();
delay(100);
}
void Potentiometer(int i){
int j = analogRead(i);
switch (i+1){
case 1:
detectColor(RGB1, j);
break;
case 2:
detectColor(RGB2, j);
break;
case 3:
detectColor(RGB3, j);
break;
case 4:
detectColor(RGB4, j);
break;
}
}
void detectColor(int i[], int j){
if (j < 25)
RGB_color(i, 0);
if (j > 25 && j < 195)
RGB_color(i, 1);
if (j > 195 && j < 365)
RGB_color(i, 2);
if (j > 365 && j < 535)
RGB_color(i, 3);
if (j > 535 && j < 705)
RGB_color(i, 4);
if (j > 705 && j < 875)
RGB_color(i, 5);
if (j > 875 && j < 1010)
RGB_color(i, 6);
if (j > 1010)
RGB_color(i, 7);
}
void RGB_color(int dioda[], int color)
{
switch (color){
case 0:
digitalWrite(dioda[0], HIGH);
digitalWrite(dioda[1], HIGH);
digitalWrite(dioda[2], HIGH);
break;
case 1:
digitalWrite(dioda[0], LOW);
digitalWrite(dioda[1], HIGH);
digitalWrite(dioda[2], HIGH);
break;
case 2:
digitalWrite(dioda[0], HIGH);
digitalWrite(dioda[1], LOW);
digitalWrite(dioda[2], HIGH);
break;
case 3:
digitalWrite(dioda[0], HIGH);
digitalWrite(dioda[1], HIGH);
digitalWrite(dioda[2], LOW);
break;
case 4:
digitalWrite(dioda[0], LOW);
digitalWrite(dioda[1], LOW);
digitalWrite(dioda[2], HIGH);
break;
case 5:
digitalWrite(dioda[0], LOW);
digitalWrite(dioda[1], HIGH);
digitalWrite(dioda[2], LOW);
break;
case 6:
digitalWrite(dioda[0], HIGH);
digitalWrite(dioda[1], LOW);
digitalWrite(dioda[2], LOW);
break;
case 7:
digitalWrite(dioda[0], LOW);
digitalWrite(dioda[1], LOW);
digitalWrite(dioda[2], LOW);
break;
}
}