ошибка в скетче

Тема в разделе "Arduino & Shields", создана пользователем Sergio73, 1 фев 2019.

  1. Sergio73

    Sergio73 Нуб

    Доброго времени суток, не могу понять почему не считывает информацию с реле. Нужно чтобы при переключении реле на дисплей выводилась надпись XXXXX или YYYYY если выключено реле.
    Код (C++):

    #include <Adafruit_GFX.h>    // Core graphics library
    //#include <Adafruit_TFTLCD.h> // Hardware-specific library
    #include <Wire.h>
    #include <LM75.h>
    #include <MCUFRIEND_kbv.h>
    //----------------------------------------|
    // TFT Breakout  -- Arduino UNO / Mega2560 / OPEN-SMART UNO Black
    // GND              -- GND
    // 3V3               -- 3.3V
    // CS                 -- A3
    // RS                 -- A2
    // WR                -- A1
    // RD                 -- A0
    // RST                -- RESET
    // LED                -- GND
    // DB0                -- 8
    // DB1                -- 9
    // DB2                -- 10
    // DB3                -- 11
    // DB4                -- 4
    // DB5                -- 13
    // DB6                -- 6
    // DB7                -- 7

    MCUFRIEND_kbv tft;
    LM75 sensor;  // initialize an LM75 object

    // Assign human-readable names to some common 16-bit color values:
    #define    BLACK   0x0000
    #define    BLUE    0x001F
    #define    RED     0xF800
    #define    GREEN   0x07E0
    #define CYAN    0x07FF
    #define MAGENTA 0xF81F
    #define YELLOW  0xFFE0
    #define WHITE   0xFFFF
    // Реле модуль подключен к цифровому выводу 4
    int Relay = 4;

    void setup(void)
    {
      Serial.begin(9600);
      Wire.begin();
      Serial.println(F("TFT LCD test"));
      pinMode(Relay, OUTPUT);
    #ifdef USE_ADAFRUIT_SHIELD_PINOUT
      Serial.println(F("Using Adafruit 3.2\" TFT Arduino Shield Pinout"));
    #else
      Serial.println(F("Using Adafruit 3.2\" TFT Breakout Board Pinout"));
    #endif

      Serial.print("TFT size is "); Serial.print(tft.width()); Serial.print("x"); Serial.println(tft.height());

      tft.reset();

      uint16_t identifier = tft.readID();

      if(identifier == 0x9325) {
        Serial.println(F("Found ILI9325 LCD driver"));
      } else if(identifier == 0x9328) {
        Serial.println(F("Found ILI9328 LCD driver"));
      } else if(identifier == 0x7575) {
        Serial.println(F("Found HX8347G LCD driver"));
      } else if(identifier == 0x9341) {
        Serial.println(F("Found ILI9341 LCD driver"));
      } else if(identifier == 0x8357) {
        Serial.println(F("Found HX8357D LCD driver"));
      } else if(identifier == 0x4747) {
        Serial.println(F("Found HX8347A LCD driver"));
      }
        else if(identifier == 0x9326) {
        Serial.println(F("Found ILI9326 LCD driver"));
      }  else if(identifier == 0x9327) {
        Serial.println(F("Found ILI9327 LCD driver"));
      }
      else if(identifier == 0x65) {
        Serial.println(F("Found HX8352B LCD driver"));
      }
        else {
        Serial.print(F("Unknown LCD driver chip: "));
        Serial.println(identifier, HEX);
        Serial.println(F("If using the Adafruit 2.8\" TFT Arduino shield, the line:"));
        Serial.println(F("  #define USE_ADAFRUIT_SHIELD_PINOUT"));
        Serial.println(F("should appear in the library header (Adafruit_TFT.h)."));
        Serial.println(F("If using the breakout board, it should NOT be #defined!"));
        Serial.println(F("Also if using the breakout, double-check that all wiring"));
        Serial.println(F("matches the tutorial."));
        return;
      }

      tft.begin(0x65);//to enable HX8352B driver code
      tft.fillScreen(BLACK );

    }

    void loop(void)
    {
    tft.setRotation(1);
    tft.setCursor(0, 10);
    tft.fillRect(0,100, 144, 24, BLACK);
    tft.setTextColor(GREEN );
    tft.setTextSize(3);
    tft.print(sensor.temp());
    tft.print(" C" );
    delay(3000);
    digitalWrite(Relay, LOW);   // реле включено
    delay(5000);
    digitalWrite(Relay, HIGH);  // реле выключено
    delay(5000);


    if (digitalRead(Relay)==LOW)
    {Serial.println("LOW");
    tft.setCursor(0, 10);
    tft.fillRect(0,100, 144, 24, BLACK);
    tft.setTextColor(YELLOW );
    tft.setTextSize(3);
    tft.println("        XXXX" );
    }
    else (digitalRead(Relay)==HIGH);
    {Serial.println("HIGH");
    tft.setCursor(0, 10);
    tft.fillRect(0,100, 144, 24, BLACK);
    tft.setTextColor(WHITE );
    tft.setTextSize(3);
    tft.println("        YYYY" );}


    }
     
  2. Asper Daffy

    Asper Daffy Иксперд

    А что, по-Вашему, означает строка

    else(digitalRead(Relay)==HIGH);
     
  3. Sergio73

    Sergio73 Нуб

    функция считывания с пина реле....
     
  4. Asper Daffy

    Asper Daffy Иксперд

    Что она делает в else?

    Почитайте синтаксис if ... else, уберите нафиг лишнее и жизнь наладится.
     
  5. b707

    b707 Гуру

    Автор приходил на ардуино.ру с этим скетчем, на совет читать книжки ответил. что он за свою жизнь прочитал уже стока, скока иные из нас за всю жизнь не видели :) - и по ардуино ему уже читать лень
    Хотя. надо сказать - некоторый прогресс виден. Раньше эта строка была записана как
    Код (C++):
    else (Relay, LOW);
    :)
     
    Daniil и NikitOS нравится это.
  6. Sergio73

    Sergio73 Нуб

    в том то и дело, читал уже, пробовал по разному писать код, или не работает или ошибку выдаёт, я не программист, поэтому и прошу у вас помощи :)
     
  7. b707

    b707 Гуру

    проблема в том, что в одном-то месте мы можем подсказать - но пока вы не освоите синтаксис и правила языка - у вас подобные ляпы будут постоянно - а постоянно вас никто за ручку водить не будет.

    Держите решение - напишите просто else
    Стандартный условный оператор if имеет такой синтаксис:
    Код (C++):
    if (УСЛОВИЕ)  {
    //код исполняемый если условие истинно
    ...}
    else {
    //код исполняемый если условие ложно
    }
    Условие тут проверяется только в ветке IF, в ELSE никакого своего условия нет, этот код выполняется, если первая проверка не прошла.

    Сами подумайте - вот например в Вашем случае - зачем отдельно проверять реле на HIGH и отдельно на LOW - ведь если реле не HIGH. то оно LOW и других вариантов нет.

    Но второй раз на подобное разжевывание не рассчитывайте, читайте учебники.
     
    Последнее редактирование: 1 фев 2019
    Daniil нравится это.
  8. Sergio73

    Sergio73 Нуб

    Ну так там написано, или что?
     
  9. b707

    b707 Гуру

    у вас там не так написано. Неужели вы не видите разницы?
    Может вам тогда не стоит заниматься программированием? - все равно не освоите
     
  10. Sergio73

    Sergio73 Нуб

    извиняюсь, я код не видел в вашем сообщении, сейчас написано так
    Код (C++):
    if(digitalRead(Relay)==LOW)
    {
    tft.setCursor(0, 10);
    tft.fillRect(0,100, 144, 24, BLACK);
    tft.setTextColor(YELLOW );
    tft.setTextSize(3);
    tft.println("        XXXX" );
    }
    else
    {
    tft.setCursor(0, 10);
    tft.fillRect(0,100, 144, 24, BLACK);
    tft.setTextColor(WHITE );
    tft.setTextSize(3);
    tft.println("        XXXX" );}
    всё равно не работает, ошибки нет но и не работает
     
  11. Asper Daffy

    Asper Daffy Иксперд

  12. MESS

    MESS Гик

    а дисплей исправен и правильно подключен?
     
  13. Sergio73

    Sergio73 Нуб

    да исправен, включается эта запись после загрузки
    Код (C++):
    else
    {
    tft.setCursor(0, 10);
    tft.fillRect(0,100, 144, 24, BLACK);
    tft.setTextColor(WHITE );
    tft.setTextSize(3);
    tft.println("        XXXX" );}
    и потом всё время включена не зависимо от положения реле
     
  14. b707

    b707 Гуру

    посмотрите внимательно в код - вы в обоих случаях выводите на экран строчку "XXXX"
     
  15. Sergio73

    Sergio73 Нуб

    да но в одном случае она белая в другом жёлтая, работает белая , причем постоянно, реле вкл. выкл....
     
  16. b707

    b707 Гуру

    так у вас в коде перед этим условием реле всегда переводится в HIGH - что же вы хотите, чтобы там показывалось?
     
  17. Sergio73

    Sergio73 Нуб

    Код (C++):
    digitalWrite(Relay, LOW);   // реле включено
    delay(5000);
    digitalWrite(Relay, HIGH);  // реле выключено
    delay(5000);
    оно включается и выключается с интервалом 5000
    я хочу чтобы в позиции LOW был один текст , а в позиции HIGH другой
     
    Последнее редактирование: 1 фев 2019
  18. b707

    b707 Гуру

    И что?
    Смотрите на код
    Код (C++):
    1: digitalWrite(Relay, LOW);   // реле включено
    2: delay(5000);
    3: digitalWrite(Relay, HIGH);  // реле выключено
    4: delay(5000)
    5: if(digitalRead(Relay)==LOW) {....
    Я для наглядности даже написал вам номера, в порядке которых компьютер исполняет команды.
    В строке 1 вы переводите реле в состояние LOW, в строке 2 - ждете 5 сек, в строке 3 переводите реле в HIGH, в строке 4 опять ждете.
    И вот - ВНИМАНИЕ - когда вы в строке 5 проверяете состояние реле - оно у вас HIGH
    Вся эта конструкция бегает по кругу, но суть не меняется - КАЖДЫЙ РАЗ когда вы проверяете реле - оно в состоянии HIGH

    я ж вам говорил выше, что из-за того, что вы ничего не знаете - вы будете наступать на грабли постоянно
     
    Daniil и Sergio73 нравится это.
  19. Sergio73

    Sergio73 Нуб

    Спасибо большое, нужно переделать, я и не говорил что знаю :)