19.04.2024, Пятница, 23:20
26.09.2013 в 00:57
Датчик температуры, переключаемый по уровню освещённости
После подачи напряжения питания включается секундомер на макетке с Атмегой.
Когда освещённость на фоторезисторе становится ниже некоторого порога, секундомер отключается и включается Ардуино Нано с датчиком температуры, кроме того, начинает свистеть мелодию пищалка и мигать в такт ей светодиоды.
Управляет всей кухней Arduino Uno. Листинг скетча в ней:

Код

int speakerPin = 11; // выход для динамика  
int leftEye= 2; // левый светодиод  
int rightEye=13; // правый светодиод  
int VtoNano= 9; // напряжение на Нано
int Vto7Seg= 4; // напряжение на плату с Атмегой и 7Seg-секундомером
int photoPin = 0; // аналоговый вход для фоторезистора  
int val = 0; // переменная для значения считанного с аналогового входа  

// ноты мелодии  
char notes[] = "GECgabCaCg DGECabCDED EFEDGEDC CECaCag gCEDgCEDEFGECDgC "; // пробел - это пауза  
// длительность для каждой ноты и паузы  
int beats[] = { 4, 4, 4, 4, 1, 1, 1, 2, 1, 4,  
  2, 4, 4, 4, 4, 1, 1, 1, 2, 1,  
  4, 2, 1, 1, 1, 1, 2, 1, 1, 4,  
  2, 1, 2, 1, 2, 1, 1, 4, 2, 1,  
  2, 1, 2, 1, 2, 1, 2, 1, 1, 1,  
  1, 1, 2, 1, 4, 4, 4} ;  

int tempo = 100; // темп исполнения  
int length = sizeof(notes); // количество нот  

void playTone(int tone, int duration) {  
digitalWrite(leftEye,HIGH); // зажигаем оба глаза  
digitalWrite(rightEye,HIGH);  
  // проигрываем требуемую ноту с нужной частотой и длительностью  
  for (long i = 0; i < duration * 1000L; i += tone * 2) {  
  digitalWrite(speakerPin, HIGH);  
  delayMicroseconds(tone);  
  digitalWrite(speakerPin, LOW);  
  delayMicroseconds(tone);  
}  
digitalWrite(leftEye,LOW); // гасим оба глаза  
digitalWrite(rightEye,LOW);  
   
}  

void playNote(char note, int duration) {  
  // массив для наименований нот (до ре ми ... и т.д. в пределах двух октав)  
  char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C','D','E','F','G','A','B' };  
  // соответствующие нотам частоты  
  int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956, 850, 759, 716, 638, 568, 507 };  

  // выбор частоты по наименованию ноты  
  for (int i = 0; i < 15; i++) {  
  if (names[i] == note) {  
  playTone(tones[i], duration);  
  }  
}  
}  

void setup() {  
pinMode(speakerPin, OUTPUT);// цифровые выводы на динамик  
pinMode(leftEye, OUTPUT); // и оба светодиода  
pinMode(rightEye, OUTPUT); // конфигурируем как выходы  
pinMode(VtoNano, OUTPUT); // конфигурируем как выходы 5 В на Нано  
pinMode(Vto7Seg, OUTPUT); // конфигурируем как выходы 5 В на Атмегу
pinMode(photoPin, INPUT); // а с фоторезистором - как вход  
Serial.begin(9600);
}  

void loop() {  
// считываем значение с фотодатчика  
val = analogRead(photoPin);  
digitalWrite(Vto7Seg, HIGH);
Serial.println(val);
// небольшая задержка для регенерации АЦП  
delay(10);  
if (val>700) { // если значение превысило предел (стало темно) - запускаем цикл проигрывания мелодии  

  digitalWrite(VtoNano, HIGH); // подаём 5 В на Нано с температурным датчиком 
  digitalWrite(Vto7Seg, LOW); // отключаем Атмегу с секундомером
  for (int i = 0; i < length; i++) { //  
  if (notes[i] == ' ') {  
  delay(beats[i] * tempo); // пауза  
  } else {  
  playNote(notes[i], beats[i] * tempo); // либо проигрываем соответствующую ноту  
  }  
  // небольшая пауза между нотами  
  delay(tempo / 2);  
  }  
}
else
  digitalWrite(VtoNano, LOW);  // отключаем Нано
  digitalWrite(Vto7Seg, HIGH); // подаём 5 В на Атмегу с секундомером
delay(500);  
}


Листинг скетча на Ардуино Нано уже приводился здесь,
а листинг прошивки в Атмеге - здесь

Вот как это выглядит:

Количество просмотров: 1063.
dth="100%" cellspacing="0" cellpadding="0" class="commTable">
Имя *: Email:
Подписка:1 Код *: