0-1023 aralığını 0-100 aralığına çevirmek istiyorum ama 1023 değerine denk olarak 0 olacak ve 0 için de 100 değerini alacak. Map komutunu denedim ama olmuyor. Başka bir şekilde nasıl yapabilirim ?
Anlamadığın yeri sorabilirsin.
void setup() {
Serial.begin(115200);
delay(1000);
float yuzdelikDeger = yuzdelikBul( 1023 , 0 , BURAYA SAYIYI YAZ));
Serial.println(yuzdelikDeger);
}
void loop() {
}
float yuzdelikBul(int baslangic, int bitis, int deger) {
bool yon = baslangic > bitis;
if ( !yon ) {
int geciciSayi = baslangic;
baslangic = bitis;
bitis = geciciSayi;
}
float sonuc = (100 * (deger - baslangic)) / (bitis - baslangic);
return yon ? sonuc : 100 - sonuc;
}
float yuzdelikbul fonksiyonunu tam anlamadım. Ayrıntılı anlatabilir misin?
Ayrıca bu kodu Arduino iot cloud’da kullanacağım. Bu durumda istediğim değişkenin kodda neyin yerine yazmam gerekir?
-BURAYA SAYIYI YAZ dediğiniz kısımda map komutuna benzer olarak ,0,100)’ mü yazacağım yoksa sadece 100 mü yazacağım? O kısmı da anlatabilirseniz çok memnun olurum. Teşekkürler.
yudelikbul fonksiyonu tam olarak istediğin işlemi görüyor. Fonksiyonun içerisinde ne olduğuyla ilgilenmene gerek yok. Sadece fonksiyonu kodunun içine entegre et.
float yuzdelikBul(int baslangic, int bitis, int deger) {
bool yon = baslangic > bitis;
if ( !yon ) {
int geciciSayi = baslangic;
baslangic = bitis;
bitis = geciciSayi;
}
float sonuc = (100 * (deger - baslangic)) / (bitis - baslangic);
return yon ? sonuc : 100 - sonuc;
}
Fonksiyona baslangic , bitis , deger olmak üzere 3 adet parametre giriliyor. Fonksiyon bu üç parametreyi alıyor ve sonucunda sana deger ifadesinin başlangıç ile bitiş değeri arasında hangi yüzdeliği ifade ettiğini float olarak veriyor.
Daha iyi anlaşılabilmesi için fonksiyonun nasıl kullanacağı konusunda buraya bir kaç örnek bırakıyorum. Eğer hala kafa karışıklığın devam ederse biraz daha ayrıntı vermeye çalışırım.
// 300 ile 900 arasında bulunan 600 sayısının yüzdeliği şu şekilde bulunur.
// 600 sayısı 300 ile 900 sayısının tam ortasında olduğu için cevap %50 çıkacaktır.
yuzdelikBul( 300 , 900 , 600 );
// 0 ile 1000 arasında bulunan 800 sayısının yüzdeliği şu şekilde bulunur. Ve cevap %80 çıkacaktır.
yuzdelikBul( 0 , 1000 , 800 );
// 0 ile 100 arasında bulunan 60 sayısının yüzdeliği şu şekilde bulunur. Ve cevap %60 çıkacaktır.
yuzdelikBul( 0, 100, 60);
// 0 ile 1023 arasında bulunan 250 sayısının yüzdeliği şu şekilde bulunur.
// 250 sayısı 0 ile 1023 sayısının yaklaşık çeyreği kadar olduğu için cevap %25 değerine yakın çıkacaktır.
yuzdelikBul( 0, 1023 , 250);
NOT : Eğer yüzdelikler tersten hesaplanmak isteniyorsa , yani senin istediğin gibi 0 değeri %100 ’ ü , 1023 değerinin ise %0 olarak çıkmasını istiyorsan. Yapman gereken tek şey başlangıç ile bitiş değerinin yerini değiştirmek olacaktır. Bu durum için aşağıdaki örneği uygulayabilirsin.
// 0 ile 1023 arasında bulunan 250 sayısının tersten yüzdeliğinin bulunup consola yazdırılması.
float sonuc = yuzdelikBul( 1023 , 0 , 250 );
Serial.println(sonuc);
Anladım. Sen sabit bir sayıyı yüzdeliğe çevirmek için bu kodu kullanıyorsun. Ben toprak nem sensöründen okuduğum değeri eş zamanlı olarak yüzdeliğe çevirerek okumak istiyorum. Yani bi loop söz konusu aslında. Ne gibi değişiklikler yapmam lazım bu konuda?
loop içerisinde sürekli yuzdelikBul( 1023 , 0 , nem ); komutunu kullanabilirsin.
Kodunu gönderir misin.
Aşağıdaki kodda ek olarak sıcaklık sensorunun de kodları mevcut. Bu nedenle kod biraz karışık gözüküyor.
- “nem_sensoru” değişkeni nerde olması gerekiyor?
- “yuzdelikBul(int baslangic, int bitiş, int deger)” kısmının (1024,0,0,100) şeklinde yazılması kodda ne gibi değişiklikler yapmamı gerektirir?
Önerilerine göre tekrardan düzenleyeceğim. Teşekkürler. (Bu arada daha hızlı iletişim kurmak amacıyla telefon veya mailini verebilirsen çok memnun olurum. )
void loop(){
ArduinoCloud.update();
Serial.print("Requesting temperatures...");
sensors.requestTemperatures(); // Send the command to get temperatures
Serial.println("DONE");
Serial.print("Celsius temperature: ");
//We can connect more than one IC on the same data wire. 0 refers to the first IC on the wire
Serial.print(sensors.getTempCByIndex(0));
Serial.print(" - Fahrenheit temperature: ");
Serial.println(sensors.getTempFByIndex(0));
sicaklik_sensor=sensors.getTempCByIndex(0);
//int tempC=sensors.getTempCByIndex(0);
// int tempF=sensors.getTempFByIndex(0);
delay(1000);
Serial.println("");
nem_sensoru = analogRead(prob);
float yuzdelikBul(int baslangic, int bitis, int deger) {
bool yon = baslangic > bitis;
if ( !yon ) {
int geciciSayi = baslangic;
baslangic = bitis;
bitis = geciciSayi;
}
float sonuc = (100 * (deger - baslangic)) / (bitis - baslangic);
return yon ? sonuc : 100 - sonuc;
}
//Serial.print("nem seviyesi");
//Serial.println(nem_sensoru);
if (nem_sensoru <= 900||role==1)
{
digitalWrite(0, HIGH);
}
else
{
digitalWrite(0, LOW);
}
}
yuzdelik bul fonksiyonunu loop içerisinde değil. En dışta tanımlaman gerekiyordu.
yuzdelikBul(1024,0,nem_sensoru);
void setup() {
Serial.begin(9600);
}
void loop() {
float z, t;
z=1000; // 0-1023 değeri arasındaki değer z olarak atandı. ben deneme amaçlı z
//değerini 1000 olarak yazdım. sen 0-1023 arasındaki değerleri verebilirsin
t=100*(1023-z)/1023; // 100 ile 0 arasındaki değer t olarak tanımlandı
Serial.println(t);
}
komut satırı böyle. bunu dene çalıştığını göreceksin