Как обновлять данные внутри IF?

Тема в разделе "Arduino & Shields", создана пользователем arduin, 26 фев 2017.

  1. arduin

    arduin Нерд

    Всем добрый вечер.

    Столкнулся с такой проблемой.

    Есть датчик температуры воздуха и влажности.
    Работает примерно так

    Функция содержит в себе полностью всю работу датчика
    Все работает как надо.
    void WeatherStation()

    {
    Код программы дающий погоду в реальном времени
    }

    void loop()
    {
    WeatherStation); //Датчик погоды
    }







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



    void loop()
    {
    if (page ==0 && buttonEnabled == true)
    {
    buttonEnabled = false;
    tft.fillScreen(BLACK); //Очистка экрана от левых данных
    tft.setCursor(100,190);

    tft.print("home");
    WeatherStation); //Датчик погоды
    }

    }


    Если добавлю return ; Обновляет весь экран

    WeatherStation); //Датчик погоды
    return ;



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


    Либо может как переделать данные чтоб по другому было спасибо.
     
  2. Unixon

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

    А оно точно должно быть внутри if() ?
     
  3. Tomasina

    Tomasina Сушитель лампочек Модератор

    Непонятно что хотим. Переформулировать надо бы, без использования предыдущих фраз.
     
    arduin нравится это.
  4. arduin

    arduin Нерд

    Дико извиняюсь, если пишу не понятно.

    Задача следующая, сделать меню и настройки каждого меню.

    Сейчас глючит у меня от чего то мое меню.


    Возможно глюк из за функции погоды, которую я написал.
    Она работает отлично, но если я ее загружаю в IF блок меню, то она не обновляет значения.


    1)
    В блоке IF Функция weather(); не
    обновляет значения, само меню работает как надо.
    .

    if (page ==0 && buttonEnabled == true) { // if you are on the "home" page (0)
    buttonEnabled = false;
    tft.fillScreen(BLACK); //Очистка экрана от левых данных
    tft.setCursor(50,30);
    tft.print("home");
    weather();
    if (page ==0) {page =1; }
    }


    2) Вынос из блока IF weather();

    void loop()
    {

    weather();
    homemenu();

    if (page ==0 && buttonEnabled == true) { // if you are on the "home" page (0)
    buttonEnabled = false;
    tft.fillScreen(BLACK); //Очистка экрана от левых данных
    tft.setCursor(50,30);

    tft.print("home");
    if (page ==0) {page =1; }
    }

    Все работает как надо но сенсор не работает.
    Жму на кнопку реакции нет.

    Возможно конфликт tft.setCursor(200, 90)


    Может сделать какой нибудь класс.


    Или другую реализацию меню.

    Правда пока не знаю какую.


    Мне нужно чтоб в первом примере функция weather(); обновляла значения.
    Но как это сделать.

    если ставлю return то она мигает.


    Могу выложить видео.
     
  5. Tomasina

    Tomasina Сушитель лампочек Модератор

    Приведите весь скетч, правильно оформленный.
     
    arduin нравится это.
  6. alp69

    alp69 Форумчанин

    Для начала Вам сюда.
     
  7. arduin

    arduin Нерд

    Даный код выводит кнопку A при нажатии на кнопку попадаем в блок меню.
    Данные погоды не обновляются, при правильной работе должно обновляться



    Если взять функцию датчика погоды и загрузить в loop после { тогда погода обновляется но не работает меню.

    void loop()
    {
    weather();
    homemenu();

    Код (C++):

    #include <Adafruit_TFTLCD.h>
    #include <Adafruit_GFX.h>
    #include <TouchScreen.h>
    #include "DHT.h"



    #define DHTPIN 10    // what digital pin we're connected to
    #define DHTTYPE DHT21   // DHT 21 (AM2301)
    DHT dht(DHTPIN, DHTTYPE);


    #define LCD_CS A3
    #define LCD_CD A2
    #define LCD_WR A1
    #define LCD_RD A0
    #define LCD_RESET A4


    #define TS_MINX 16
    #define TS_MINY 118
    #define TS_MAXX 909
    #define TS_MAXY 918

    #define YP A1  // must be an analog pin, use "An" notation!
    #define XM A2  // must be an analog pin, use "An" notation!
    #define YM 7   // can be a digital pin
    #define XP 6   // can be a digital pin

    #define BLACK   0x0000
    #define BLUE    0x001F
    #define RED     0xF800
    #define GREEN   0x07E0
    #define CYAN    0x07FF
    #define MAGENTA 0xF81F
    #define YELLOW  0xFFE0
    #define WHITE   0xFFFF
    #define GRAY    0x6d9285

    Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
    TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

    #define MINPRESSURE 10    
    #define MAXPRESSURE 1000
    int page =0;
    boolean buttonEnabled = true;

    void setup() {
       Serial.begin(9600);
       tft.reset();
       tft.begin(0x7575);
        tft.setRotation(1);
        dht.begin();
        tft.fillScreen(BLACK);
       }
       

      void homemenu(){
      tft.drawRect(257,210,50,30,YELLOW);//Рамка на кнопку внешняя
      tft.setCursor(273,217);//Позволяет задать позицию курсора на экране; т.е. устанавливает позицию, в которой будет выводиться последующий текст.
      tft.setTextColor(WHITE);//Текст надпись на рамке
      tft.setTextSize(3);
      tft.print("A");
      buttonEnabled =1;
    }


    void loop()
    {  
           homemenu(); //Подключаем мен
          if (page ==0 && buttonEnabled == true) { // if you are on the "home" page (0)
          buttonEnabled = false;
          tft.fillScreen(BLACK); //Очистка  экрана от  левых данных
         tft.setCursor(50,30);
         
          weather();                 //Функция датчика температуры
         if (page ==0) {page =1; }
          }
        TSPoint p = ts.getPoint();
        pinMode(XM, OUTPUT);
        pinMode(YP, OUTPUT);
        p.x = map(p.x, TS_MAXX, TS_MINX, 0, 320);
        p.y = map(p.y, TS_MAXY, TS_MINY, 0, 240);
       
        if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {
         
            tft.setTextSize(5);
           tft.setTextColor(RED);
          tft.print(i);
         
         if(  p.x > 0 && p.x < 220 && buttonEnabled == true)
        {  
          if (page ==1 && buttonEnabled == true) {
            buttonEnabled = false;
         tft.fillScreen(BLUE); //Очистка  экрана от  левых данных
         tft.setCursor(80,120);
         tft.setTextColor(WHITE);
         tft.setTextSize(3);
         tft.print("MENU 1");
          if (page ==1) {page =2; } }

         if (page ==2 && buttonEnabled == true) {
            buttonEnabled = false;
         tft.fillScreen(BLUE); //Очистка  экрана от  левых данных
         tft.setCursor(80,120);
         tft.setTextColor(WHITE);
         tft.setTextSize(3);
         tft.print("MENU 2");
          if (page ==2) {page =0; }
     
         }}}}

    void weather(){

      float sens_h = dht.readHumidity();
      float sens_t = dht.readTemperature();

      float sens_hic = dht.computeHeatIndex(sens_t, sens_h, false);

       tft.setTextColor(YELLOW);
       tft.setTextSize(2);
       tft.setCursor(3,6);
       tft.println("weather home!");

           
                  //Выводим  датчик температуры
                tft.setTextColor(WHITE);  
                tft.setTextSize(3);      
                tft.setCursor(3,60);    
                tft.println("home");    
                       
                tft.setTextColor(YELLOW);
                tft.setCursor(200, 60);
                tft.print(sens_t,1);  
                tft.print("c");    
                         
             }




       
     
     
  8. arduin

    arduin Нерд

    Я уже понял.
     
    alp69 нравится это.
  9. mcureenab

    mcureenab Гуру

    У вас погода обновляется когда page==0. А по коду это условие один раз рыполняется и переходит на page 1. А с page 1 можно уйти только нажав на экран.
     
    Tomasina нравится это.
  10. arduin

    arduin Нерд


    Дело в том что page==0 это блок меню.

    Если взять функцию датчика погоды и загрузить в loop после { тогда погода обновляется но не работает меню.

    void loop()
    {
    weather();
    homemenu();


    По сути я сделал 2 отдельных скетча, и попытался их подружить, но не выходит.

    тут нужно как то изменить логику работы
    Возможно сделать классы или что нибудь подобное чтоб не было конфликта в работе программы.

    Пока не могу докумекать как это сделать.
     
  11. mcureenab

    mcureenab Гуру

    Из не работающего кода сложно понять что должно быть. Похоже вы тоже смутно предсталяете сценарий взаимодействия пользователя с системой.
     
  12. rkit

    rkit Гуру

    Вам нужно сделать два автомата - один читает датчики и сохраняет значения, другой хранит в себе логику меню и отрисовки.
     
    arduin нравится это.
  13. arduin

    arduin Нерд

    Код выше полностью рабочий 100%.
     
  14. arduin

    arduin Нерд

    А можно увидеть хотя бы простейший пример.

    Спасибо.
     
  15. mcureenab

    mcureenab Гуру

    Так в чем вопрос? Пусть работает)))
     
  16. mcureenab

    mcureenab Гуру

    У вас уже реализован конечный автомат. Его надо поправить. Но никто же не знает, что вам надо.
    Нарисуйте экраны и стрелками от кнопки в следующий экран укажите навигацию. Тогда будет возможность указать на ошибки в коде. А может и сами разберетесь.

    Сейчас из экрана 0 скетч автоматически проваливается на экран 1. Это так надо?
     
    arduin нравится это.
  17. arduin

    arduin Нерд


    У меня он не проваливается, чтоб он провалился необходимо нажатие на кнопку A

    Нажатие кнопки это как стрелка перемещение в перед.
    если убрать условие перехода на экран 2 if(page ==0){page =1;} тогда он будет прыгать без остановки.

    услови е перехода срабатывает мы нажмем кнопу A находясь на главном экране. Тогда
    выполнится переход на page 1
    if(page ==0){page =1;}


    Мне надо чтоб по умолчанию выводился главный экран, на нем были датчики и разная перифирия.
    В низу или в верху не важно, кнопка A, при нажатии н кнопку попадаем в блок меню.
    В котором имеем
    MENU 1
    Menu2
    Menu 3
    И тд.


    Скорее всего реализация моего меню хромает. Вот я и думаю как ее правильно решить.

    Я раньше писал на PHP там проще.
     
    Последнее редактирование: 6 мар 2017
  18. mcureenab

    mcureenab Гуру

    Да. Пожалуй не проваливается а вываливается из экрана 0.

    Если в коде оставить только логику переходов...

    Код (C++):
      buttonEnabled =1;
    }


    void loop()
    {
    buttonEnabled = true;//////       homemenu(); //Подключаем мен

          if (page ==0) { ////// && buttonEnabled == true) { // if you are on the "home" page (0)
          buttonEnabled = false;
    .....
         page =1;
          }
     
    Это эффективный ваш код.
     
  19. Tomasina

    Tomasina Сушитель лампочек Модератор

    Это код что выполняет?
    Код (C++):
      TSPoint p = ts.getPoint();
      pinMode(XM, OUTPUT);
      pinMode(YP, OUTPUT);
      p.x = map(p.x, TS_MAXX, TS_MINX, 0, 320);
      p.y = map(p.y, TS_MAXY, TS_MINY, 0, 240);
     
  20. arduin

    arduin Нерд

    Ну как же в начале есть boolean buttonEnabled =true;

    Это координаты сенсорного экрана.
    Экран сенсорный в место кнопок как на мобильнике сенсор


    boolean buttonEnabled =true; для того что бы,
    пока нет нажатия на сенсор инструкция не выполнялась.
     

    Вложения:

    • set.jpg
      set.jpg
      Размер файла:
      20,7 КБ
      Просмотров:
      387
    Последнее редактирование: 6 мар 2017