Merhabalar kütüphanesiz haberleşmede byte olarak sadece int veri mi gönderilebiliyor? Deneme olarak 1.23 verisini göndermeye çalıştığımda 1.0 verisi olarak aldım bu konuda yardımcı olabilir misiniz? byte türünden float a çevirdiğim denemede de aynı sorunla karşılaştım.
bu kod çalışsa zaten bir mucize gerçekleşti demektir. struct yapısını nasıl kullanıldığını ve float ve diğer tip verilerin nasıl gönderildiğine dair sitemizdeki yazıları bolca okumanız lazım
#include <SoftwareSerial.h> #include "LoRa_E32.h" #include <TinyGPS.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> SoftwareSerial mySerial(10, 11); // Arudino RX <-- e32 TX, Arduino TX --> e32 RX LoRa_E32 e32ttl(&mySerial); TinyGPS gps; SoftwareSerial ss(6, 5); LiquidCrystal_I2C lcd(0x27, 16, 2); unsigned long previousTime = 0.0; unsigned long currentTime = 0.0; float sample1 = 0, sample2 = 0, sample3 = 0; float flat = 0, flon = 0; unsigned long age; unsigned long age2; float voltage1 = 0.0, voltage2 = 0.0, watt = 0.0, energy = 0.0, current = 0.0; int Vo1; int Vo2; float R1 = 10000, R3 = 10000; float logR2, R2, T1, Tc1, logR4, R4, T2, Tc2; float c1 = 1.009249522e-03, c2 = 2.378405444e-04, c3 = 2.019202697e-07; volatile byte half_revolutions; unsigned int rpm; unsigned long timeold; float hizrpm = 0.0; struct Signal { float message[10]; } data; void setup() { Serial.begin(9600); e32ttl.begin(); mySerial.begin(9600); ss.begin(9600); attachInterrupt(digitalPinToInterrupt(3), magnet_detect, RISING);//intterrupt pin (Arduino digital pin 2) lcd.begin(); lcd.clear(); half_revolutions = 0; rpm = 0; timeold = 0; } void loop() { unsigned long currentTime = millis(); //calculate time in milliseconds for (int i = 0; i < 50; i++) // taking 200 samples from data collected { sample1 = sample1 + analogRead(A0); //read the voltage sample2 = sample2 + analogRead(A1);//read the second voltage sample3 = sample3 + analogRead(A2) + 1; //read the current and subtract -6 bit(-29) for optimizing delay(2);//wait 2ms } sample1 = sample1 / 50; //Measurement Part voltage1 = (sample1 * (5.0 / 1024.0)) * (503.0 / 33.0); //avarage voltage value from bit and divider to unit of V sample2 = sample2 / 50; voltage2 = (sample2 * (5.0 / 1024.0)) * (503.0 / 33.0); //avarage voltage value from bit and divider to unit of V sample3 = sample3 / 50; current = ((5.0 / 1024.0) * sample3) / 0.04 ; //avarage current value from bit to unit of A /*sample2 = sample2 / 200; current = (4.8828125 * sample2 / 40); //avarage current value from bit to unit of A*/ watt = voltage1 * current; energy = energy + ((watt * (currentTime - previousTime)) / 3600000); //wh convert //save last time value previousTime = currentTime; Serial.print(voltage1); Serial.print(" V ;"); /*Serial.print(voltage2); Serial.print(" V ;");*/ Serial.print(current); Serial.print(" A ;"); Serial.print(watt); Serial.print(" W ;"); Serial.print(energy); Serial.print(" Wh ;"); Serial.println(""); delay(100);// wait 100ms for the analog-to-digital converter to settle Vo1 = analogRead(A6); //Thermistor(Sıcaklık ölçme) R2 = R1 * (1023.0 / (float)Vo1 - 1.0); logR2 = log(R2); T1 = (1.0 / (c1 + c2 * logR2 + c3 * logR2 * logR2 * logR2)); Tc1 = T1 - 273.15; Vo2 = analogRead(A7); //Thermistor(Sıcaklık ölçme) R4 = R3 * (1023.0 / (float)Vo2 - 1.0); logR4 = log(R4); T2 = (1.0 / (c1 + c2 * logR4 + c3 * logR4 * logR4 * logR4)); Tc2 = T2 - 273.15; Serial.print("Environment Temperature: "); Serial.print(Tc1); Serial.println(" C"); Serial.print("Motor Temperature: "); Serial.print(Tc2); Serial.println(" C"); if (half_revolutions >= 5) { //Rpm rpm = 60 * 1000 / (millis() - timeold) * half_revolutions; timeold = millis(); half_revolutions = 0; } hizrpm = rpm * 60 * 0.001477; if ((millis() - timeold) >= 3000) { hizrpm = 0.0; rpm = 0; } Serial.print("Speed;"); Serial.println(hizrpm, 1); Serial.print("RPM;"); Serial.println(rpm, 1); smartdelay(100); //Gps Part Serial.println(); gps.f_get_position(&flat, &flon, &age); int alt = gps.f_altitude(); int gpsspd = gps.f_speed_kmph(); Serial.print("lat:"); Serial.println(flat, 8); Serial.print("lon:"); Serial.println(flon, 8); Serial.print("alt:"); Serial.println(alt); Serial.print("spd:"); Serial.println(gpsspd); Serial.print("Rpm:"); Serial.println(rpm); lcd.setCursor(0, 0); //LCD screening part lcd.print("S:"); lcd.setCursor(2, 0); lcd.print(gpsspd); lcd.setCursor(7, 0); lcd.print("R:"); lcd.setCursor(9, 0); lcd.print(rpm); lcd.setCursor(0, 1); lcd.print("V:"); lcd.setCursor(2, 1); lcd.print(voltage1); lcd.setCursor(7, 1); lcd.print("A:"); lcd.setCursor(9, 1); lcd.print(current); data.message[0] = voltage1, 1; //writing inside the structure array data.message[1] = current, 2; data.message[2] = watt, 2; data.message[3] = energy, 1; data.message[4] = flat, 8; data.message[5] = flon, 8; data.message[6] = alt; data.message[7] = gpsspd ; data.message[8] = rpm , 0; data.message[9] = hizrpm, 1; //data.message[10] = Tc1; //data.message[11] = Tc2; ResponseStatus rs = e32ttl.sendFixedMessage(0, 63, 23, &data, sizeof(Signal)); //message sending part } static void smartdelay(unsigned long ms) { unsigned long start = millis(); do { while (ss.available()) gps.encode(ss.read()); } while (millis() - start < ms); } void magnet_detect() { half_revolutions++; //Serial.print("detect:"); }
Mehmet bey kütüphaneli olarak kullandığım kod bu sizin kodunuzu buna entegre ettiğimde çalışmadı sizin bakma şansınız var mı gönderilmesi gereken veriler data.message[] olarak belirtilen kısım alıcıyı sizden gördüğüm şekilde yazdığım halde veri alamadım.
eray senin için yazı haline de getirdim başlığı https://fixaj.com/kutuphanesiz-lora-kullanimi/
send
#include <SoftwareSerial.h> SoftwareSerial FixSerial(10, 11); byte i = 0; #define M0 7 #define M1 6 void setup() { Serial.begin(115200); pinMode(M0, OUTPUT); pinMode(M1, OUTPUT); digitalWrite(M0, LOW); digitalWrite(M1, LOW); FixSerial.begin(9600); } void loop() { FixSerial.write((byte)0x00); //Alıcı Adresi HIGH FixSerial.write(3); //Alıcı Adresi LOW FixSerial.write(18); //Alıcı Kanalı =0x17=23 (410M+23=433 MHz) FixSerial.println(String(5.698, 3)); delay(500); }
receive
#include <SoftwareSerial.h> SoftwareSerial FixSerial(10, 11); char rc; #define M0 6 #define M1 7 void setup() { Serial.begin(115200); pinMode(M0, OUTPUT); pinMode(M1, OUTPUT); digitalWrite(M0, LOW); digitalWrite(M1, LOW); FixSerial.begin(9600); } void loop() { while (FixSerial.available()) { rc = FixSerial.read(); Serial.print(rc); } }
bu çalışır ama performans düşünürsen float u önce int e çevir misal 5.698 = 5.698×1000 sonra alıca onu tekrar dönüştür veya serial konusunda tecrüben fazla yoksa kütüphane kullan örnek kodlar sayfasında transreceiver alıcı verici uygulamasına göz atabilirsin
Google dan aradığımda bulduğum çözümleri denedim ama çalışmadı ya da yazılış cinsini tam anlatmadıkları için koduma entegre edemedim bu konuda fikriniz varsa yazabilir misiniz?
100 lerce farklı çözümü var biraz google da araştırmanı tavsiye ederim:
Serial.write a float value