#include <SD.h>
#include <SPI.h>
#include "RTClib.h"
RTC_DS1307 rtc;
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 1); // Set the LCD I2C address
int pinYear = 12;
int pinDay = 7;
int pinMonth = 9;
int pinHour = 13;
int pinMinute = 10;
int pinBregg = 8;
int pinStart = 11;
float AngleBregg=10; //вихідне значення кута Брега
int Y;
int M;
int K;
const int dirPin = 14;
const int stepPin = 2;
const int stepsPerRevolution = 200;
int MS1 = 5;
int MS2 = 4;
int MS3 = 3;
//int pin_led = 13;
String NameFile;
File root;
#define CS_PIN 53
void setup()
{
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
//pinMode(pin_led, OUTPUT);
pinMode(MS1, OUTPUT);
pinMode(MS2, OUTPUT);
pinMode(MS3, OUTPUT); //стан виводів крокового двигуна
lcd.begin(20,4); // Initialize LCD
lcd.setCursor(3,0); // Set the cursor at the 4th column and 1st row
lcd.print("Hello!");
delay(3000);
lcd.clear();
analogReference(INTERNAL1V1); // Встановлення опорної напруги АЦП 1,1В
Serial.begin(115200);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
}
void loop () {
DateTime now = rtc.now();
lcd.setCursor(0, 0);
lcd.print(now.year(), DEC);
lcd.print('/');
lcd.print(now.month(), DEC);
lcd.print('/');
lcd.print(now.day(), DEC);
lcd.print(" ");
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
lcd.print(':');
lcd.print(now.second(), DEC);
NameFile = now.day();
NameFile = NameFile +now.month()+now.year()+ now.hour()+now.minute()+".csv";
if(digitalRead(pinBregg) == HIGH) // якщо кнопка натиснута
{ AngleBregg++; }
if(AngleBregg>40)
{ AngleBregg =10; }
if (digitalRead(pinYear) == HIGH) {
Y = now.year();
if(Y>2030) { Y = 2022 ;}
rtc.adjust(DateTime(Y+1, now.month(), now.day(), now.hour(), now.minute(), now.second()));
}
if (digitalRead(pinMonth) == HIGH) {
rtc.adjust(DateTime(now.year(), now.month()+1, now.day(), now.hour(), now.minute(), now.second()));
}
if (digitalRead(pinMonth) == HIGH) {
rtc.adjust(DateTime(now.year(), now.month()+1, now.day(), now.hour(), now.minute(), now.second()));
}
if (digitalRead(pinDay) == HIGH) {
rtc.adjust(DateTime(now.year(), now.month(), now.day()+1, now.hour(), now.minute(), now.second()));
}
if (digitalRead(pinHour) == HIGH) {
rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour()+1, now.minute(), now.second()));
}
if (digitalRead(pinMinute) == HIGH) {
rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute()+1, now.second()));
}
lcd.setCursor(0, 1);
//lcd.print('AngleBregg');
//lcd.print(voltage);
//lcd.print(' - ');
lcd.print("AngleBregg - ");
lcd.print(AngleBregg);
if (digitalRead(pinStart) == HIGH) //
{ File dataFile = SD.open(NameFile, FILE_WRITE); //створення файлу
lcd.setCursor(0, 2);
lcd.print("Start experiment");
int Xray0 = analogRead(A0); //Пошук нуля град.
float voltage = Xray0 * (1.1 / 1024.0)*1000; //Вимір інтенсивності
for (int i = 0; i < 10; i++) {
Xray0 = Xray0 + analogRead(A0); //середня інтенс. за 10 сек
delay(100);
}
Xray0 = Xray0 /10;
digitalWrite(MS1, LOW); //Установка цілого кроку
digitalWrite(MS2, LOW);
digitalWrite(MS3, LOW);
digitalWrite(dirPin, HIGH);
digitalWrite(stepPin, HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin, LOW);
int Xray1 = analogRead(A0);
float voltage1 = Xray1 * (1.1 / 1024.0)*1000;
for (int i = 0; i < 10; i++) {
Xray1 = Xray1 + analogRead(A0); //середня інтенс. за 10 сек
delay(100);
}
Xray1 = Xray1 /10;
if (Xray0 < Xray1){
K=1;
}
K=-1;
label1:
Xray0=Xray1;
digitalWrite(dirPin, HIGH);
digitalWrite(stepPin, HIGH);
delayMicroseconds(20);
digitalWrite(stepPin, LOW);
Xray1 = analogRead(A0);
voltage1 = Xray1 * (1.1 / 1024.0)*1000;
for (int i = 0; i < 10; i++) {
Xray1 = Xray1 + analogRead(A0); //середня інтенс. за 10 сек
delay(100);
}
Xray1 = Xray1 /10;
if (Xray0 < Xray1){
goto label1;
}
int K=0;
// вихід при знаходженні max
int nStep = (2*AngleBregg- 5)/0.01 - K; //Кількість кроків до ДифрMax
digitalWrite(dirPin, HIGH);
//digitalWrite(pin_led, LOW);
for (int i = 0; i < nStep ; i++) {
digitalWrite(stepPin, HIGH); //Зсув до ДифрMax
delayMicroseconds(20);
digitalWrite(stepPin, LOW);
}
int XrayFon = analogRead(A0); //Вимірювання Фону
for (int i = 0; i < 10; i++) {
XrayFon = XrayFon + analogRead(A0); //середня інтенс. за 10 сек
delay(100);
}
XrayFon = XrayFon /10;
label2:
digitalWrite(dirPin, HIGH); // Зсув на крок
digitalWrite(stepPin, HIGH);
delayMicroseconds(20);
digitalWrite(stepPin, LOW);
Xray1 = analogRead(A0);
for (int i = 0; i < 10; i++) {
Xray1 = Xray1 + analogRead(A0); //середня інтенс. за 10 сек
delay(100);
}
Xray1 = Xray1 /10;
if (Xray1 < XrayFon*2){
goto label2;
}
digitalWrite(dirPin, LOW); // Зсув на крок Реверс
digitalWrite(stepPin, HIGH);
delayMicroseconds(20);
digitalWrite(stepPin, LOW);
digitalWrite(dirPin, HIGH); // Зсув на крок
digitalWrite(stepPin, HIGH);
delayMicroseconds(20);
digitalWrite(stepPin, LOW);
digitalWrite(MS1, HIGH); // Установка 1/16 кроку
digitalWrite(MS2, HIGH);
digitalWrite(MS3, HIGH);
for (int j = 0; j<512; j++){
for (int i = 0; i < 10; i++) {
Xray1 = Xray1 + analogRead(A0); //середня інтенс. за 10 сек
delay(100);
}
Xray1 = Xray1 /10;
String dataString = j +","+Xray1;
dataFile.println(dataString);
digitalWrite(dirPin, HIGH); // Зсув на крок
digitalWrite(stepPin, HIGH);
delayMicroseconds(20);
}
dataFile.close();
}
}