структура

Тема в разделе "Arduino & Shields", создана пользователем ostrov, 5 сен 2016.

  1. Megakoteyka

    Megakoteyka Оракул Модератор

    Указатель содержит адрес ячейки памяти. Обычно указатель имеет размерность, равную разрядности архитектуры. Но!
    Если указатель будет размером 1 байт, то он сможет адресовать всего 256 ячеек. А двухбайтный указатель - 64К ячеек. Поэтому указатель в AVR двухбайтный. И это не зависит от типа данных, на которые он указывает.
    Так, только в данном случае это не ссылка, а адрес. Ссылка - немного другое.
     
  2. DIYMan

    DIYMan Guest

    Размерность любого указателя на любой тип данных на платформе AVR - два байта. При этом указатель может ссылаться на свой тип данных, например, byte, и при его разыменовании и инкрементировании будет происходить либо обращение к ячейке памяти размером 1 байт, либо увеличение адреса указателя на 1 байт.
     
  3. jr.Bush

    jr.Bush Нерд

    Всем привет, есть необходимость поправить код, а именно перенести структуры из петли в глобальные данные.
    вот так код работает.
    Код (C++):

    #include <gfxfont.h>
    #include <UTFTGLUE.h>
    #include <DHT.h>
    #include <iarduino_RTC.h>
    #include <Adafruit_GFX.h>
    #include <FreeDefaultFonts.h>
    #include <Fonts/FreeMono12pt7b.h>
    #include <MCUFRIEND_kbv.h>
    MCUFRIEND_kbv tft(A3, A2, A1, A0, A4);//int CS=A3, RS=A2, WR=A1, RD=A0, RST=A4;
    iarduino_RTC time(RTC_DS1302, 47, 29, 39);
    DHT dht(44, DHT22); //Инициация датчика

    #define BLACK 0x0000
    #define NAVY 0x000F
    #define DARKGREEN 0x03E0
    #define DARKCYAN 0x03EF
    #define MAROON 0x7800
    #define PURPLE 0x780F
    #define OLIVE 0x7BE0
    #define LIGHTGREY 0xC618
    #define DARKGREY 0x7BEF
    #define BLUE 0x001F
    #define GREEN 0x07E0
    #define CYAN 0x07FF
    #define RED 0xF800
    #define MAGENTA 0xF81F
    #define YELLOW 0xFFE0
    #define WHITE 0xFFFF
    #define ORANGE 0xFD20
    #define GREENYELLOW 0xAFE5
    #define PINK 0xF81F
    #define GREY 0x8410

    void setup()
    {

      Serial.begin (9600);// инициализация монитора порта
      time.begin();
      dht.begin();
      uint16_t ID = tft.readID();// получение информации о дисплее
      tft.begin(ID);// инициализация дисплея
      pinMode(52, INPUT_PULLUP);//up
      pinMode(53, INPUT_PULLUP);//dw
      pinMode(48, INPUT_PULLUP);//mid
      pinMode(46, INPUT_PULLUP);//rst
      pinMode(49, INPUT_PULLUP);//set
      pinMode(50, INPUT_PULLUP);//left
      tft.setRotation(1); // повернуть экран
      tft.fillScreen(GREY); // заливка экрана
      tft.setTextColor(0xFFFF, GREY); // белый цвет шрифта/сераязаливка
      tft.setTextSize(1); //размер шрифта 1-5
      //tft.setFont(&FreeMono12pt7b);

    }
    static int levmenu;
    static unsigned long timer;// переменная для задержки отображения времени

    struct Menu //структура хранения данных меню
    {
      String myname;
      String paragraph[5];
      int index;
    };
        Menu mainmenu;
      //  mainmenu.myname = "MENU";
      //  mainmenu.paragraph[0] = "Profil";
      //  mainmenu.paragraph[1] = "Seting";
      //  mainmenu.paragraph[2] = "Back";
      //  mainmenu.index = 3;
       
    int menu(String myname, String paragraph[], int index, int levmenu)//функция отображения меню
    {
      const int poscur[] = {40, 80, 120, 160, 180};//координаты пунктов меню
      if (levmenu < 0)
        levmenu = index - 1;
      if (levmenu > index - 1)
        levmenu = 0;
      if (digitalRead(52) != HIGH)
        levmenu ++;
      if (digitalRead(53) != HIGH)
        levmenu --;
      tft.setTextSize(3);
      tft.setCursor(0, 0);
      tft.setTextColor(BLACK,GREY);
      tft.print(myname);
      for (int i = 0; i < index; i++)
      {
        tft.setCursor (0, poscur[i]);
        if (i != levmenu)
          tft.print(paragraph[i]);
      }
      tft.setTextColor(WHITE, BLACK);
      tft.setCursor(0, poscur[levmenu]);
      tft.print(paragraph[levmenu]);
      return levmenu;
    }

    void temphum(int x, int y)// выводит на экран температуру и влажность
    {
    //  float h = dht.readHumidity(); //Измеряем влажность
    //  float t = dht.readTemperature(); //Измеряем температуру
      tft.setCursor(x,y);
      tft.setTextSize(3);
      if(dht.readTemperature() > 28)
      tft.setTextColor(RED,GREY);
      else if(dht.readTemperature() < 24)
      tft.setTextColor(BLUE,GREY);
      else
      tft.setTextColor(GREEN, GREY);
      tft.print(dht.readTemperature());
      tft.println("C");
      tft.setTextColor(WHITE, GREY);
      tft.print(dht.readHumidity());
      tft.print("%");
      tft.setCursor(0, 0);
    }

    void loop ()
    {
    static int realmenu;// переменная для навигации по страницам меню

        Menu mainmenu;
        mainmenu.myname = "MENU";
        mainmenu.paragraph[0] = "Profil";
        mainmenu.paragraph[1] = "Seting";
        mainmenu.paragraph[2] = "Back";
        mainmenu.index = 3;

      Menu profilmenu;
        profilmenu.myname = "PROFIL MENU";
        profilmenu.paragraph[0] = "Select";
        profilmenu.paragraph[1] = "Edit";
        profilmenu.paragraph[2] = "Back";
        profilmenu.index = 3;

      Menu setingmenu;
        setingmenu.myname = "SETING MENU";
        setingmenu.paragraph[0] = "Clock";
        setingmenu.paragraph[1] = "Calibration sensors";
        setingmenu.paragraph[2] = "Back";
        setingmenu.index = 3;

     
     
      if (realmenu == 0) // код отображения времени на главном экране
      {
        tft.setTextSize(2);
        tft.setTextColor(0xFFFF, GREY);
        tft.setCursor(120, 140);
        if (millis() - timer > 1000)
        {
       
          tft.setTextColor(0xFFFF, GREY);
          tft.print(time.gettime("H:i:s"));
          temphum(0, 0);
          timer = millis();
        }
        if (digitalRead(48) != HIGH)
        {
          tft.fillScreen(GREY);
          tft.setTextColor(WHITE, GREY);
          realmenu = 1;
        }
      }


      if (realmenu == 1)
      {
        levmenu = menu(mainmenu.myname, mainmenu.paragraph, mainmenu.index, levmenu);
        if (digitalRead(48) != HIGH)
        {
          tft.fillScreen(GREY); // обновление экрана заливкой
          switch (levmenu)
          {
            case 0:
              realmenu = 2;
              levmenu = 0;
              break;
            case 1:
              realmenu = 3;
              levmenu = 0;
              break;
            case 2:
              realmenu = 0;
              levmenu = 0;
              break;
          }
        }
      }
      if (realmenu == 2) //2 - меню профиля
      {
        levmenu = menu(profilmenu.myname, profilmenu.paragraph, profilmenu.index, levmenu);
        if (digitalRead(48) != HIGH)
        {
          tft.fillScreen(GREY); // обновление экрана заливкой
          switch (levmenu)
          {
            case 0:
              realmenu = 11;
              levmenu = 0;
              break;
            case 1:
              realmenu = 12;
              levmenu = 0;
              break;
            case 2:
              realmenu = 1;
              levmenu = 0;
             
              break;
          }
        }
      }
      if (realmenu == 3)// 3 - меню настроек системы
      {
       levmenu = menu(setingmenu.myname, setingmenu.paragraph, setingmenu.index, levmenu);
        if (digitalRead(48) != HIGH)
        {
          tft.fillScreen(GREY); // обновление экрана заливкой
          switch (levmenu)
          {
            case 0:
              realmenu = 21;
              levmenu = 0;
              break;
            case 1:
              realmenu = 22;
              levmenu = 0;
              break;
            case 2:
              realmenu = 1;
              levmenu = 0;
              break;
          }
        }
      }
     
      if (realmenu == 21)// настройки часов
      {
        static int setclock;//переменная определения типа настраиваемого времени часы, минуты, секунды
        tft.setCursor(200, 0);
        tft.print(levmenu);
        tft.setCursor(0, 0);
        tft.print("TIME SETUP");
        tft.setCursor(60, 150);
        tft.print(time.gettime("H:i:s"));
        if (digitalRead(52) != HIGH)
        levmenu ++;
      if (digitalRead(53) != HIGH)
        levmenu --;
        switch (setclock)
        {
          case 0:
            levmenu = time.Hours;
            time.blinktime(3);
            if(digitalRead(52) != HIGH)
              levmenu ++;
            if(digitalRead(53) != HIGH)
              levmenu --;
            if(levmenu > 60)
              levmenu = 0;
            if(levmenu < 0)
              levmenu = 60;
            if (digitalRead(48) != HIGH)
              setclock = 1;
            time.settime(-1, -1, levmenu);
            break;
          case 1:
            time.blinktime(2);
            levmenu = time.minutes;
            if(digitalRead(52) != HIGH)
              levmenu ++;
            if(digitalRead(53) != HIGH)
              levmenu --;
            if(levmenu > 60)
              levmenu = 0;
            if(levmenu < 0)
              levmenu = 60;
            if(digitalRead(48) != HIGH)
              setclock = 2;
              time.settime(-1, levmenu);
            break;
          case 2:
            time.blinktime(1);
            levmenu = time.seconds;
            if(digitalRead(52) != HIGH)
              levmenu ++;
            if(digitalRead(53) != HIGH)
              levmenu --;
            if(levmenu > 60)
              levmenu = 0;
            if(levmenu < 0)
              levmenu = 60;
              time.settime(levmenu);
            if(digitalRead(48) != HIGH)
            {
              setclock = 0;
              realmenu = 1;
              time.blinktime(0);
              levmenu = 0;
              tft.fillScreen(GREY); // обновление экрана заливкой
            }
            break;
        }
      }
    }
     
  4. jr.Bush

    jr.Bush Нерд

    а так не работает, в чем ошибка
    Код (C++):

    #include <gfxfont.h>
    #include <UTFTGLUE.h>
    #include <DHT.h>
    #include <iarduino_RTC.h>
    #include <Adafruit_GFX.h>
    #include <FreeDefaultFonts.h>
    #include <Fonts/FreeMono12pt7b.h>
    #include <MCUFRIEND_kbv.h>
    MCUFRIEND_kbv tft(A3, A2, A1, A0, A4);//int CS=A3, RS=A2, WR=A1, RD=A0, RST=A4;
    iarduino_RTC time(RTC_DS1302, 47, 29, 39);
    DHT dht(44, DHT22); //Инициация датчика

    #define BLACK 0x0000
    #define NAVY 0x000F
    #define DARKGREEN 0x03E0
    #define DARKCYAN 0x03EF
    #define MAROON 0x7800
    #define PURPLE 0x780F
    #define OLIVE 0x7BE0
    #define LIGHTGREY 0xC618
    #define DARKGREY 0x7BEF
    #define BLUE 0x001F
    #define GREEN 0x07E0
    #define CYAN 0x07FF
    #define RED 0xF800
    #define MAGENTA 0xF81F
    #define YELLOW 0xFFE0
    #define WHITE 0xFFFF
    #define ORANGE 0xFD20
    #define GREENYELLOW 0xAFE5
    #define PINK 0xF81F
    #define GREY 0x8410

    void setup()
    {

      Serial.begin (9600);// инициализация монитора порта
      time.begin();
      dht.begin();
      uint16_t ID = tft.readID();// получение информации о дисплее
      tft.begin(ID);// инициализация дисплея
      pinMode(52, INPUT_PULLUP);//up
      pinMode(53, INPUT_PULLUP);//dw
      pinMode(48, INPUT_PULLUP);//mid
      pinMode(46, INPUT_PULLUP);//rst
      pinMode(49, INPUT_PULLUP);//set
      pinMode(50, INPUT_PULLUP);//left
      tft.setRotation(1); // повернуть экран
      tft.fillScreen(GREY); // заливка экрана
      tft.setTextColor(0xFFFF, GREY); // белый цвет шрифта/сераязаливка
      tft.setTextSize(1); //размер шрифта 1-5
      //tft.setFont(&FreeMono12pt7b);

    }
    static int levmenu;
    static unsigned long timer;// переменная для задержки отображения времени

    struct Menu //структура хранения данных меню
    {
      String myname;
      String paragraph[5];
      int index;
    };
       Menu mainmenu;
        mainmenu.myname = "MENU";
        mainmenu.paragraph[0] = "Profil";
        mainmenu.paragraph[1] = "Seting";
        mainmenu.paragraph[2] = "Back";
        mainmenu.index = 3;

      Menu profilmenu;
        profilmenu.myname = "PROFIL MENU";
        profilmenu.paragraph[0] = "Select";
        profilmenu.paragraph[1] = "Edit";
        profilmenu.paragraph[2] = "Back";
        profilmenu.index = 3;

      Menu setingmenu;
        setingmenu.myname = "SETING MENU";
        setingmenu.paragraph[0] = "Clock";
        setingmenu.paragraph[1] = "Calibration sensors";
        setingmenu.paragraph[2] = "Back";
        setingmenu.index = 3;

    int menu(String myname, String paragraph[], int index, int levmenu)//функция отображения меню
    {
      const int poscur[] = {40, 80, 120, 160, 180};//координаты пунктов меню
      if (levmenu < 0)
        levmenu = index - 1;
      if (levmenu > index - 1)
        levmenu = 0;
      if (digitalRead(52) != HIGH)
        levmenu ++;
      if (digitalRead(53) != HIGH)
        levmenu --;
      tft.setTextSize(3);
      tft.setCursor(0, 0);
      tft.setTextColor(BLACK,GREY);
      tft.print(myname);
      for (int i = 0; i < index; i++)
      {
        tft.setCursor (0, poscur[i]);
        if (i != levmenu)
          tft.print(paragraph[i]);
      }
      tft.setTextColor(WHITE, BLACK);
      tft.setCursor(0, poscur[levmenu]);
      tft.print(paragraph[levmenu]);
      return levmenu;
    }

    void temphum(int x, int y)// выводит на экран температуру и влажность
    {
    //  float h = dht.readHumidity(); //Измеряем влажность
    //  float t = dht.readTemperature(); //Измеряем температуру
      tft.setCursor(x,y);
      tft.setTextSize(3);
      if(dht.readTemperature() > 28)
      tft.setTextColor(RED,GREY);
      else if(dht.readTemperature() < 24)
      tft.setTextColor(BLUE,GREY);
      else
      tft.setTextColor(GREEN, GREY);
      tft.print(dht.readTemperature());
      tft.println("C");
      tft.setTextColor(WHITE, GREY);
      tft.print(dht.readHumidity());
      tft.print("%");
      tft.setCursor(0, 0);
    }

    void loop ()
    {
    static int realmenu;// переменная для навигации по страницам меню

     
     
      if (realmenu == 0) // код отображения времени на главном экране
      {
        tft.setTextSize(2);
        tft.setTextColor(0xFFFF, GREY);
        tft.setCursor(120, 140);
        if (millis() - timer > 1000)
        {
       
          tft.setTextColor(0xFFFF, GREY);
          tft.print(time.gettime("H:i:s"));
          temphum(0, 0);
          timer = millis();
        }
        if (digitalRead(48) != HIGH)
        {
          tft.fillScreen(GREY);
          tft.setTextColor(WHITE, GREY);
          realmenu = 1;
        }
      }


      if (realmenu == 1)
      {
        levmenu = menu(mainmenu.myname, mainmenu.paragraph, mainmenu.index, levmenu);
        if (digitalRead(48) != HIGH)
        {
          tft.fillScreen(GREY); // обновление экрана заливкой
          switch (levmenu)
          {
            case 0:
              realmenu = 2;
              levmenu = 0;
              break;
            case 1:
              realmenu = 3;
              levmenu = 0;
              break;
            case 2:
              realmenu = 0;
              levmenu = 0;
              break;
          }
        }
      }
      if (realmenu == 2) //2 - меню профиля
      {
        levmenu = menu(profilmenu.myname, profilmenu.paragraph, profilmenu.index, levmenu);
        if (digitalRead(48) != HIGH)
        {
          tft.fillScreen(GREY); // обновление экрана заливкой
          switch (levmenu)
          {
            case 0:
              realmenu = 11;
              levmenu = 0;
              break;
            case 1:
              realmenu = 12;
              levmenu = 0;
              break;
            case 2:
              realmenu = 1;
              levmenu = 0;
             
              break;
          }
        }
      }
      if (realmenu == 3)// 3 - меню настроек системы
      {
       levmenu = menu(setingmenu.myname, setingmenu.paragraph, setingmenu.index, levmenu);
        if (digitalRead(48) != HIGH)
        {
          tft.fillScreen(GREY); // обновление экрана заливкой
          switch (levmenu)
          {
            case 0:
              realmenu = 21;
              levmenu = 0;
              break;
            case 1:
              realmenu = 22;
              levmenu = 0;
              break;
            case 2:
              realmenu = 1;
              levmenu = 0;
              break;
          }
        }
      }
     
      if (realmenu == 21)// настройки часов
      {
        static int setclock;//переменная определения типа настраиваемого времени часы, минуты, секунды
        tft.setCursor(200, 0);
        tft.print(levmenu);
        tft.setCursor(0, 0);
        tft.print("TIME SETUP");
        tft.setCursor(60, 150);
        tft.print(time.gettime("H:i:s"));
        if (digitalRead(52) != HIGH)
        levmenu ++;
      if (digitalRead(53) != HIGH)
        levmenu --;
        switch (setclock)
        {
          case 0:
            levmenu = time.Hours;
            time.blinktime(3);
            if(digitalRead(52) != HIGH)
              levmenu ++;
            if(digitalRead(53) != HIGH)
              levmenu --;
            if(levmenu > 60)
              levmenu = 0;
            if(levmenu < 0)
              levmenu = 60;
            if (digitalRead(48) != HIGH)
              setclock = 1;
            time.settime(-1, -1, levmenu);
            break;
          case 1:
            time.blinktime(2);
            levmenu = time.minutes;
            if(digitalRead(52) != HIGH)
              levmenu ++;
            if(digitalRead(53) != HIGH)
              levmenu --;
            if(levmenu > 60)
              levmenu = 0;
            if(levmenu < 0)
              levmenu = 60;
            if(digitalRead(48) != HIGH)
              setclock = 2;
              time.settime(-1, levmenu);
            break;
          case 2:
            time.blinktime(1);
            levmenu = time.seconds;
            if(digitalRead(52) != HIGH)
              levmenu ++;
            if(digitalRead(53) != HIGH)
              levmenu --;
            if(levmenu > 60)
              levmenu = 0;
            if(levmenu < 0)
              levmenu = 60;
              time.settime(levmenu);
            if(digitalRead(48) != HIGH)
            {
              setclock = 0;
              realmenu = 1;
              time.blinktime(0);
              levmenu = 0;
              tft.fillScreen(GREY); // обновление экрана заливкой
            }
            break;
        }
      }
    }