Спектрофотометр на ардуино
- Войдите на сайт для отправки комментариев
Пт, 22/07/2016 - 10:52
Доброго времени суток! Уже 4 дня мучаюсь((
На Ардуино стоит 2 фототранзистора и 2 светодиода. Нужно, чтобы включался один светодиод и его свечение попадало на фототранзисторы и записывалось в переменную, далее светодиод выключался. Затем включается другой светодиод и значение напряжения на фототранзисторе записывается в следующую переменную, после производятся математические действия со значениями переменных.
Это для построения спектров веществ от проходящего сквозь них света.
/*
* Robotics with the BOE Shield - PhototransistorVoltage
* Display voltage of phototransistor circuit output connected to A3 in
* the serial monitor.
*/
int ledPin1 = 9; // номер пина со светодиодом
int ledState1 = LOW; // состояние светодиода
// последний момент времени, когда состояние светодиода изменялось
unsigned long previousMillis1 = 0;
long OnTime1 = 1000; // длительность свечения светодиода (в миллисекундах)
long OffTime1 = 1000; // светодиод не горит (в миллисекундах)
int ledPin2 = 8; // номер пина со светодиодом
int ledState2 = HIGH; // состояние светодиода
// последний момент времени, когда состояние светодиода изменялось
unsigned long previousMillis2 = 0;
long OnTime2 = 1000; // длительность свечения светодиода (в миллисекундах)
long OffTime2 = 1000; // светодиод не горит (в миллисекундах)
int perv;
int vtor;
void setup() // Built-in initialization block
{
Serial.begin(9600); // Set data rate to 9600 bps
}
void loop() // Main loop auto-repeats
{
// выясняем не настал ли момент сменить состояние светодиода
unsigned long currentMillis = millis(); // текущее время в миллисекундах
// конечный автомат для 1-го светодиода__________________________________________________________________
if((ledState1 == HIGH) && (currentMillis - previousMillis1 >= OnTime1))
{
ledState1 = LOW; // выключаем
previousMillis1 = currentMillis; // запоминаем момент времени
digitalWrite(ledPin1, ledState1); // реализуем новое состояние
Serial.print("1vkluhen ");
perv= analogRead(volts(A1))* 5.0 / 1024.0;
}
else if ((ledState1 == LOW) && (currentMillis - previousMillis1 >= OffTime1))
{
ledState1 = HIGH; // выключаем
previousMillis1 = currentMillis ; // запоминаем момент времени
digitalWrite(ledPin1, ledState1); // реализуем новое состояние
Serial.print("1vikluhen ");
}
// конечный автомат для 2-го светодиода_____________________________________________________________________
if((ledState2 == HIGH) && (currentMillis - previousMillis2 >= OnTime2))
{
ledState2 = LOW; // выключаем
previousMillis2 = currentMillis; // запоминаем момент времени
digitalWrite(ledPin2, ledState2); // реализуем новое состояние
Serial.print("2vkluhen ");
vtor=analogRead(volts(A2))* 5.0 / 1024.0;
}
else if ((ledState2 == LOW) && (currentMillis - previousMillis2 >= OffTime2))
{
ledState2 = HIGH; // выключаем
previousMillis2 = currentMillis ; // запоминаем момент времени
digitalWrite(ledPin2, ledState2); // реализуем новое состояние
Serial.print("2vikluhen ");
}
//________________________________________________________________________________________
Serial.print("A3 = "); // Display "A3 = "
Serial.print (perv); // Display measured A3 volts
Serial.println(" volts"); // Display " volts" & newline
Serial.print ( vtor);
Serial.println(" volts");
delay(1000); // Delay for 1 second
}
float volts(int adPin) // Measures volts at adPin
{ // Returns floating point voltage
return float(analogRead(adPin)) * 5.0 / 1024.0;
}
/*
* Robotics with the BOE Shield - PhototransistorVoltage
* Display voltage of phototransistor circuit output connected to A3 in
* the serial monitor.
*/
void setup() // Built-in initialization block
{
Serial.begin(9600); // Set data rate to 9600 bps
}
void loop() // Main loop auto-repeats
{
Serial.print("A1 = "); // Display "A3 = "
Serial.print(volts(A1)); // Display measured A3 volts
Serial.println(" volts"); // Display " volts" & newline
Serial.print("A2 = "); // Display "A3 = "
Serial.print(volts(A2)); // Display measured A3 volts
Serial.println(" volts");
delay(1000); // Delay for 1 second
}
float volts(int adPin) // Measures volts at adPin
{ // Returns floating point voltage
return float(analogRead(adPin)) * 5.0 / 1024.0;
}
Вы забыли написать, над чем конкретно мучаетесь.
1. Строки 40,58 я бы поменял на perv= volts(A1); и vtor=volts(A2);
2. Если perv и vtor объявлены как int, то зачем функция volts() возвращает float ?
Не записывалось в переменную значение напряжения, а нужно среднее арифметическое (perv+vtor)/2 в вольтах.
Благодарю, попробовал, кстати, флоат можно, не обязательно целочисленное.
Еще поменял вместо int в 19 20 строчке на float
ЗАРАБОТАЛО!!!)))
Цитата: Это для построения спектров веществ от проходящего сквозь них света.
Самое смешное в том , точность прибора будет + - пара сапог.
Анализатор спектра делается на дифракционной решетке. Можно взять из CD диска.
http://www.youtube.com/watch?v=hCU_beywf7o