#include <Arduino.h>
#define LAMP 23 // Укажите ваши пины
#define SH 22
#define ICG 21
#define MCLK 19
#define MIN_SIGNAL 10
uint16_t buffer[800];
uint16_t avg = 0;
char cmdBuffer[16];
int cmdIndex;
int exposureTime = 20;
void setup() {
// Инициализация пинов
pinMode(LAMP, OUTPUT);
pinMode(SH, OUTPUT);
pinMode(ICG, OUTPUT);
pinMode(MCLK, OUTPUT);
digitalWrite(ICG, HIGH); // Установить ICG в высокий уровень
// Включение последовательного порта
Serial.begin(115200);
}
void readCCD(void) {
int x;
uint16_t result;
digitalWrite(ICG, LOW);
delayMicroseconds(12);
digitalWrite(SH, HIGH);
delayMicroseconds(5);
digitalWrite(SH, LOW);
delayMicroseconds(15);
digitalWrite(ICG, HIGH);
delayMicroseconds(1);
for (x = 0; x < 800; x++) {
digitalWrite(SH, HIGH);
if (x == 0) {
result = (uint16_t)(1023 - analogRead(34)); // Используйте ваш пин для аналогового ввода
avg = (result > MIN_SIGNAL) ? (result - MIN_SIGNAL) : result;
} else {
result = (uint16_t)(1023 - analogRead(34)); // Используйте ваш пин для аналогового ввода
}
digitalWrite(SH, LOW);
buffer[x] = (result < avg) ? 0 : (result - avg);
delayMicroseconds(20);
}
}
void sendData(void) {
for (int x = 0; x < 800; ++x) {
Serial.println(buffer[x]);
}
}
void loop() {
while (Serial.available()) {
cmdBuffer[cmdIndex++] = Serial.read();
}
if (cmdBuffer[0] == 'r') {
sendData();
} else if (cmdBuffer[0] == 'l') {
digitalWrite(LAMP, LOW);
} else if (cmdBuffer[0] == 'L') {
digitalWrite(LAMP, HIGH);
} else if (cmdBuffer[0] == 'e') {
exposureTime = atoi((char *)&cmdBuffer[1]);
if (exposureTime > 1000) exposureTime = 1000;
else if (exposureTime < 0) exposureTime = 0;
Serial.println(exposureTime);
}
memset(cmdBuffer, 0, sizeof(cmdBuffer));
cmdIndex = 0;
readCCD();
delay(exposureTime);
}