Способ(ы) сохранения целого числа из последовательного вывода и вычитания его из следующего последовательного вывода

Это кажется таким простым, но я не могу решить. (Я новичок в программировании) Я не хочу использовать EEPROM. Просто сохраните его и сделайте расчеты. Я извлекаю значения азимута и высоты из программы спутникового трекера и мне нужно рассчитать разницу, на которую переместился спутник, чтобы повернуть роторы. Вот мои усилия, которые были запрошены... Спасибо

/* Эскиз для программного обеспечения для отслеживания спутников WXtrack
* VE3COJ Берлингтон, Онтарио, Канада
* Требуется COM-порт и Max 232 от ПК
* к последовательному входу на Arduino (Rx)
*
* URL для загрузки: http://www.satsignal.eu/software/wxtrack.htm
*
* Настройка в WXtrack: Перейдите в <Меню трекера> <Параметры> <Выберите COM-порт EGIS> <отметьте флажок Режим XY>
* Выберите спутник вручную в поле «Таймфрейм».
* Выделите значок спутника, используйте поле секунд (третье поле слева) для увеличения номера спутника.
* Используйте Sketch Monitor для просмотра показаний угла места и азимута с последовательного порта.
* В качестве альтернативы можно использовать массив для моделирования приращений угла места и азимута в градусах.
*/


      #include <Stepper.h>
      #include <avr/pgmspace.h>
      #define STEP 50
      #define motorSteps 600      // Количество шагов для поворота двигателя
      #define motorPin1 8
      #define motorPin2 9
      #define motorPin3 10
      #define motorPin4 11

      // В финальном проекте будут использоваться 2 платы EasyDriver //


          String readString, read_az, read_el;

          int el_current_store_0;           // высота ... глобальное значение ??
          int el_current_store_1;
          int el_position;                  // конечное значение в градусах для перемещения ротора

          int az_current_store_1;           // азимут ..... глобальное значение ??

       void setup() {


          Serial.begin(9600);
          Serial.println("  AZ & EL "); // чтобы я мог отслеживать высоту и азимут
          Serial.println (" =========");
          Serial.print("");
      }

      void loop() {

           while (Serial.available()) {
              delay(3);  //задержка, позволяющая заполнить буфер
               if (Serial.available() >0) { 
              char c = Serial.read();  //получает один байт из последовательного буфера
           readString += c; //делает строку readString
      }
    }

          if (readString.length() >0) {
          //Serial.println(readString); //проверьте, что было получено от последовательного ввода

          // извлекаем требуемые числовые значения... анализируем последовательный вывод
          // В меню WXtrack выберите «Трекер» > «Параметры» > «EGIS COM» & «Режим XY»
          read_az = readString.substring(3, 7);   //получить первые 3-6-е целые числа (azmuth)
          read_el = readString.substring(10, 13); //получить следующие 10 до 13-го целых чисел (возвышение)

         int el_current_store = read_el.toInt();  // Изменить строку el на целое число
         int az_current_store = read_az.toInt();  // Изменяем строку Az на целое число

        /* This is an attemp to calculate the difference in degrees the satellite moves. */

         int n1 = el_current_store_0;       // первое показание высоты ... сохранить его ... как?
         int n2 = el_current_store_1;       // второе показание высоты ...
         int el_position = (n2 - n1);       // Вычитаем первое из второго ... получаем количество градусов, на которое нужно повернуть ротор


                                           // если результат отрицательный, ротор меняет направление

          /* Can't be done as is because the reading gets put in all variables

           * I cannot figure out how to store the number of degrees in memory (Not EEPROM)
           *  EEPROM will burn out eventually, FLASH cannot change values it appears... in docs.
           *  
           * From here:
           * Store first reading from Serial port into memory. 
           * Rotor moves to degrees probably 3 degrees ... read second position (if 4 degrees)
           * Subtract 3 degrees from 4 degrees equals 1 and multiply by variable STEP (200 STEP = 1 degree motor rotation)
           * Get next elevation reading and repeat subtraction... 
           */


           // Вывести на последовательный монитор, чтобы увидеть результаты всех значений //


           Serial.print("  Elevation = ");
           Serial.println(read_el);

           Serial.print("  Azimuth = ");
           Serial.println(read_az); 

           //Serial.println(el_position);
           Serial.println (" --------next-------");

           Serial.print("");

           readString="";
          }
         }

          /* 1. ========= Send Antenna to 0 degrees / Check for interrup at 0 degrees & Stop ========= 
                ========= Wait for Serial input then goto 2. ========= 

             2. ========= Get Az and El from Serial Port and Start Tracking ==========  

             3. ========= Store (first, second, etc. ) El and AZ ========= 

             4. ========= Get Next El and Az / Subtract from one before El & Az ========= 

             5. ========= Move Antenna to Next Position ======= 

             6. ======== Goto 3. ========= 

             7. ======== If El Equals 0, Goto 1.

                       When El = 90 degrees, (Satellite overhead) Az rotates 180 degrees and 

                       El decreases, coming down to the horizon.

                      When Satellite is off to E or W, elevation does not reach 90 degrees!
         */   

