Способ(ы) сохранения целого числа из последовательного вывода и вычитания его из следующего последовательного вывода
Это кажется таким простым, но я не могу решить. (Я новичок в программировании) Я не хочу использовать 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!
*/
@jeff, 👍0
1 ответ
У вас объявлены следующие глобальные переменные:
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); // Вычитаем первое из второго ... получаем количество градусов, на которое нужно повернуть ротор
- Как объявить массив переменного размера (глобально)
- Программирование Arduino с использованием Python, а не C/C ++
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как справиться с rollover millis()?
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Можно ли сделать несколько функций loop() с помощью Arduino Uno?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- устаревшее преобразование из строковой константы в 'char*'