#define FRAME_HEADER 0xAB
#define FRAME_FOOTER '\n'
#define button_left 34
#define button_right 35
#define button_down 32
#define SERIAL_BAUD 115200
#define DATA_BUFFER 5
// Минимальное значение давления в hPa(935.0) (27.50 inHg)
// Максимальное значение давления в hPa(1065.0) (31.50 inHg)
const int QNH = 1016; // Значение QNH
byte data[DATA_BUFFER];
void setup() {
Serial.begin(SERIAL_BAUD);
}
void loop() {
cleanData();
// Ниже эти функция в старом варианте
data[0] = (byte) !digitalRead(button_left);
data[1] = (byte) !digitalRead(button_right);
// Старая функция
//if (!digitalRead(button_right)) {
// data[1] = 1;
//}
// Еще более старая функция
// if (!digitalRead(button_left)) {
// data[0] = 1;
// } else {
// data[0] = 0;
// }
if (!digitalRead(button_down)) {
int QNH_normalise = convertPressureToValue(QNH); // приведение QNH к виду 000-400
int qnhValue = QNH_normalise;
data[2] = qnhValue / 100; // Передаем сотни
qnhValue %= 100; // Оставшиеся десятки и единицы
data[3] = qnhValue / 10; // Передаем десятки
data[4] = qnhValue % 10; // Передаем единицы
}
Serial.print(FRAME_HEADER, HEX);
for (int i = 0; i < DATA_BUFFER; i++) {
Serial.print(data[i]);
}
Serial.println(FRAME_FOOTER, HEX);
delay(1000);
}
void cleanData() {
for (int i = 0; i < DATA_BUFFER; i++) {
data[i] = 0;
}
}
//конвертация давления в диапазоне от 27.50 inHg до 31.50 inHg в значения от 000 до 400 на основе значений в hPa
int convertPressureToValue(float pressurehPa) {
const float MIN_PRESSURE_HPA = 935.0; // Минимальное значение давления в hPa (27.50 inHg)
const float MAX_PRESSURE_HPA = 1065.0; // Максимальное значение давления в hPa (31.50 inHg)
const int MIN_VALUE = 0; // Минимальное значение в диапазоне 000-400
const int MAX_VALUE = 400; // Максимальное значение в диапазоне 000-400
float normalizedPressure = (pressurehPa - MIN_PRESSURE_HPA) / (MAX_PRESSURE_HPA - MIN_PRESSURE_HPA);
int value = static_cast<int>(normalizedPressure * (MAX_VALUE - MIN_VALUE));
// Ограничиваем значение в диапазоне 000-400
if (value < MIN_VALUE) {
value = MIN_VALUE;
} else if (value > MAX_VALUE) {
value = MAX_VALUE;
}
return value;
}
//Диапазон значений составляет от 000 до 400 и измеряется в долях дюйма ртутного столба (inHg) умноженных на 100.
//При этом имеется смещение на 27.50 inHg, и общий диапазон составляет от 27.50 inHg до 31.50 inHg.
//Значения в этом диапазоне означают:
//000: Значение 0 соответствует атмосферному давлению в 27.50 inHg.
//100: Значение 100 означает прибавку к атмосферному давлению. Таким образом, значение 100 будет соответствовать 27.50 + 1.00 = 28.50 inHg.
//200: Значение 200 означает прибавку в 2.00 к атмосферному давлению. Таким образом, значение 200 будет соответствовать 27.50 + 2.00 = 29.50 inHg.
//242: Значение 242 соответствует атмосферному давлению 29.92 inHg, что является стандартным атмосферным давлением на уровне моря.
//300: Значение 300 означает прибавку в 3.00 к атмосферному давлению. Таким образом, значение 300 будет соответствовать 27.50 + 3.00 = 30.50 inHg.