, 👍0


1 ответ


3

У вас объявлены следующие глобальные переменные:

int el_current_store_0;           // высота ... глобальное значение ??
int el_current_store_1;
int el_position;                  // конечное значение в градусах для перемещения ротора

int az_current_store_1;           // азимут ..... глобальное значение ??

Но вы никогда ничего не вносите в эти переменные.

Вот ваш соответствующий код, который пытается работать с этими значениями:

// извлекаем требуемые числовые значения... анализируем последовательный вывод
// В меню WXtrack выберите «Трекер» > «Параметры» > «EGIS COM» & «Режим XY»
read_az = readString.substring(3, 7);   //получить первые 3-6-е целые числа (azmuth)
read_el = readString.substring(10, 13); //получить следующие 10 до 13-го целых чисел (возвышение)

int el_current_store = read_el.toInt();  // Изменить строку el на целое число
int az_current_store = read_az.toInt();  // Изменяем строку Az на целое число

Выше вы объявляете новые переменные el_current_store и az_current_store и присваиваете им целочисленные значения, преобразованные из входной строки. Когда вы добавляете к имени переменной префикс int (или любой другой тип), вы объявляете новую переменную в этой области действия. В этом случае областью действия является блок if (readString.length() >0) {}. После завершения этого блока эти переменные больше не существуют, и каждый раз при запуске этого блока там создаются новые переменные, которые уничтожаются в конце блока.

/* Это попытка рассчитать разницу в градусах, на которую движется спутник. */

int n1 = el_current_store_0;       // первое показание высоты ... сохранить его ... как?
int n2 = el_current_store_1;       // второе показание высоты ...
int el_position = (n2 - n1);       // Вычитаем первое из второго ... получаем количество градусов, на которое нужно повернуть ротор

Выше вы объявляете новые переменные n1, n2 и el_position. Однако вы даете n1 и n2 то, что было в el_current_store_0 и el_current_store_1, но вы никогда не помещали никаких значений в эти переменные, и поэтому у них ничего нет.

Как только эта проблема будет решена, вам также нужно будет рассмотреть объявление новой переменной с помощью команды:

int el_position = (n2 - n1);       // Вычитаем первое из второго ... получаем количество градусов, на которое нужно повернуть ротор

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

Вместо этого следует присвоить вычисленное значение el_position, не создавая новую переменную:

el_position = (n2 - n1);       // Вычитаем первое из второго ... равно количеству градусов, на которое нужно повернуть ротор

(Обратите внимание, что в начале нет int...)

**EDIT: Чтобы на самом деле сохранить значения для следующего loop(), вам нужно сохранить их в глобальных (или статических) переменных. Похоже, вы хотели сделать что-то вроде этого:

     int el_current_store = read_el.toInt();  // Изменить строку el на целое число
     int az_current_store = read_az.toInt();  // Изменяем строку Az на целое число

    /* This is an attemp to calculate the difference in degrees the satellite moves. */

     // Добавленный ниже код сохраняет старое значение в *_1
     // Помещает новое значение в *_0
     el_current_store_1 = el_current_store_0;
     el_current_store_0 = el_current_store;

     az_current_store_1 = az_current_store_0;
     az_current_store_0 = az_current_store;

     int n1 = el_current_store_0;       // первое показание высоты ... сохранить его ... как?
     int n2 = el_current_store_1;       // второе показание высоты ...
     int el_position = (n2 - n1);       // Вычитаем первое из второго ... получаем количество градусов, на которое нужно повернуть ротор
,