avatar_kotan04

arduino seri monitör desimal sayı girme

Başlatan kotan04, 13 Mart 2022, 01:07:40

kotan04

merhaba arkadaşlar

bu aralar arduino ile uğraşıyorum seri monitörden 16 bitlik hız değişkeninine desimal sayıyı nasıl girebilirim ?

örneğin 500 girmek istediğimde ascii olarak giriyor

int16_t hiz=0;        //16 bit hız değişkeni

Hattuşa

benim anladığım arduino kartınız pc ye bağlı iken klavyeden girdiğiniz değeri int değişkenine atmak istiyorsunuz. Bu şekilde olabilir
if(Serial.available()>0) // Chek for availablity of data at Serial Port
  {
    int valA = Serial.parseInt();
    
  }


kotan04

Alıntı yapılan: Hattuşa - 13 Mart 2022, 10:47:49benim anladığım arduino kartınız pc ye bağlı iken klavyeden girdiğiniz değeri int değişkenine atmak istiyorsunuz. Bu şekilde olabilir
if(Serial.available()>0) // Chek for availablity of data at Serial Port
  {
    int valA = Serial.parseInt();
    
  }


merhaba benim kullanmak istediğim rakam aralığı 100-65535 aralığında int tipi değişken sanırım 32767
serial.parseint kodunu kullandığımda rakam giriyorum fakat seri monitörden alt sekmeye indiğimde yada beklediğimde değişken içeriği sıfırlanıyor bunu çözemedim :(

mehmet

uint16_t
veya unsigned int
olarak tanımlayın.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

kotan04

#4
Alıntı yapılan: mehmet - 14 Mart 2022, 12:26:57uint16_t
veya unsigned int
olarak tanımlayın.
merhaba

uint16_t olarak tanımlı fakat 

uint16_t valA = Serial.parseInt();

komutunda değişken değerini 500 giriyorum değişkene kaydediyor bir süre sonra tekrar sıfırlıyor.

Hattuşa

#5
datayı doğru çekmekle ilgili sorununuz yok o zaman, belki yenileme ile ilgili veya başka bir sorununuz vardır usta.
Yada siz girdiğiniz değişkeni glabal değişken yapıp yani void setupun üzerinde tanımlayın. belki seri port ekranı kendini yenilediği için ve yeni değer gelmediği için sıfırlıyor olabilir. Yada;
if(Serial.available()>0) // Chek for availablity of data at Serial Port
  {
    int valA = Serial.parseInt();
  }
if(valA !=0){Gelendeger =ValA;}

deneyin


kotan04

hocam dediğiniz gibi yaptım fakat problemim devam ediyor girdiğim 500 sayısını tekrar sıfırlıyor..

kodları ekledim isterseniz bir göz atın..

#include <EEPROM.h>
#include <Arduino.h>
#include <HC05.h> 
//#ifdef HC05_SOFTWARE_SERIAL
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(10, 11); // TX | RX


const int buton1 = 2;  
const int buton2 = 3; 
const int buton3 = 4; 

int led1  = 13;
int led2  = 12;
int led3  = 11;

//int sayac  ; // = 0;
int16_t hiz=0;        //16 bit hız değişkeni
int16_t gelendeger=0;        //16 bit hız değişkeni


uint8_t kayit1;        //hızı eproma kaydetmek için ilk değişken
uint8_t kayit2;        //hızı eproma kaydetmek için ikinci değişken

int8_t sayac=0; 
uint8_t kayit3;        //hızı eproma kaydetmek için ilk değişken

void setup()

{
 
Serial.begin(9600);   //Seri iletişimi başlatır



delay (1000);
 
pinMode(led1,  OUTPUT);
pinMode(led2,  OUTPUT);
pinMode(led3,  OUTPUT);
pinMode(buton1, INPUT_PULLUP);
pinMode(buton2, INPUT_PULLUP);
pinMode(buton3, INPUT_PULLUP);//animasyon

kayit1=EEPROM.read(0);
kayit2=EEPROM.read(1); //eepromun 0. adresini ve1. adresini okuyoruz
kayit3=EEPROM.read(3);


if(kayit1==255)kayit1=1;
if(kayit2==255)kayit2=0;//burada eeproma hiç veri yazılmadıysa 255 döner biz 100ms yapacağımız için kayıt1=1 diyoruz kayıt2=0 yapıyoruz
hiz=kayit1*100+kayit2;  //epromu okuyup kayıtlı değerleri hız degerine 16 bit olarak kayrıt etmiş oluyoruz//savaş yıldırım
sayac=kayit3;
}



void loop()


 
  {
  

  kontrol(); 
  switch (sayac) { // i değişkeninin değerini hafızada tut
case 1: // i değişkeni değeri 1 ise
 


while(1){

digitalWrite(led1, HIGH); //
digitalWrite(led2, LOW); // 
delay(hiz);
 
kontrol();
kontrol2();
digitalWrite(led1, LOW); //
digitalWrite(led2, LOW); // 
delay(hiz);
 
kontrol();
kontrol2();
digitalWrite(led1, HIGH); //
digitalWrite(led2, LOW); // 
delay(hiz); 
kontrol();
kontrol2();
  
//loop ();
}



break; // kontrolü sonlandır
case 2: // i değişkeni değeri 2 ise
while(1){

digitalWrite(led1, HIGH); //
digitalWrite(led2, LOW); // 
delay(hiz);
 
kontrol();
digitalWrite(led1, LOW); //
digitalWrite(led2, HIGH); // 
delay(hiz);

kontrol(); 
 
 
}
break; // kontrolü sonlandır
case 3: // i değişkeni değeri 3 ise
//digitalWrite(4, HIGH); // 4 numaralı dijital çıkışı 1 yap
break; // kontrolü sonlandır
default: // yukarıdaki şartların hiçbirinde eşitlik sağlanmazsa
//digitalWrite(5, HIGH); // 5 numaralı dijital çıkışı 1 yap
break; // kontrolü sonlandır 

}
}
  
   
	 
	
 void kontrol2()
 {
 
if(Serial.available()>0) // C // Eğer Bluetooth bağlantısı varsa...
 
 hiz=Serial.parseInt();
    save();
    kontrol();
  
 
           delay(50); 

 if(hiz !=0){gelendeger =hiz;}
 }  
 


 
 void kontrol()

           
          
  

	   
          	   
        {    
        {
      	{
 
           while(digitalRead(buton1)==LOW)//savaş yıldırım
     	   
           { 
	   {
 
           hiz=hiz+10;
           
           save();
           delay(50); 
           if(hiz>=3000) hiz=3000; 
	  }
 
	   
	   
	   
	   }
 
           while(digitalRead(buton2)==LOW) 
           {
	   
	   
 
           
           hiz=hiz-10;
           save();
           delay(50); 
           if(hiz<=100) hiz=100;
 

	   

           //
           }
              
	   
	    if(digitalRead(buton3) == LOW)
 
	       {
          sayac=sayac+1;
 
          save();
	   
          delay(100); 
          if(sayac>=4) sayac=0; 
 
	  
	  return;
	   } 
	   
	 
   

    
     
  }   
  }   
 }	   
	   
	   
	   
           
 
 void save()
  {
  kayit3=sayac;
  kayit1=hiz/100;kayit2=hiz%100;
    EEPROM.write(0,kayit1);EEPROM.write(1,kayit2);EEPROM.write(3,kayit3);
     
   // return;
   }

mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

kotan04

Alıntı yapılan: mehmet - 14 Mart 2022, 15:33:07Header koymak gerekli.
https://www.mehmetbilgi.net.tr/arduino-ile-seri-port-uzerinden-7-segment-display/

merhaba mehmet bey tam olarak anlayamadım

sanırım
//                                   dGFEDCBA
const uint8_t tablo2[MAX_TABLO] = {0b00111111, //0
								   0b00000110, //1
								   0b01011011, //2
								   0b01001111, //3
								   0b01100110, //4
								   0b01101101, //5
								   0b01111101, //6
 								   0b00000111, //7
								   0b01111111, //8
								   0b01101111 //9
								  };
bu kısmı uyarlamam lazım doğrumudur ?

kotan04

merhaba bu konuyu çözemedim yardımcı olabilir misiniz?

Hattuşa

hocam yardımcı olmak isterim aslında ama sanki siz aldığınız değerle ilgili sorununuz yok, mesela
Alıntı Yapif (hiz != 0) {
    gelendeger = hiz;
  }
burda ki gelendeger değişkeni serialden gelen bilgi değil mi? ama siz bu değeri hiç bir yerde kullanmamışsınız ki, gene hız değişkenini kullanmışsınız dolayısıyla gelendegerin bir önemi yok.
yanlışmıyım?

Hattuşa

#11
if (Serial.available() > 0) // C // Eğer Bluetooth bağlantısı varsa...
{
    int gelen = Serial.parseInt();
  if (gelen!= 0) {
    hiz= gelen;
  }
  save();
  kontrol();
delay(50);
}


  


kodu bu şekilde düzenlerseniz bence daha mantıklı olur

kotan04

Alıntı yapılan: Hattuşa - 15 Mart 2022, 10:29:00
if (Serial.available() > 0) // C // Eğer Bluetooth bağlantısı varsa...
{
    int gelen = Serial.parseInt();
  if (gelen!= 0) {
    hiz= gelen;
  }
  save();
  kontrol();
delay(50);
}


  


kodu bu şekilde düzenlerseniz bence daha mantıklı olur

merhaba hattuşa hocam dediğiniz düzeltmeyi yaptım kodum çalıştı sanırım ben kodu daha öncede çalıştırdım
problem olduğunu düşünmeme sebap olan değişkenin sıfırlama konusuydu derlediğim zaman terminalden sayı girdiğimde sıfırlama oluyordu watch window içinde tanımladığım değişken yerine değikenin kendisini tekrar oluşturdum sıfırlama konusu düzeldi.
çok teşekürler.

Hattuşa

hocam sorun konuyu bilmemeniz değil elbette, dikaktinizden kaçan noktayı bulmak ki buda onlardan birisi, herneyse sorunun çözülmesine sevindim

kotan04

çok teşekkür ederim hayırlı günler.

Powered by EzPortal