#include <EEPROM.h>
#include <LiquidCrystal.h>
#include "rotary.h"
#include <SPI.h>
#include <SD.h>
#include <avr/wdt.h>
File root;
const int butonArtir = 38; //UP
const int butonAzalt = 39; //DWN
const int butonSet = 40; //SET
const int butonCikis = 41; //QT
uint8_t parcauz = 50; //int yerine kullanmak mantıklı - değer almıyor daha sorunsuz
int adres = 30; //dahili EEPROM adresi 4kb bellek var
uint8_t parca_deger;
const int ornekSayisi=20; //sensörden kaç değerde bir ortalama alınacak
String birim=" mm";
int counter=0;
int LDR_Pin = A0; //analog pin 0
const int chipSelect = 53; //microSD Card
int enc_adres = 32; //dahili EEPROM adresi 4kb bellek var
uint8_t donusadimi=100;
uint8_t adim_deger;
Rotary r = Rotary(2, 3); //Rotary Encoder Incr. XCC-1406PA01K -100 pulse
//Rotary r = Rotary(48, 49); //A,B Ardukit
const int rs = 36, en = 37, d4 = 26, d5 = 27, d6 = 28, d7 = 29;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
pinMode(butonArtir, INPUT);
pinMode(butonAzalt, INPUT);
pinMode(butonSet, INPUT);
pinMode(butonCikis, INPUT);
parca_deger = EEPROM.read(adres);
parcauz = parca_deger;
adim_deger = EEPROM.read(enc_adres);
donusadimi = adim_deger;
pinMode(31, OUTPUT);//BACKLIGHT
pinMode(35, OUTPUT);//RW
digitalWrite(31, HIGH);
digitalWrite(35, LOW);
lcd.begin(16, 2);
lcd.print("1-OLCME 2-KALiB.");
lcd.setCursor(0,1);
lcd.print("3-DEG.O.4-SDCARD");
Serial.flush();
Serial.begin(9600);
//while(!Serial){;}
Serial.println("Sensör Test");
}
void loop(){
if (digitalRead(butonArtir)==HIGH){
sdKartKur();
olcme();
delay(250);
}
if (digitalRead(butonAzalt)==HIGH){
kalibrasyon();
}
if (digitalRead(butonSet)==HIGH){
lcd.begin(16, 2);
lcd.clear();
lcd.print("DEGER OKUMA ");
lcd.setCursor(0,1);
lcd.print("Parca Uz: ");
parca_deger = EEPROM.read(adres);
parcauz = parca_deger;
lcd.print(parcauz);
degerOkuma();
delay(50);
}
if (digitalRead(butonCikis)==HIGH){
kartOku();
}
}
void kalibrasyon(){
lcd.clear();
lcd.print("1-Parca 4-Quit");
//lcd.setCursor(0,1);
//lcd.print("3-Encoder 4-Quit");
lcd.setCursor(0,1);
lcd.print("2-Encoder");
delay(500);
while(1){
/*
if (digitalRead(butonArtir)==HIGH){
sensorKalibrasyon();
}*/
if (digitalRead(butonArtir)==HIGH){
parcaKalibrasyon();
}
if (digitalRead(butonAzalt)==HIGH){
encKalibrasyon();
}
if (digitalRead(butonCikis) == HIGH) {Serial.println("Kalibrasyon Çikis");software_Reset();}
}
}
void parcaKalibrasyon() {
lcd.clear();
lcd.print("1-UP 2-DWN 3-SET");
lcd.setCursor(0,1);
lcd.print("4-ANA MENU");
delay(200);
while (1){
if (digitalRead(butonArtir) == HIGH) {parcauz++; Serial.println(parcauz);}
if (digitalRead(butonAzalt) == HIGH) {parcauz--; Serial.println(parcauz);}
if (digitalRead(butonSet) == HIGH) {Serial.println("Set:"+String(parcauz,DEC));EEPROM.write(adres, parcauz);}
if (digitalRead(butonCikis) == HIGH) {parca_deger = EEPROM.read(adres);Serial.println("Oku:"+String(parca_deger,DEC));kalibrasyon();}
if (parcauz<100){lcd.setCursor(15,1);lcd.print(" ");}
if (parcauz<10){lcd.setCursor(14,1);lcd.print(" ");}
lcd.setCursor(13,1);
lcd.print(parcauz);
if (parcauz>255) parcauz=255;
if (parcauz<0) parcauz=0;
delay(100);
}
}
void encKalibrasyon() {
lcd.clear();
lcd.print("1-UP 2-DWN 3-SET");
lcd.setCursor(0,1);
lcd.print("4-ANA MENU");
delay(200);
while (1){
if (digitalRead(butonArtir) == HIGH) {donusadimi++; Serial.println(donusadimi);}
if (digitalRead(butonAzalt) == HIGH) {donusadimi--; Serial.println(donusadimi);}
if (digitalRead(butonSet) == HIGH) {Serial.println("Set:"+String(donusadimi,DEC));EEPROM.write(enc_adres, donusadimi);}
if (digitalRead(butonCikis) == HIGH) {adim_deger = EEPROM.read(enc_adres);Serial.println("Oku:"+String(adim_deger,DEC));kalibrasyon();}
if (donusadimi<100){lcd.setCursor(15,1);lcd.print(" ");}
if (donusadimi<10){lcd.setCursor(14,1);lcd.print(" ");}
lcd.setCursor(13,1);
lcd.print(donusadimi);
if (donusadimi>255) donusadimi=255;
if (donusadimi<0) donusadimi=0;
delay(100);
}
}
void sdKartKur() {
lcd.begin(16, 2);
lcd.clear();
lcd.print("SENSOR OLCME 4-Q");
lcd.setCursor(0,1);
lcd.print("Parca Uz: ");
lcd.print(EEPROM.read(adres));
//---------------------------------------------------------
Serial.flush();
//while (!Serial) {; // wait for serial port to connect. Needed for native USB port only }
Serial.print("Initializing SD card...");
// see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
// don't do anything more:
return;
}
Serial.println("card initialized.");
}
void olcme() {
while(1){
/*
unsigned char result = r.process();
float h;
float dereceSensor = sensorOku(ornekSayisi);
float radianSensor = dereceSensor*M_PI/180;
h = sin(radianSensor)*parcauz*10;
String egim ;
if (result) {
if (result != DIR_CW){
//Serial.println("Right+,"+String(sensorOku(), DEC));
counter++;
if ((counter%5)==0) return;
dosyaYaz("f,",h);
egim = "ileri";
} else {
//Serial.println("Left-,"+String(sensorOku(), DEC));
counter++;
if ((counter%5)==0) return;
dosyaYaz("r,",h);
egim = "geri";
}
lcd.clear();
lcd.print(egim);
lcd.setCursor(8,0);
lcd.print(counter);
lcd.setCursor(0, 1);
lcd.print(dereceSensor,1);lcd.print(char(223));
lcd.setCursor(8,1);
lcd.print(h,1);lcd.print(birim);
}*/
encoderTur(donusadimi);
if (digitalRead(butonCikis) == HIGH) {Serial.println("Ölçüm Çikis");software_Reset();}
}
}
void degerOkuma() {
while(1){
unsigned char result = r.process();
float h;
String egim ;
if (result) {
float dereceSensor = sensorOku(ornekSayisi);
float radianSensor = dereceSensor*M_PI/180;
h = sin(radianSensor)*parcauz*10;
if (result == DIR_CW){
egim = "ileri";
counter++;
} else {
egim = "geri";
counter++;
}
lcd.clear();
lcd.print(egim);
lcd.setCursor(8,0);
lcd.print(h,1);lcd.print(birim);
lcd.setCursor(0, 1);
lcd.print(dereceSensor,2);lcd.print(char(223));
lcd.setCursor(8,1);lcd.print("4-CIKIS");
}
if (digitalRead(butonCikis) == HIGH) {Serial.println("Değer Okuma Çikis");software_Reset();}
}
}
void dosyaYaz(String yon, float veri) {
String dataString = yon+String(veri,1); //core da düzeltme “WString.h” and “WString.cpp” //https://www.timewasters-place.com/arduino-string-and-float/
File dataFile = SD.open("datalog.txt", FILE_WRITE);
// if the file is available, write to it:
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
Serial.println(" " + dataString);
}
else {
Serial.println("dosya açma hatası: datalog.txt");
}
// delay(100);
}
float sensorOku(int ornekSayisi){
int toplam=0;
float okunan=0;
//delay(75);
for(int i=1; i<=ornekSayisi;i++){
int LDRReading = analogRead(LDR_Pin);
toplam+=LDRReading;
}
okunan = toplam/ornekSayisi;
int kalibrasyon = 645;
//okunan = ceil(aradeger/adet);
if (okunan>(kalibrasyon-5) and okunan<(kalibrasyon+5)) kalibrasyon=okunan;
if (okunan>=kalibrasyon){
float aci = (kalibrasyon-okunan)/(1023.0-kalibrasyon)*10;
Serial.print(aci);
Serial.println(" :"+String(okunan,DEC));
return aci;
}else {
float aci = (kalibrasyon-okunan)/(kalibrasyon-3.0)*10;
Serial.print(aci);
Serial.println(" :"+String(okunan,DEC));
return aci;
}
//float aci = (okunan-202)/821.0*90; //202-1023
///return aci;
}
void encoderTur(int adim){
unsigned char result = r.process();
static int counter;
static int counterR;
static int counterL;
static int tur;
bool yaz=false;
String egim ;
if (result) {
if (result == DIR_CW) {counter++;counterR++;counterL--;} else {counter++;counterL++;counterR--;}
counterR = (counterR<0) ? 0: counterR;
counterL = (counterL<0) ? 0: counterL;
if (counterR == adim){
tur++;
egim = "ileri";
Serial.print("ileri:");
Serial.print(tur);
counterR = 0;
counterL = 0;
//return "R";
yaz=true;
}
if (counterL == adim){
tur++;
egim = "geri";
Serial.print("geri:");
Serial.print(tur);
counterL = 0;
counterR = 0;
//return "L";
yaz=true;
}
if (yaz){
float h;
float dereceSensor = sensorOku(ornekSayisi);
float radianSensor = dereceSensor*M_PI/180;
h = sin(radianSensor)*parcauz*10;
if (egim=="ileri") dosyaYaz("f,",h); else if(egim=="geri") dosyaYaz("r,",h);
lcd.clear();
lcd.print(egim);
lcd.setCursor(8,0);
lcd.print(counter);
lcd.setCursor(0, 1);
lcd.print(dereceSensor,1);lcd.print(char(223));
lcd.setCursor(8,1);
lcd.print(h,1);lcd.print(birim);
yaz=false;
}
}
}
void sensorKalibrasyon(){
lcd.clear();
lcd.print("Gor.icin Enk.Cev");
lcd.setCursor(0, 1);
lcd.print("Kalib. but. bas");
while(1){
unsigned char result = r.process();
float h;
float dereceSensor = sensorOku(ornekSayisi);
float radianSensor = dereceSensor*M_PI/180;
h = sin(radianSensor)*parcauz*10;
if (result) {
lcd.clear();
//lcd.setCursor(8,0);
lcd.print(h,1);lcd.print(birim);
lcd.setCursor(0, 1);
lcd.print(dereceSensor,1);lcd.print(char(223));
lcd.setCursor(8,1);lcd.print("4-CIKIS");
}
if (digitalRead(butonCikis) == HIGH) {kalibrasyon();}
}
}
void __software_Reset()
{
asm volatile (" jmp 0");
}
void software_Reset() {
wdt_disable();
wdt_enable(WDTO_30MS); //15MS
while (1) {}
}
void kartOku() {
//Serial.begin(115200);
Serial.print("Initializing SD card... ");
if (!SD.begin(chipSelect)) {
Serial.println("Card initialization failed!");
while (true);
}
Serial.println("initialization done.");
Serial.println("Files in the card:");
root = SD.open("/");
printDirectory(root, 0);
Serial.println("");
// Example of reading file from the card:
File textFile = SD.open("datalog.txt");
if (textFile) {
Serial.print("datalog.txt: ");
while (textFile.available()) {
Serial.write(textFile.read());
}
textFile.close();
} else {
Serial.println("error opening wokwi.txt!");
}
}
void printDirectory(File dir, int numTabs) {
while (true) {
File entry = dir.openNextFile();
if (! entry) {
// no more files
break;
}
for (uint8_t i = 0; i < numTabs; i++) {
Serial.print('\t');
}
Serial.print(entry.name());
if (entry.isDirectory()) {
Serial.println("/");
printDirectory(entry, numTabs + 1);
} else {
// files have sizes, directories do not
Serial.print("\t\t");
Serial.println(entry.size(), DEC);
}
entry.close();
}
}