Знаю что написал какую то чушь, но ничего в голову после недели работы над этим кодом не приходит.
Сначала объясню чего пытаюсь добиться.
Делаю таймер для ледов на шесть каналов. При чём нужно регулировать яркость, время включения, время отключения на каждый из шести каналов в отдельности. Управление через bluetooth с андроида.
Для Андроида мне пишут прогу которая будет посылать стринг из восемнадцати цифр разделённых запятой, например (255,1000,500,255,600,500,255,1000,600,255,1000,800,255,1000,900,255,900,500,).
В моей проге я сначала собираю эти цифры в массив а потом работаю с этим массивом.
Пока что первая часть работает. А вот вторая часть не совсем.
Во первых, пример "Мигаем светодиодом без delay()" не подходит так как там используеться для on/off только одно время задержки а у меня их два. И во вторых, когда контроллер начинает принимать с uart данные то диоды начинают хаотично моргать.
//255,500,100,255,1000,600,255,1000,600,255,1000,800,255,1000,900,255,900,500,
int out1 = 3; // LED connected to digital pin 3
int out2 = 5; // LED connected to digital pin 5
int out3 = 6; // LED connected to digital pin 6
int out4 = 9; // LED connected to digital pin 9
int out5 = 10; // LED connected to digital pin 10
int out6 = 11; // LED connected to digital pin 11
long table[18]={0};
long previousMillis_on1 = 0; // храним время последнего переключения светодиода ДЛЯ ПОРТА1
long previousMillis_off1 = 0; // храним время последнего переключения светодиода ДЛЯ ПОРТА1
long previousMillis_on2 = 0; // храним время последнего переключения светодиода ДЛЯ ПОРТА2
long previousMillis_off2 = 0; // храним время последнего переключения светодиода ДЛЯ ПОРТА2
long previousMillis_on3 = 0; // храним время последнего переключения светодиода ДЛЯ ПОРТА3
long previousMillis_off3 = 0; // храним время последнего переключения светодиода ДЛЯ ПОРТА3
long previousMillis_on4 = 0; // храним время последнего переключения светодиода ДЛЯ ПОРТА4
long previousMillis_off4 = 0; // храним время последнего переключения светодиода ДЛЯ ПОРТА4
long previousMillis_on5 = 0; // храним время последнего переключения светодиода ДЛЯ ПОРТА5
long previousMillis_off5 = 0; // храним время последнего переключения светодиода ДЛЯ ПОРТА5
long previousMillis_on6 = 0; // храним время последнего переключения светодиода ДЛЯ ПОРТА6
long previousMillis_off6 = 0; // храним время последнего переключения светодиода ДЛЯ ПОРТА6
boolean flag_uart=false;
long sum1;
long sum2;
long sum3;
long sum4;
long sum5;
long sum6;
void initt(){
flag_uart=true;
sum1=table[1]+table[2];
sum2=table[4]+table[5];
sum3=table[7]+table[8];
sum4=table[10]+table[11];
sum5=table[13]+table[14];
sum6=table[16]+table[17];
Serial.print("sum1=");
Serial.println(sum1);
Serial.print("sum2=");
Serial.println(sum2);
Serial.print("sum3=");
Serial.println(sum3);
Serial.print("sum4=");
Serial.println(sum4);
Serial.print("sum5=");
Serial.println(sum5);
Serial.print("sum6=");
Serial.println(sum6);
}
void setup() {
Serial.begin(9600);
uart_rx();
initt();
}
void uart_rx(){
char a = 0;
long b = 0;
int cont=0;
while(cont<=17){
if(Serial.available()){
delay(2);
a = Serial.read();
if(a >= 48 && a <= 57){ //"0,1,2,3,4,5,6,7,8,9"
b *= 10;
b += a - 48;
}
}
if(a==44){ // ","
table[cont]=b; //заполнение таблици
cont++; //увеличение счетчика
b=0; //если пришла запятая, то это конец цифры, обнуление b
}
}
cont=0;
}
void loop() {
unsigned long currentMillis = millis();
// if(Serial.available()){
// }
/*
for(int i=0;i<=17;i++){ // проверка таблици
Serial.print("i=");
Serial.print(i);
Serial.print(" ");
Serial.print("table=");
Serial.println(table[i]);
}
*/
if(flag_uart){
//////////////// ПОРТ 1 //////////////////////////////////////////////////////////
if(currentMillis > table[1]) {
// previousMillis_on1 = currentMillis; // сохраняем время последнего переключения
table[1]+=sum1;
analogWrite(out1,table[0]);
}
if (currentMillis > table[2]){
// previousMillis_off1 = currentMillis; // сохраняем время последнего переключения
table[2]+=sum1;
analogWrite(out1,0);
}
//////////////////////////////////////////////////////////////////////////////////
//////////////// ПОРТ 2 //////////////////////////////////////////////////////////
if(currentMillis > table[4]) {
// previousMillis_on2 = currentMillis; // сохраняем время последнего переключения
table[4]+=sum2;
Serial.print("table[4]=");
Serial.println(table[4]);
analogWrite(out2,0);
}
if (currentMillis > table[5]){
// previousMillis_off2 = currentMillis; // сохраняем время последнего переключения
table[5]+=sum2;
Serial.print("table[5]=");
Serial.println(table[5]);
analogWrite(out2,table[3]);
}
//////////////////////////////////////////////////////////////////////////////////
}
}
Во первых, пример "Мигаем светодиодом без delay()" не подходит так как там используеться для on/off только одно время задержки а у меня их два. И во вторых, когда контроллер начинает принимать с uart данные то диоды начинают хаотично моргать.
С чего Вы взяли, что этот пример не подходит?
Тут важен принцип.
Если у Вас не одно время, а два, да еще меняющаяся яркость, значит, нужно ввести не одну переменную, а три. А если светодиодов 6, 30, 100..., то объединяем эти три переменные в структуру и вводим массив этих структур - по одному элементу на светодиод.
Тот же случай, что и http://arduino.ru/forum/programmirovanie/pomogite-s-kodom-7 ?
Читать от "\n" до "\n", рубить по запятым, преобразовывать строку в целое.
Тот же случай, что и http://arduino.ru/forum/programmirovanie/pomogite-s-kodom-7 ?
Нет не тот.
Я просто искал какие нибуть примеры, как из чисел получить цифры.
Вот кое что нашол http://arduino.ru/forum/programmirovanie/perevod-prinyatogo-simvola-s-com-porta-v-chislo
От этого буду плясать :)
Ну и хорошо, что не тот случай.
Прежде всего ответьте, умеете ли Вы получать с помощью Serial.read длинную строку вида "1,2,34,567,8,9,10" в символьный массив, или в String ?
Нет. Но с помощю того примера наверное смогу.
Вот тебе простой пример разбора строки
String myString = ""; String xval; String yval; void setup() { Serial.begin(9600); } void loop() { if (Serial.available() > 0) { myString = Serial.readString(); xval = getValue(myString, ':', 0); yval = getValue(myString, ':', 1); Serial.print("X:" + xval); Serial.println("Y:" + yval); float xvalue = xval.toInt(); Serial.println((xvalue)/100.0); } } String getValue(String data, char separator, int index) { int found = 0; int strIndex[] = { 0, -1 }; int maxIndex = data.length()-1; for(int i=0; i<=maxIndex && found<=index; i++){ if(data.charAt(i)==separator || i==maxIndex){ found++; strIndex[0] = strIndex[1]+1; strIndex[1] = (i == maxIndex) ? i+1 : i; } } return found>index ? data.substring(strIndex[0], strIndex[1]) : ""; }Спасибо большое.
Нет. Но с помощю того примера наверное смогу.
ОК, вот с приема в строку/массив и начните. А к парсингу потом перейдем.
Может это поможет.
Сам этим сейчас интерисуюсь.
// 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18, char a = 0; long b = 0; int table[18]; int cont; void setup() { Serial.begin(9600); } void uart_rx(){ while(cont<=17){ if(Serial.available()){ delay(2); a = Serial.read(); if(a >= 48 && a <= 57){ //"0,1,2,3,4,5,6,7,8,9" b *= 10; b += a - 48; } } //Serial.print("b="); //Serial.println(b); if(a==44){ // "," table[cont]=b; //заполнение таблици cont++; //увеличение счетчика // if(cont>17) cont=0; //если перебор, обнуление счетчика b=0; //если пришла запятая, то это конец цифры, обнуление b } } cont=0; } void loop() { uart_rx(); for(int i=0;i<=17;i++){ // проверка таблици Serial.print("i="); Serial.print(i); Serial.print(" "); Serial.print("table="); Serial.println(table[i]); } while(1); }Жесть, конечно, но посмотрим как преподаватель оценит. С родами Вас, с разрешением так-сказать!
Какой препод?
Я это для себя делаю.
Ну, это Ваше дело :)
5 - добавь = 0
15 и 16 вполне можно объединить.
ЕМНИП, Serial.read() не умеет читать 0x00.
5 - добавь = 0
Radjah я не понял , про что вы говорите?
Строка 5 :
intcont = 0; // Объявляем и инициализируем.Строки 2,3,5 лучше перенесите между 9-й и 10-й, эти переменные нужны только внутри функции uart_rx(), нечего им глобальными быть.Ну, блин, набросились на человека. Он с Вами радостью поделился, а вам бы только строкм объединять, да переносить :)))
Я бы назвал это конструктивной критикой.
Критику я люблю .
Так что критикуйте побольше :)
Господа, Товарищи помогите !!!!!!
Знаю что написал какую то чушь, но ничего в голову после недели работы над этим кодом не приходит.
Для Андроида мне пишут прогу которая будет посылать стринг из восемнадцати цифр разделённых запятой, например (255,1000,500,255,600,500,255,1000,600,255,1000,800,255,1000,900,255,900,500,).
В моей проге я сначала собираю эти цифры в массив а потом работаю с этим массивом.
Пока что первая часть работает. А вот вторая часть не совсем.
Во первых, пример "Мигаем светодиодом без delay()" не подходит так как там используеться для on/off только одно время задержки а у меня их два. И во вторых, когда контроллер начинает принимать с uart данные то диоды начинают хаотично моргать.
//255,500,100,255,1000,600,255,1000,600,255,1000,800,255,1000,900,255,900,500, int out1 = 3; // LED connected to digital pin 3 int out2 = 5; // LED connected to digital pin 5 int out3 = 6; // LED connected to digital pin 6 int out4 = 9; // LED connected to digital pin 9 int out5 = 10; // LED connected to digital pin 10 int out6 = 11; // LED connected to digital pin 11 long table[18]={0}; long previousMillis_on1 = 0; // храним время последнего переключения светодиода ДЛЯ ПОРТА1 long previousMillis_off1 = 0; // храним время последнего переключения светодиода ДЛЯ ПОРТА1 long previousMillis_on2 = 0; // храним время последнего переключения светодиода ДЛЯ ПОРТА2 long previousMillis_off2 = 0; // храним время последнего переключения светодиода ДЛЯ ПОРТА2 long previousMillis_on3 = 0; // храним время последнего переключения светодиода ДЛЯ ПОРТА3 long previousMillis_off3 = 0; // храним время последнего переключения светодиода ДЛЯ ПОРТА3 long previousMillis_on4 = 0; // храним время последнего переключения светодиода ДЛЯ ПОРТА4 long previousMillis_off4 = 0; // храним время последнего переключения светодиода ДЛЯ ПОРТА4 long previousMillis_on5 = 0; // храним время последнего переключения светодиода ДЛЯ ПОРТА5 long previousMillis_off5 = 0; // храним время последнего переключения светодиода ДЛЯ ПОРТА5 long previousMillis_on6 = 0; // храним время последнего переключения светодиода ДЛЯ ПОРТА6 long previousMillis_off6 = 0; // храним время последнего переключения светодиода ДЛЯ ПОРТА6 boolean flag_uart=false; long sum1; long sum2; long sum3; long sum4; long sum5; long sum6; void initt(){ flag_uart=true; sum1=table[1]+table[2]; sum2=table[4]+table[5]; sum3=table[7]+table[8]; sum4=table[10]+table[11]; sum5=table[13]+table[14]; sum6=table[16]+table[17]; Serial.print("sum1="); Serial.println(sum1); Serial.print("sum2="); Serial.println(sum2); Serial.print("sum3="); Serial.println(sum3); Serial.print("sum4="); Serial.println(sum4); Serial.print("sum5="); Serial.println(sum5); Serial.print("sum6="); Serial.println(sum6); } void setup() { Serial.begin(9600); uart_rx(); initt(); } void uart_rx(){ char a = 0; long b = 0; int cont=0; while(cont<=17){ if(Serial.available()){ delay(2); a = Serial.read(); if(a >= 48 && a <= 57){ //"0,1,2,3,4,5,6,7,8,9" b *= 10; b += a - 48; } } if(a==44){ // "," table[cont]=b; //заполнение таблици cont++; //увеличение счетчика b=0; //если пришла запятая, то это конец цифры, обнуление b } } cont=0; } void loop() { unsigned long currentMillis = millis(); // if(Serial.available()){ // } /* for(int i=0;i<=17;i++){ // проверка таблици Serial.print("i="); Serial.print(i); Serial.print(" "); Serial.print("table="); Serial.println(table[i]); } */ if(flag_uart){ //////////////// ПОРТ 1 ////////////////////////////////////////////////////////// if(currentMillis > table[1]) { // previousMillis_on1 = currentMillis; // сохраняем время последнего переключения table[1]+=sum1; analogWrite(out1,table[0]); } if (currentMillis > table[2]){ // previousMillis_off1 = currentMillis; // сохраняем время последнего переключения table[2]+=sum1; analogWrite(out1,0); } ////////////////////////////////////////////////////////////////////////////////// //////////////// ПОРТ 2 ////////////////////////////////////////////////////////// if(currentMillis > table[4]) { // previousMillis_on2 = currentMillis; // сохраняем время последнего переключения table[4]+=sum2; Serial.print("table[4]="); Serial.println(table[4]); analogWrite(out2,0); } if (currentMillis > table[5]){ // previousMillis_off2 = currentMillis; // сохраняем время последнего переключения table[5]+=sum2; Serial.print("table[5]="); Serial.println(table[5]); analogWrite(out2,table[3]); } ////////////////////////////////////////////////////////////////////////////////// } }Вы бы ещё на 300 бодах попробовали работать......
9600 не есть максимальная скорость
Проверьте на 115200
Я никуда не спешу :)
На самом деле чтобы изменить скорость нужно переконфигурировать bluetoth. Я просто не вижу в этом смысла.
Кстати я посмотрел пример который предоставил leshak
в своей статье http://arduino.ru/forum/programmirovanie/eshche-raz-migaem-svetodiodom-bez-delay и у меня наконец то всё получилось. Может коряво написано но зато РАВОТАЕТ :).
//255,500,100,255,1000,600,255,1000,600,255,1000,800,255,1000,900,255,900,500, #define out1 3 // CH connected to digital pin 3 #define out2 5 // CH connected to digital pin 5 #define out3 6 // CH connected to digital pin 6 #define out4 9 // CH connected to digital pin 9 #define out5 10 // CH connected to digital pin 10 #define out6 11 // CH connected to digital pin 11 long table[18]={0}; void setup() { Serial.begin(9600); } void uart_rx(){ char a = 0; long b = 0; int cont=0; while(cont<=17){ // if(Serial.available()){ delay(2); a = Serial.read(); if(a >= 48 && a <= 57){ //"0,1,2,3,4,5,6,7,8,9" b *= 10; b += a - 48; } // } if(a==44){ // "," table[cont]=b; //заполнение таблици cont++; //увеличение счетчика b=0; //если пришла запятая, то это конец цифры, обнуление b } } cont=0; } void loop() { byte delta=0; if(Serial.available()){ uart_rx(); } blinkCH1(delta+0); blinkCH2(delta+3); blinkCH3(delta+6); blinkCH4(delta+9); blinkCH5(delta+12); blinkCH6(delta+15); } //////////////////////CH1//////////////////// void blinkCH1(byte delta){ static unsigned long period= table[2+delta]; // текущий интервал мигания static unsigned long prevMillis=0; if( (millis()-prevMillis)>=period){ prevMillis=millis(); if (period==table[2+delta]){//ON period=table[1+delta]; analogWrite(out1,table[0+delta]); } else { period=table[2+delta]; analogWrite(out1,0);//OFF } } } //////////////////////CH2//////////////////// void blinkCH2(byte delta){ static unsigned long period= table[2+delta]; // текущий интервал мигания static unsigned long prevMillis=0; if( (millis()-prevMillis)>=period){ prevMillis=millis(); if (period==table[2+delta]){//ON period=table[1+delta]; analogWrite(out2,table[0+delta]); } else { period=table[2+delta]; analogWrite(out2,0);//OFF } } } //////////////////////CH3//////////////////// void blinkCH3(byte delta){ static unsigned long period= table[2+delta]; // текущий интервал мигания static unsigned long prevMillis=0; if( (millis()-prevMillis)>=period){ prevMillis=millis(); if (period==table[2+delta]){//ON period=table[1+delta]; analogWrite(out3,table[0+delta]); } else { period=table[2+delta]; analogWrite(out3,0);//OFF } } } //////////////////////CH4//////////////////// void blinkCH4(byte delta){ static unsigned long period= table[2+delta]; // текущий интервал мигания static unsigned long prevMillis=0; if( (millis()-prevMillis)>=period){ prevMillis=millis(); if (period==table[2+delta]){//ON period=table[1+delta]; analogWrite(out4,table[0+delta]); } else { period=table[2+delta]; analogWrite(out4,0);//OFF } } } //////////////////////CH5//////////////////// void blinkCH5(byte delta){ static unsigned long period= table[2+delta]; // текущий интервал мигания static unsigned long prevMillis=0; if( (millis()-prevMillis)>=period){ prevMillis=millis(); if (period==table[2+delta]){//ON period=table[1+delta]; analogWrite(out5,table[0+delta]); } else { period=table[2+delta]; analogWrite(out5,0);//OFF } } } //////////////////////CH6//////////////////// void blinkCH6(byte delta){ static unsigned long period= table[2+delta]; // текущий интервал мигания static unsigned long prevMillis=0; if( (millis()-prevMillis)>=period){ prevMillis=millis(); if (period==table[2+delta]){//ON period=table[1+delta]; analogWrite(out6,table[0+delta]); } else { period=table[2+delta]; analogWrite(out6,0);//OFF } } }Так что leshaku очередное спасибо.
Во первых, пример "Мигаем светодиодом без delay()" не подходит так как там используеться для on/off только одно время задержки а у меня их два. И во вторых, когда контроллер начинает принимать с uart данные то диоды начинают хаотично моргать.
С чего Вы взяли, что этот пример не подходит?
Тут важен принцип.
Если у Вас не одно время, а два, да еще меняющаяся яркость, значит, нужно ввести не одну переменную, а три. А если светодиодов 6, 30, 100..., то объединяем эти три переменные в структуру и вводим массив этих структур - по одному элементу на светодиод.
С чего Вы взяли, что этот пример не подходит?
Тут важен принцип.
Принцип важен там, где человек хочет сделать сам "по образу и подобию", а здесь нужен (важен) просто готовый код.
Я не понял, в чей огород этот камень? Если это в мой, то тогда вы не правы.
Я перед тем как задать свой вопрос около 4-5 дней пытался решить эту задачку но не смог ):