volatile unsigned long sonZaman = 0;
volatile unsigned long gecenSure = 0;
volatile bool sinyalDegisti = false;
volatile int sonDurum = HIGH;
void setup() {
Serial.begin(115200);
pinMode(2, INPUT_PULLUP); // TSSP4038 den gelen sinyal girişi
// Pin 2'deki her değişimde sinyalOlc fonksiyonunu çağırırr
attachInterrupt(digitalPinToInterrupt(2), sinyalOlc, CHANGE);
Serial.println("Sinyal bekleniyor.");
}
void loop() {
if (sinyalDegisti) {
unsigned long milisaniyeSuresi = gecenSure / 1000;
int durum = sonDurum;
sinyalDegisti = false;
/*
TSSP4038 çalışması:
38kHz Sinyal VARSA = Pin LOW olur (0V)
38kHz Sinyal YOKSA = Pin HIGH olur (5V)
*/
if (durum == LOW) {
if (milisaniyeSuresi >= 9 && milisaniyeSuresi <= 11) {
Serial.println("Sonuç: 0 biti (10ms Sinyal)");
}
else if (milisaniyeSuresi >= 14 && milisaniyeSuresi <= 16) {
Serial.println("Sonuç: 1 biti(15ms Sinyal)");
}
}
else {
if (milisaniyeSuresi >= 4 && milisaniyeSuresi <= 6) {
Serial.println("Durum: bekleme (5ms Boşluk)");
}
}
}
}
void sinyalOlc() {
unsigned long suAnkiZaman = micros();
gecenSure = suAnkiZaman - sonZaman;
sonZaman = suAnkiZaman;
sonDurum = digitalRead(2);
sinyalDegisti = true;
}
Evet yukarıda kod ile bitleri alabiliyorum ama metin olarak çevirirken bazen istedigim karakter çıkıyor sonra komple gelen veri bozuluyor, şimdi irremote kutuphanesini denedim ve istedigim yazıyı aktarabiliyorum, ben mantığını öğrenmek ve yapabilmek için bastaki gibi bit bit aktarmak istedim, ama 2 gündür uğraşıyorum olmuyor. IR remote ile 5dk de olduEğer anahtarlama yapacaksan yani bir bir bitlik veri değişimi istiyorsan yukarıdaki kod işini görecektir ama bitlerden oluşan bir veri taşıyacaksan yukarıdaki gibi bir yöntem kullanamazsın çünkü arduino kitaplığındaki fonksiyonlar üst seviye kullanıcı dostu fonksiyonlardır ve zaman kaybına sebep olur. veri taşırken kullanamazsın. Eğer kızılötesi bir iletişimle veri taşıyacaksan Arduino için IRremote kitaplığı var hem veri alıp hem veri gönderebilirsin.
https://github.com/Arduino-IRremote/Arduino-IRremote
volatile unsigned long gecenSure = 0;
volatile unsigned long sonZaman = 0;
volatile bool yeniVeri = false;
byte gelenBayt = 0; //Bitleri burada taplar
int bitSayaci = 0; //8 bit olunca yazdırırr
void setup() {
Serial.begin(115200);
pinMode(2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), sinyalOlc, CHANGE);
}
void loop() {
if (yeniVeri) {
unsigned long sure = gecenSure / 1000;
int durum = digitalRead(2); //Sinyal bittikten sonraki durum (HIGH ise sinyal az önce LOW du)
yeniVeri = false;
//sinyal VARKEN TSSP çıkışı LOW iken geçen süreyi ölçer
if (durum == HIGH) {
int okunanBit = -1;
if (sure >= 9 && sure <= 11) okunanBit = 0; // 10ms 0 Biti
else if (sure >= 14 && sure <= 16) okunanBit = 1; // 15ms 1 Biti
else if (sure > 25) { // 30ms gibi uzun bir sinyal gelirse diye
bitSayaci = 0; gelenBayt = 0;
return;
}
if (okunanBit != -1) {
gelenBayt |= (okunanBit << bitSayaci);
bitSayaci++;
if (bitSayaci == 8) {
Serial.print((char)gelenBayt);
bitSayaci = 0;
gelenBayt = 0;
}
}
}
}
}
void sinyalOlc() {
unsigned long suAn = micros();
gecenSure = suAn - sonZaman;
sonZaman = suAn;
yeniVeri = true;
}
const int irLedPin = 3;//IR LED bu pine bağlı
void setup() {
pinMode(irLedPin, OUTPUT);
}
void sinyalGonder(int msSure) {
tone(irLedPin, 38000);
delay(msSure);
noTone(irLedPin);
}
void harfGonder(char karakter) {
// HEADER - 30ms sinyal ve 10ms boşluk
sinyalGonder(30);
delay(10);
for (int i = 0; i < 8; i++) {
bool bitDegeri = bitRead(karakter, i);
if (bitDegeri == 0) sinyalGonder(10);
else sinyalGonder(15);
delay(5); //Her bit arası 5ms bekle
}
}
void loop() {
harfGonder('A');
delay(2000);
}
// Değişkenlerimiz (Kütüphanesiz)
volatile unsigned long gecenSure = 0;
volatile unsigned long sonZaman = 0;
volatile bool yeniVeri = false;
byte gelenBayt = 0;
int bitSayaci = 0;
bool veriBasladi = false;
void setup() {
Serial.begin(115200);
pinMode(2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), sinyalOlc, CHANGE);
}
void loop() {
if (yeniVeri) {
unsigned long sure = gecenSure / 1000;
int durum = digitalRead(2);
yeniVeri = false;
if (durum == HIGH) {
//1. HEADER (BAŞLANGIÇ) KONTROLÜ
if (sure >= 28 && sure <= 32) { // 30ms mi ortalama?
veriBasladi = true;
bitSayaci = 0;
gelenBayt = 0;
Serial.println("\n Yeni Paket Basladi ");
}
else if (veriBasladi) {
if (sure >= 9 && sure <= 11) {
bitWrite(gelenBayt, bitSayaci, 0);
bitSayaci++;
}
else if (sure >= 14 && sure <= 16) {
bitWrite(gelenBayt, bitSayaci, 1);
bitSayaci++;
}
if (bitSayaci == 8) {
Serial.print("Okunan Karaktert: ");
Serial.println((char)gelenBayt);
veriBasladi = false;
}
}
}
}
}
void sinyalOlc() {
unsigned long suAn = micros();
gecenSure = suAn - sonZaman;
sonZaman = suAn;
yeniVeri = true;
}
Efendim teşekkür ederim , kütüphanesiz başarılı şekilde yaptım, şuanda geliştirme amaçlı neler yapabilirim bunu düşünüyorum desteğiniz olmasa basaramazdimYani alıcı ve verici tarafını kütüphanesiz baştan özetlersek mantık olarak şöyle bir kod yapısı olabilir sanırım.
Verici tarafı:
C++:const int irLedPin = 3;//IR LED bu pine bağlı void setup() { pinMode(irLedPin, OUTPUT); } void sinyalGonder(int msSure) { tone(irLedPin, 38000); delay(msSure); noTone(irLedPin); } void harfGonder(char karakter) { // HEADER - 30ms sinyal ve 10ms boşluk sinyalGonder(30); delay(10); for (int i = 0; i < 8; i++) { bool bitDegeri = bitRead(karakter, i); if (bitDegeri == 0) sinyalGonder(10); else sinyalGonder(15); delay(5); //Her bit arası 5ms bekle } } void loop() { harfGonder('A'); delay(2000); }
Alıcı tarafı:
C++:// Değişkenlerimiz (Kütüphanesiz) volatile unsigned long gecenSure = 0; volatile unsigned long sonZaman = 0; volatile bool yeniVeri = false; byte gelenBayt = 0; int bitSayaci = 0; bool veriBasladi = false; void setup() { Serial.begin(115200); pinMode(2, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(2), sinyalOlc, CHANGE); } void loop() { if (yeniVeri) { unsigned long sure = gecenSure / 1000; int durum = digitalRead(2); yeniVeri = false; if (durum == HIGH) { //1. HEADER (BAŞLANGIÇ) KONTROLÜ if (sure >= 28 && sure <= 32) { // 30ms mi ortalama? veriBasladi = true; bitSayaci = 0; gelenBayt = 0; Serial.println("\n Yeni Paket Basladi "); } else if (veriBasladi) { if (sure >= 9 && sure <= 11) { bitWrite(gelenBayt, bitSayaci, 0); bitSayaci++; } else if (sure >= 14 && sure <= 16) { bitWrite(gelenBayt, bitSayaci, 1); bitSayaci++; } if (bitSayaci == 8) { Serial.print("Okunan Karaktert: "); Serial.println((char)gelenBayt); veriBasladi = false; } } } } } void sinyalOlc() { unsigned long suAn = micros(); gecenSure = suAn - sonZaman; sonZaman = suAn; yeniVeri = true; }
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?