Спектрофотометр на ардуино

sash39
Offline
Зарегистрирован: 22.07.2016

Доброго времени суток! Уже 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;
} 

 

Araris
Offline
Зарегистрирован: 09.11.2012

Вы забыли написать, над чем конкретно мучаетесь.

1. Строки 40,58 я бы поменял на perv= volts(A1); и vtor=volts(A2);

2. Если perv и vtor объявлены как int, то зачем функция volts() возвращает float ?

sash39
Offline
Зарегистрирован: 22.07.2016

Не записывалось в переменную значение напряжения, а нужно среднее арифметическое (perv+vtor)/2 в вольтах.

Благодарю, попробовал, кстати, флоат можно, не обязательно целочисленное.

Еще поменял вместо int в 19 20 строчке на float

ЗАРАБОТАЛО!!!)))

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Цитата: Это для построения спектров веществ от проходящего сквозь них света.

Самое смешное в том , точность прибора будет + - пара сапог.

Анализатор спектра делается на дифракционной решетке. Можно взять из CD диска.

http://www.youtube.com/watch?v=hCU_beywf7o