Просьба о помощи начинающему(Arduino)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Saint-Sky, 9 Feb 2016.

  1. Saint-Sky

    Saint-Sky Elder - Старейшина

    Joined:
    14 Jul 2007
    Messages:
    119
    Likes Received:
    77
    Reputations:
    27
    Данный код не работает(я - не силён в этом). Что поправить?
    Code:
    
    const int ledPin = 13; // the pin that the LED is attached to
    const int shimPin = 5;
    long a;
    int val;
    String s1;
    
    void setup() {
    // initialize serial communication:
    Serial.begin(9600);
    // initialize the LED pin as an output:
    pinMode(ledPin, OUTPUT);
    pinMode(shimPin, OUTPUT);
    }
    
    void loop() {
    a = 0;
    int i=0;
    char s[8];
    memset(&s,0,sizeof(s));
    while(Serial.available()>0)
    {
    s[i]=Serial.read();
    i++;
    delay(2);
    }
    
    
    if ((strstr(s, "On_1"))||(strstr(s, "Off_1"))){
    if (strstr(s, "On_1")){
    digitalWrite(ledPin, HIGH);
    } else {
    digitalWrite(ledPin, LOW);
    }
    }
    
    if (strstr(s, "IR_LG_CH_")) {
    s1 = "";
    for ( int j=10; j<18; j++){
    s1 =s1 + s[j];
    switch {
    case Input:
    irsend.sendNEC(0x20DFD02F, 32);delay(200);
    break;
    case Mute:
    irsend.sendNEC(0x20DF807F, 32);delay(200);
    break;
    case LIST:
    irsend.sendNEC(0x20DFCA35, 32);delay(200);
    break;
    case Q.Menu:
    irsend.sendNEC(0x20DF58A7, 32);delay(200);
    break;
    case V--:
    irsend.sendNEC(0x20DFC03F, 32);delay(200);
    break;
    case V++:
    irsend.sendNEC(0x20DF40BF, 32);delay(200);
    break;
    case Ch++:
    irsend.sendNEC(0x20DF00FF, 32);delay(200);
    break;
    case Ch--:
    irsend.sendNEC(0x20DF807F, 32);delay(200);
    break;
    case Return:
    irsend.sendNEC(0x20DF14EB, 32);delay(200);
    break;
    case Settings:
    irsend.sendNEC(0x20DFC23D, 32);delay(200);
    break;
    case MyApps:
    irsend.sendNEC(0x20DF42BD, 32);delay(200);
    break;
    case OK:
    irsend.sendNEC(0x20DF22DD, 32);delay(200);
    break;
    case Up:
    irsend.sendNEC(0x20DF02FD, 32);delay(200);
    break;
    case Down:
    irsend.sendNEC(0x20DF827D, 32);delay(200);
    break;
    case Left:
    irsend.sendNEC(0x20DFE01F, 32);delay(200);
    break;
    case Right:
    irsend.sendNEC(0x20DF609F, 32);delay(200);
    break;
    case Exit:
    irsend.sendNEC(0x20DFDA25, 32);delay(200);
    break;
    }
    }
    }
    
    if (strstr(s, "IR_LG_")) {
    s1 = "";
    for ( int j=10; j<18; j++){
    s1 =s1 + s[j];
    switch {
    case 1:
    irsend.sendNEC(0x20DFD02F, 32);delay(200);
    break;
    case 2:
    irsend.sendNEC(0x20DF48B7, 32);delay(200);
    break;
    case 3:
    irsend.sendNEC(0x20DFC837, 32);delay(200);
    break;
    case 4:
    irsend.sendNEC(0x20DF28D7, 32);delay(200);
    break;
    case 5:
    irsend.sendNEC(0x20DFA857, 32);delay(200);
    break;
    case 6:
    irsend.sendNEC(0x20DF6897, 32);delay(200);
    break;
    case 7:
    irsend.sendNEC(0x20DFE817, 32);delay(200);
    break;
    case 8:
    irsend.sendNEC(0x20DF18E7, 32);delay(200);
    break;
    case 9:
    irsend.sendNEC(0x20DF9867, 32);delay(200);
    break;
    case 0:
    irsend.sendNEC(0x20DF08F7, 32);delay(200);
    break;
    }
    
    }
    }
    
    
    
    
    
    
    }
    
    
    
    
    
    
    Ошибки:
    Code:
    
    
    Изменена опция сборки, пересобираем все
    Ard_Blue.ino: In function 'void loop()':
    Ard_Blue:41: error: expected '(' before '{' token
    Ard_Blue:101: error: expected '(' before '{' token
    Ard_Blue.ino: At global scope:
    Ard_Blue:142: error: expected declaration before '}' token
    expected '(' before '{' token
    
     
    #1 Saint-Sky, 9 Feb 2016
    Last edited: 9 Feb 2016
  2. blackstrip

    blackstrip Member

    Joined:
    2 Feb 2016
    Messages:
    12
    Likes Received:
    5
    Reputations:
    0
    Как минимум, ему не нравятся пустые switch в 41 и 101 строке кода. Там не указано какое выражение сравнивать с кейсами.

    Надо писать вместо switch { в скобках еще выражение, например,
    switch (s1) {

    Тогда будет строчка s1, считанная посимвольно из ком-порта в начале кода, сравниваться с другими, прописанными в case-ы.
     
    Saint-Sky likes this.
  3. Saint-Sky

    Saint-Sky Elder - Старейшина

    Joined:
    14 Jul 2007
    Messages:
    119
    Likes Received:
    77
    Reputations:
    27
    Поменял как просили - стало еще хуже:
    Code:
    #include <IRremote.h>
    
    IRsend irsend;
    const int ledPin = 13; // the pin that the LED is attached to
    const int shimPin = 5;
    long a;
    int val;
    String s1;
    
    void setup() {
    // initialize serial communication:
    Serial.begin(9600);
    // initialize the LED pin as an output:
    pinMode(ledPin, OUTPUT);
    pinMode(shimPin, OUTPUT);
    }
    
    void loop() {
    a = 0;
    int i=0;
    char s[8];
    memset(&s,0,sizeof(s));
    while(Serial.available()>0)
    {
    s[i]=Serial.read();
    i++;
    delay(2);
    }
    
    
    if ((strstr(s, "On_1"))||(strstr(s, "Off_1"))){
    if (strstr(s, "On_1")){
    digitalWrite(ledPin, HIGH);
    } else {
    digitalWrite(ledPin, LOW);
    }
    }
    
    if (strstr(s, "IR_LG_CH_")) {
    s1 = "";
    for ( int j=10; j<18; j++){
    s1 =s1 + s[j];
    switch (s1) {
    case Input:
    irsend.sendNEC(0x20DFD02F, 32);delay(200);
    break;
    case Mute:
    irsend.sendNEC(0x20DF807F, 32);delay(200);
    break;
    case LIST:
    irsend.sendNEC(0x20DFCA35, 32);delay(200);
    break;
    case Q.Menu:
    irsend.sendNEC(0x20DF58A7, 32);delay(200);
    break;
    case V--:
    irsend.sendNEC(0x20DFC03F, 32);delay(200);
    break;
    case V++:
    irsend.sendNEC(0x20DF40BF, 32);delay(200);
    break;
    case Ch++:
    irsend.sendNEC(0x20DF00FF, 32);delay(200);
    break;
    case Ch--:
    irsend.sendNEC(0x20DF807F, 32);delay(200);
    break;
    case Return:
    irsend.sendNEC(0x20DF14EB, 32);delay(200);
    break;
    case Settings:
    irsend.sendNEC(0x20DFC23D, 32);delay(200);
    break;
    case MyApps:
    irsend.sendNEC(0x20DF42BD, 32);delay(200);
    break;
    case OK:
    irsend.sendNEC(0x20DF22DD, 32);delay(200);
    break;
    case Up:
    irsend.sendNEC(0x20DF02FD, 32);delay(200);
    break;
    case Down:
    irsend.sendNEC(0x20DF827D, 32);delay(200);
    break;
    case Left:
    irsend.sendNEC(0x20DFE01F, 32);delay(200);
    break;
    case Right:
    irsend.sendNEC(0x20DF609F, 32);delay(200);
    break;
    case Exit:
    irsend.sendNEC(0x20DFDA25, 32);delay(200);
    break;
    }
    }
    }
    
    if (strstr(s, "IR_LG_")) {
    s1 = "";
    for ( int j=10; j<18; j++){
    s1 =s1 + s[j];
    switch (s1) {
    case 1:
    irsend.sendNEC(0x20DFD02F, 32);delay(200);
    break;
    case 2:
    irsend.sendNEC(0x20DF48B7, 32);delay(200);
    break;
    case 3:
    irsend.sendNEC(0x20DFC837, 32);delay(200);
    break;
    case 4:
    irsend.sendNEC(0x20DF28D7, 32);delay(200);
    break;
    case 5:
    irsend.sendNEC(0x20DFA857, 32);delay(200);
    break;
    case 6:
    irsend.sendNEC(0x20DF6897, 32);delay(200);
    break;
    case 7:
    irsend.sendNEC(0x20DFE817, 32);delay(200);
    break;
    case 8:
    irsend.sendNEC(0x20DF18E7, 32);delay(200);
    break;
    case 9:
    irsend.sendNEC(0x20DF9867, 32);delay(200);
    break;
    case 0:
    irsend.sendNEC(0x20DF08F7, 32);delay(200);
    break;
    }
    
    }
    }
    }
    Ошибки:
    Code:
    IRsendDemo.ino: In function 'void loop()':
    IRsendDemo:43: error: switch quantity not an integer
    IRsendDemo:44: error: 'Input' was not declared in this scope
    IRsendDemo:47: error: 'Mute' was not declared in this scope
    IRsendDemo:50: error: 'LIST' was not declared in this scope
    IRsendDemo:53: error: 'Q' was not declared in this scope
    IRsendDemo:53: error: '.' cannot appear in a constant-expression
    IRsendDemo:56: error: 'V' was not declared in this scope
    IRsendDemo:56: error: an decrement cannot appear in a constant-expression
    IRsendDemo:59: error: an increment cannot appear in a constant-expression
    IRsendDemo:62: error: 'Ch' was not declared in this scope
    IRsendDemo:62: error: an increment cannot appear in a constant-expression
    IRsendDemo:65: error: an decrement cannot appear in a constant-expression
    IRsendDemo:68: error: 'Return' was not declared in this scope
    IRsendDemo:71: error: 'Settings' was not declared in this scope
    IRsendDemo:74: error: 'MyApps' was not declared in this scope
    IRsendDemo:77: error: 'OK' was not declared in this scope
    IRsendDemo:80: error: 'Up' was not declared in this scope
    IRsendDemo:83: error: 'Down' was not declared in this scope
    IRsendDemo:86: error: 'Left' was not declared in this scope
    IRsendDemo:89: error: 'Right' was not declared in this scope
    IRsendDemo:92: error: 'Exit' was not declared in this scope
    IRsendDemo:103: error: switch quantity not an integer
    switch quantity not an integer
    
    Основная ошибка - error: switch quantity not an integer. Может просто нельзя его использовать для строк в АрдуИДЕ?
     
  4. Saint-Sky

    Saint-Sky Elder - Старейшина

    Joined:
    14 Jul 2007
    Messages:
    119
    Likes Received:
    77
    Reputations:
    27
    Еще вариант сделал:
    Code:
    #include <IRremote.h>
    
    IRsend irsend;
    const int ledPin = 13; // the pin that the LED is attached to
    const int shimPin = 5;
    long a;
    int val,b;
    String s1;
    
    void setup() {
    // initialize serial communication:
    Serial.begin(9600);
    // initialize the LED pin as an output:
    pinMode(ledPin, OUTPUT);
    pinMode(shimPin, OUTPUT);
    }
    
    void loop() {
    a = 0;
    int i=0;
    char s[8];
    memset(&s,0,sizeof(s));
    while(Serial.available()>0)
    {
    s[i]=Serial.read();
    i++;
    delay(2);
    }
    
    
    if ((strstr(s, "On_1"))||(strstr(s, "Off_1"))){
    if (strstr(s, "On_1")){
    digitalWrite(ledPin, HIGH);
    } else {
    digitalWrite(ledPin, LOW);
    }
    }
    
    if (strstr(s, "IR_LG_CH_")) { //Пересылка функ.кнопок
    s1 = "";
    for ( int j=10; j<18; j++){
    s1 =s1 + s[j];
    if (s1 == "Input"){
    irsend.sendNEC(0x20DFD02F, 32);delay(200);
    }
    if (s1 == "Mute"){
    irsend.sendNEC(0x20DF807F, 32);delay(200);
    }
    if (s1 == "LIST"){
    irsend.sendNEC(0x20DFCA35, 32);delay(200);
    }
    if (s1 == "Q.Menu"){
    irsend.sendNEC(0x20DF58A7, 32);delay(200);
    }
    if (s1 == "V--"){
    irsend.sendNEC(0x20DFC03F, 32);delay(200);
    }
    if (s1 == "V++"){
    irsend.sendNEC(0x20DF40BF, 32);delay(200);
    }
    if (s1 == "Ch++"){
    irsend.sendNEC(0x20DF00FF, 32);delay(200);
    }
    if (s1 == "Ch--"){
    irsend.sendNEC(0x20DF807F, 32);delay(200);
    }
    if (s1 == "Return"){
    irsend.sendNEC(0x20DF14EB, 32);delay(200);
    }
    if (s1 == "Settings"){
    irsend.sendNEC(0x20DFC23D, 32);delay(200);
    }
    if (s1 == "MyApps"){
    irsend.sendNEC(0x20DF42BD, 32);delay(200);
    }
    if (s1 == "OK"){
    irsend.sendNEC(0x20DF22DD, 32);delay(200);
    }
    if (s1 == "Up"){
    irsend.sendNEC(0x20DF02FD, 32);delay(200);
    }
    if (s1 == "Down"){
    irsend.sendNEC(0x20DF827D, 32);delay(200);
    }
    if (s1 == "Left"){
    irsend.sendNEC(0x20DFE01F, 32);delay(200);
    }
    if (s1 == "Right"){
    irsend.sendNEC(0x20DF609F, 32);delay(200);
    }
    if (s1 == "Exit"){
    irsend.sendNEC(0x20DFDA25, 32);delay(200);
    }
    }
    }
    
    if (strstr(s, "IR_LG_")) { //Пересылаются кнопки Цифр
    s1 = "";
    for ( int j=10; j<11; j++){
    String Fuck = Fuck + s[j];
    b = Fuck.toInt;
    switch (b) {
    case 1:
    irsend.sendNEC(0x20DFD02F, 32);delay(200);
    break;
    case 2:
    irsend.sendNEC(0x20DF48B7, 32);delay(200);
    break;
    case 3:
    irsend.sendNEC(0x20DFC837, 32);delay(200);
    break;
    case 4:
    irsend.sendNEC(0x20DF28D7, 32);delay(200);
    break;
    case 5:
    irsend.sendNEC(0x20DFA857, 32);delay(200);
    break;
    case 6:
    irsend.sendNEC(0x20DF6897, 32);delay(200);
    break;
    case 7:
    irsend.sendNEC(0x20DFE817, 32);delay(200);
    break;
    case 8:
    irsend.sendNEC(0x20DF18E7, 32);delay(200);
    break;
    case 9:
    irsend.sendNEC(0x20DF9867, 32);delay(200);
    break;
    case 0:
    irsend.sendNEC(0x20DF08F7, 32);delay(200);
    break;
    }
    }
    }
    
    
    }
    
    Опять ошибки, но вообще не там, где я их ожидал... :
    Code:
    Изменена опция сборки, пересобираем все
    IR_NOT_CASE.ino: In function 'void loop()':
    IR_NOT_CASE:101: error: cannot convert 'String::toInt' from type 'long int (String::)()const' to type 'int'
    cannot convert 'String::toInt' from type 'long int (String::)()const' to type 'int'
    
    
     
    #4 Saint-Sky, 10 Feb 2016
    Last edited: 10 Feb 2016
  5. blackstrip

    blackstrip Member

    Joined:
    2 Feb 2016
    Messages:
    12
    Likes Received:
    5
    Reputations:
    0
    Введите в гугл cannot convert 'String::toInt' from type 'long int (String::)()const' to type 'int' и посмотрите результаты =) Как конвертировать строки в числа и прочие дела в различных языках и подязыках - это уже тривиально и смотрится в книжке/онлайн-справочнике по соответствующему языку.

    Вот пример одного из ответов на одном из форумов на вопрос про такую ошибку:
     
  6. Saint-Sky

    Saint-Sky Elder - Старейшина

    Joined:
    14 Jul 2007
    Messages:
    119
    Likes Received:
    77
    Reputations:
    27
    Думаешь я сначала сюда пишу, а только потом гуглю? :p Нет, конечно!
    В гугле мне сказали, что платформа Ардуино очень сильно отличается от стандартов и ответ на свой вопрос я могу найти либо у разрабов, либо из практики(поэтому и написал сюды).
    Так проблему и не решил. Самое интересное в том, что данный код компилится в АрдуиноИДЕ_1.2.2, а в АрдуиноИДЕ_1.6.5 такие вот ошибки...
     
  7. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Да код жутковат конечно )
    1. В Си нельзя так if(s1 == "string") используй функция для работы со строками strstr или гугл - сравнение строк в Си
    2. в switch в case нельзя сравнивать строки см пункт 1
    3. s=Serial.read(); i++; - нет проверки на длину буфера ошибка buffer overflow
    4. зачем тут String вообще... бррр

    Как я понимаю идут команды
    "IR_LG_CH_Mute" "IR_LG_CH_Ok" и прочее - во первых у тебя буфера s (char s[8]) в 8 байт не хватит что бы получить эти команды они больше 8 байт... ну а сравнивать их нужно через strstr

    Ну лично я бы завел структуру
    Code:
     struct IR_LG_CH {
      char *name;
      unsinged int nec;
    }
    #define CH_COMMANDS 2
    IR_LG_CH ch_cmd[CH_COMMANDS];
    ch_cmd[0].name="Mute";
    ch_cmd[0].nec = 0x20DF807F;
    
    ch_cmd[1].name="OK";
    ch_cmd[1].nec=0x20DF22DD;
    
    if (strstr(s, "IR_LG_CH_")) {
      for(i=0; i < CH_COMMANDS; i++) {
         if(strstr(s, ch_cmd[i].name)) {
         irsend.sendNEC(ch_cmd[i].nec, 32); delay(200);
         break;
         }
      }
    }
    
    что-то типа.
     
    _________________________
    Saint-Sky likes this.
  8. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    От каких стандартов? Если ты программируешь под avr на Си или Си++, то нужно только соблюдать стандарты языка (и, разумеется, знать этот язык программирования). Ты сейчас пытаешься написать код на C++, не зная этого языка и не имея возможности из-за этого исправить даже самые примитивные ошибки.

    Ардуино IDE тут не при чем. Ардуино IDE - это просто среда разработки, а компилируется всё в компиляторе g++. Опять-таки, если бы ты знал C++ или C, то ты бы не применял switch для строковых типов.

    Поэтому сначала предлагаю прочитать несколько статей, где объясняются азы программирования на C++, а потом уже браться за ардуино.

    PS. Недавно писал под atmega644pa код на C++11 в Atmel Studio, не имел никаких проблем.
     
  9. Saint-Sky

    Saint-Sky Elder - Старейшина

    Joined:
    14 Jul 2007
    Messages:
    119
    Likes Received:
    77
    Reputations:
    27
    Всем спасибо за советы. Код написал и он работает...