Ultrasonik depo sensörüne kalan zamanı gösterme?

papuc111

Yeni üye
Katılım
25 Nis 2019
Mesajlar
17
Tepkime puanı
3
Puanları
3
Konum
Arduino Acemisi
Selamlar,
Araniza yeni katildim. Forumda yazan konulari gezindim ancak benim sorunuma örnek olacak bir konuya rastlayamadim.
Eger gözümden kacmissa uyarir ve linki verirseniz hemen siler ve o o linke yönelirim.

Benim sorunum biraz ileri programlama gerektiriyor, en azindan benim icin öyle.

Arduino Uno'ya bagli HC-SR04 sensorundan depodaki doluluk oranini görüp ilk %25 Harcama oldugu halde yeni yükleme yapilmadiysa kalan %75 in ne kadar zaman icinde harcanacagini saniye olarak serial Port'a yazan bir program olusturmayi basardim.
Benim ilk yapmak istedigim ilk önce kalan zamani dakika olarak göstermekti o da kolay yani sonuc 60 ile bölününce dakika yazabiliyorum.

Su anda gelistirmek istedigim sey ise bir "saat modülü" ekleyerek hesabin yapildigi zamani girmek ve o zaman itibari ile kac dakika kaldigini yazdirmak. Yani örn.15 Dakika önce yazildigini o andaki saat bilgisi olursa anlayabilirim...

Aslinda daha da iyi olani hesap yapildigi andan itibaren zamani geriye sayan bir gösterge en iyisi olurdu.

Yani ekranda: 60 Dakika kaldi......
59 Dakika kaldi.....

veya 1 Saat 12 Dakika Kaldi ....
1 Saat 11 Dakika Kaldi ..... gibi...

Daha sonra bunu I2C LCD Displayde göstermeyi düsünüyorum.

Bu konuda öneri ve yol gösteren örnekleriniz var ise cok sevinirim.

Zamaninizi harcayip okudugunuz icin tesekkür ederim.

Selamlar

papuc111



PASTEBIN Linki



// ---------------------------------------------------------------------------
// Example NewPing library sketch that does a ping about 20 times per second.
// ---------------------------------------------------------------------------

#include <NewPing.h>

#define TRIGGER_PIN 7 // Trigger Ayagi
#define ECHO_PIN 6 // Echo Ayagi
#define MAX_DISTANCE 150 // En uzun ayarlanacak mesafe, 400-500 cm ya kadar ayarlanabilir
#define MIN_DISTANCE 10 // En yakin mesafe
// Pinzuweisung der LED´s
byte led20 = 2; // LED 20%
byte led50 = 3; // LED 50%
byte led75 = 4; // LED 75%
byte led100 = 5; // LED 100%

// Doluluk orani led göstergesi
const int levelmin = 20;
const int levelhalb = 50;
const int level75 = 75;
const int levelvoll = 100;
int timer1 ;
int timer2 ;


bool flag; // Yardimci ezberleyici
int level; // Doluluk Seviyesi
uint32_t startzeit, messzeit, Restzeit;
uint32_t delayvoll; // Tam dolu durumda geciktirme

// Instanz New Ping
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.

void setup() {
Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
pinMode(led20, OUTPUT);
pinMode(led50, OUTPUT);
pinMode(led75, OUTPUT);
pinMode(led100, OUTPUT);

}

void loop() {
delay(50); // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
// auslesen und scalieren auf 0-100%
level = map(sonar.ping_cm(), MIN_DISTANCE, MAX_DISTANCE, 100, 0);

if (level > levelmin)digitalWrite(led20, HIGH);
else digitalWrite(led20, LOW);

if (level > levelhalb)digitalWrite(led50, HIGH);
else digitalWrite(led50, LOW);

if (level > level75)digitalWrite(led75, HIGH);
else {
digitalWrite(led75, LOW);
if (!flag) { // einmal messen
messzeit = millis() - startzeit; // Ölcme zamani
flag = true; // es ist gemessen
}
}

if (level >= levelvoll) {
if (millis() - delayvoll > 1000UL) { // Doluluk belirleme
digitalWrite(led100, HIGH);
startzeit = millis(); // Ölcme zamani baslangic belirleme
flag = false;
messzeit = 0;

Restzeit = 0 ;
}
}
else {
digitalWrite(led100, LOW);
delayvoll = millis(); // Tam dolu olursa Zamani Resetle
}

Serial.print("Level: ");
Serial.print(level); // Send ping, get distance in cm and print result (0 = outside set distance range)
Serial.print("%");
Serial.print (" Messzeit ");// Olculen Zaman (25% Bosalana kadar gecen süreyi yaz ve ezberle)
Serial.print(messzeit);
Serial.print (" Behälter vermutlich leer in "); // Depo tahminen bosalacak süre :
Serial.print (messzeit/1000*3); Serial.println("Sekunden"); // Saniyede




// delay(1000);
}
 
Moderatör tarafında düzenlendi:

xbrknx

Üye
Katılım
16 Tem 2019
Mesajlar
78
Tepkime puanı
16
Puanları
8
Konum
istanbul
gerçek zamanla işin olmadığı için rtc modül yerine millis() ile başlama zamanını alsan


Kod:
int dakika = 60000;
unsigned long oldtime;

void setup() {

}
void loop() {
unsigned long newtime = millis();
if ((newtime - dakika > oldtime)) { Serial.println("1dakika oldu");  oldtime = newtime;  }
}
 
Üst