#include <SoftwareSerial.h>
// הגדרות פינים
const int PIN_RX = 10;
const int PIN_TX = 11;
const int M0 = 7;
const int M1 = 8;
// פינים אנלוגיים לג'ויסטיקים וטרמים
const int POT_THROTTLE = A0;
const int POT_STEERING = A1;
const int POT_TRIM_T = A2;
const int POT_TRIM_S = A3;
SoftwareSerial loraSerial(PIN_RX, PIN_TX);
// מבנה נתונים ארוז - חייב להיות זהה למקלט
struct __attribute__((packed)) ControlData {
byte header; // 0xAA
byte throttle; // 0-255
byte steering; // 0-255
byte trimT; // 0-255
byte trimS; // 0-255
byte checksum;
};
ControlData transmitterdat;
void setup() {
// הגדרת מצב עבודה למודול LoRa (Normal Mode)
pinMode(M0, OUTPUT);
pinMode(M1, OUTPUT);
digitalWrite(M0, LOW);
digitalWrite(M1, LOW);
Serial.begin(115200);
loraSerial.begin(9600);
Serial.println("Transmitter Ready - Broadcasting...");
// הגדרת ה-Header פעם אחת (הוא לעולם לא משתנה)
transmitterdat.header = 0xAA;
}
void loop() {
// 1. קריאת הערכים מהפוטנציומטרים (0-1023) והמרתם ל-0-255
//transmitterdat.throttle = map(readStable(POT_THROTTLE), 0, 1023, 0, 255);
//transmitterdat.steering = map(readStable(POT_STEERING), 430, 700, 0, 255);
//transmitterdat.trimT = map(readStable(POT_TRIM_T), 0, 1023, 0, 255);
//transmitterdat.trimS = map(readStable(POT_TRIM_S), 0, 1023, 0, 255);
int mappedValue;
mappedValue = map(readStable(POT_THROTTLE), 370, 650, 0, 255);
transmitterdat.throttle = constrain(mappedValue, 0, 255);
// 1. קריאה ומיפוי לתוך משתנה זמני שיכול להכיל מספרים מחוץ לטווח 0-255
mappedValue = map(readStable(POT_STEERING), 430, 700, 0, 255);
// 2. הגבלה (Constrain) כשהערך עדיין בתוך ה-INT
// 3. ורק אז שמירה לתוך ה-struct (מסוג byte)
transmitterdat.steering = constrain(mappedValue, 0, 255);
// דוגמה לטרים
mappedValue = map(readStable(POT_TRIM_T), 0, 1023, 0, 255);
transmitterdat.trimT = constrain(mappedValue, 0, 255);
// דוגמה לטרים
mappedValue = map(readStable(POT_TRIM_S), 0, 1023, 0, 255);
transmitterdat.trimS = constrain(mappedValue, 0, 255);
/*
transmitterdat.throttle = 100;
transmitterdat.steering = 250;
transmitterdat.trimT = 200;
transmitterdat.trimS = 127;
*/
// 2. חישוב ה-Checksum לאימות הנתונים בצד השני
transmitterdat.checksum = (byte)(transmitterdat.throttle + transmitterdat.steering +
transmitterdat.trimT + transmitterdat.trimS);
// 3. שידור המבנה המלא ל-LoRa
loraSerial.write((byte*)&transmitterdat, sizeof(ControlData));
// הדפסה לדיבאג (אופציונלי)
debugPrint();
// השהייה קטנה לקביעת קצב השידור (כ-20 פעמים בשנייה)
delay(50);
}
int readStable(int pin) {
long sum = 0;
for (int i = 0; i < 15; i++) { // לוקחים 10 דגימות
sum += analogRead(pin);
}
return sum / 15; // מחזירים את הממוצע
}
void debugPrint() {
static unsigned long lastDebug = 0;
if (millis() - lastDebug > 500) {
/*
Serial.print("Sending -> T: "); Serial.print(transmitterdat.throttle);
Serial.print(" S: "); Serial.println(transmitterdat.steering);
*/
//Serial.print("Sending -> Throttle: "); Serial.println(readStable(POT_THROTTLE));
Serial.print("Sending -> Final Throttle: "); Serial.println(transmitterdat.throttle);
//Serial.print("Sending -> Steering: "); Serial.println(readStable(POT_STEERING));
Serial.print("Sending -> Final Steering: "); Serial.println(transmitterdat.steering);
//Serial.print("Sending -> TrimT: "); Serial.println(readStable(POT_TRIM_T));
Serial.print("Sending -> Final TrimT: "); Serial.println(transmitterdat.trimT);
//Serial.print("Sending -> TrimS: "); Serial.println(readStable(POT_TRIM_S));
Serial.print("Sending -> Final TrimS: "); Serial.println(transmitterdat.trimS);
Serial.println("________ ");
lastDebug = millis();
}
}
Comments
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