Спектрофотометр на ардуино
- Войдите на сайт для отправки комментариев
Пт, 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