На днях приобрел Freeduino 2009 - полный аналог Arduino Duemilanove.
Дома нашел плату с 7 сегментными индикаторами и цифровой датчик температуры DS1820.
Сначала попробовал по отдельности индикатор и датчик, все работает, потом решил объединить 2 задачи и выводить значение температуры на индикатор.
Написал следующий код:
- Код: Выделить всё • Развернуть
#include <OneWire.h>
#include <OneWireTempSensor.h>
#include <MsTimer2.h>
OneWireTempSensor sensors(12); // the OneWireTempSensor object
int numdevs; // number of devices
int pin1 = 6;
int pin2 = 5; // --6--
int pin3 = 8; // 5 | | 7
int pin4 = 4; // |--4--|
int pin5 = 2; // 1 | | 3
int pin6 = 7; // --2--
int pin7 = 3;
int gnd1 = 11; // gnd1 is display 1's gnd
int gnd2 = 10; // gnd2 is display 2's gnd
int timer1 = 100; // A timer, to run the for loop 100 times, which turns out as 1 second.
int var1 = 0;
int var2 = 0;
void setup(){
numdevs = sensors.getDevices(); // this searches for all DS1820 devices on the OneWire bus
pinMode(pin1, OUTPUT);
pinMode(pin2, OUTPUT);
pinMode(pin3, OUTPUT);
pinMode(pin4, OUTPUT); //The following sets up all of the pins for use.
pinMode(pin5, OUTPUT);
pinMode(pin6, OUTPUT);
pinMode(pin7, OUTPUT);
pinMode(gnd1, OUTPUT);
pinMode(gnd2, OUTPUT);
ds1820();
MsTimer2::set(3000, ds1820); // 3000ms период
MsTimer2::start(); //включить таймер
}
void ds1820(){
int currdev;
float real_temp;
int temp;
// loop through all the DS1820 temp sensors on the bus
for (currdev = 0; currdev < numdevs; ++currdev) {
/* get the temperature */
real_temp = sensors.getTempC(currdev);
temp = (int) real_temp;
var2 = temp / 10;
var1 = temp - pow((temp/10), 1)*10;
}
}
void loop() {
switch (var1) {
case 0:
for (int i=0; i<timer1; i++){
digitalWrite(pin1, B1);
digitalWrite(pin2, B1);
digitalWrite(pin3, B1);
digitalWrite(pin4, B0);
digitalWrite(pin5, B1);
digitalWrite(pin6, B1);
digitalWrite(pin7, B1);
digitalWrite(gnd1, B1);
digitalWrite(gnd2, B0);
}
break;
case 1:
for (int i=0; i<timer1; i++){
digitalWrite(pin1, B0);
digitalWrite(pin2, B0);
digitalWrite(pin3, B1);
digitalWrite(pin4, B0);
digitalWrite(pin5, B0);
digitalWrite(pin6, B0);
digitalWrite(pin7, B1);
digitalWrite(gnd1, B1);
digitalWrite(gnd2, B0);
}
break;
case 2:
for (int i=0; i<timer1; i++){
digitalWrite(pin1, B1);
digitalWrite(pin2, B1);
digitalWrite(pin3, B0);
digitalWrite(pin4, B1);
digitalWrite(pin5, B0);
digitalWrite(pin6, B1);
digitalWrite(pin7, B1);
digitalWrite(gnd1, B1);
digitalWrite(gnd2, B0);
}
break;
case 3:
for (int i=0; i<timer1; i++){
digitalWrite(pin1, B0);
digitalWrite(pin2, B1);
digitalWrite(pin3, B1);
digitalWrite(pin4, B1);
digitalWrite(pin5, B0);
digitalWrite(pin6, B1);
digitalWrite(pin7, B1);
digitalWrite(gnd1, B1);
digitalWrite(gnd2, B0);
}
break;
case 4:
for (int i=0; i<timer1; i++){
digitalWrite(pin1, B0);
digitalWrite(pin2, B0);
digitalWrite(pin3, B1);
digitalWrite(pin4, B1);
digitalWrite(pin5, B1);
digitalWrite(pin6, B0);
digitalWrite(pin7, B1);
digitalWrite(gnd1, B1);
digitalWrite(gnd2, B0);
}
break;
case 5:
for (int i=0; i<timer1; i++){
digitalWrite(pin1, B0);
digitalWrite(pin2, B1);
digitalWrite(pin3, B1);
digitalWrite(pin4, B1);
digitalWrite(pin5, B1);
digitalWrite(pin6, B1);
digitalWrite(pin7, B0);
digitalWrite(gnd1, B1);
digitalWrite(gnd2, B0);
}
break;
case 6:
for (int i=0; i<timer1; i++){
digitalWrite(pin1, B1);
digitalWrite(pin2, B1);
digitalWrite(pin3, B1);
digitalWrite(pin4, B1);
digitalWrite(pin5, B1);
digitalWrite(pin6, B1);
digitalWrite(pin7, B0);
digitalWrite(gnd1, B1);
digitalWrite(gnd2, B0);
}
break;
case 7:
for (int i=0; i<timer1; i++){
digitalWrite(pin1, B0);
digitalWrite(pin2, B0);
digitalWrite(pin3, B1);
digitalWrite(pin4, B0);
digitalWrite(pin5, B0);
digitalWrite(pin6, B1);
digitalWrite(pin7, B1);
digitalWrite(gnd1, B1);
digitalWrite(gnd2, B0);
}
break;
case 8:
for (int i=0; i<timer1; i++){
digitalWrite(pin1, B1);
digitalWrite(pin2, B1);
digitalWrite(pin3, B1);
digitalWrite(pin4, B1);
digitalWrite(pin5, B1);
digitalWrite(pin6, B1);
digitalWrite(pin7, B1);
digitalWrite(gnd1, B1);
digitalWrite(gnd2, B0);
}
break;
case 9:
for (int i=0; i<timer1; i++){
digitalWrite(pin1, B0);
digitalWrite(pin2, B0);
digitalWrite(pin3, B1);
digitalWrite(pin4, B1);
digitalWrite(pin5, B1);
digitalWrite(pin6, B1);
digitalWrite(pin7, B1);
digitalWrite(gnd1, B1);
digitalWrite(gnd2, B0);
}
break;
}
switch (var2) {
case 0:
for (int i=0; i<timer1; i++){
digitalWrite(pin1, B1);
digitalWrite(pin2, B1);
digitalWrite(pin3, B1);
digitalWrite(pin4, B0);
digitalWrite(pin5, B1);
digitalWrite(pin6, B1);
digitalWrite(pin7, B1);
digitalWrite(gnd1, B0);
digitalWrite(gnd2, B1);
}
break;
case 1:
for (int i=0; i<timer1; i++){
digitalWrite(pin1, B0);
digitalWrite(pin2, B0);
digitalWrite(pin3, B1);
digitalWrite(pin4, B0);
digitalWrite(pin5, B0);
digitalWrite(pin6, B0);
digitalWrite(pin7, B1);
digitalWrite(gnd1, B0);
digitalWrite(gnd2, B1);
}
break;
case 2:
for (int i=0; i<timer1; i++){
digitalWrite(pin1, B1);
digitalWrite(pin2, B1);
digitalWrite(pin3, B0);
digitalWrite(pin4, B1);
digitalWrite(pin5, B0);
digitalWrite(pin6, B1);
digitalWrite(pin7, B1);
digitalWrite(gnd1, B0);
digitalWrite(gnd2, B1);
}
break;
case 3:
for (int i=0; i<timer1; i++){
digitalWrite(pin1, B0);
digitalWrite(pin2, B1);
digitalWrite(pin3, B1);
digitalWrite(pin4, B1);
digitalWrite(pin5, B0);
digitalWrite(pin6, B1);
digitalWrite(pin7, B1);
digitalWrite(gnd1, B0);
digitalWrite(gnd2, B1);
}
break;
case 4:
for (int i=0; i<timer1; i++){
digitalWrite(pin1, B0);
digitalWrite(pin2, B0);
digitalWrite(pin3, B1);
digitalWrite(pin4, B1);
digitalWrite(pin5, B1);
digitalWrite(pin6, B0);
digitalWrite(pin7, B1);
digitalWrite(gnd1, B0);
digitalWrite(gnd2, B1);
}
break;
case 5:
for (int i=0; i<timer1; i++){
digitalWrite(pin1, B0);
digitalWrite(pin2, B1);
digitalWrite(pin3, B1);
digitalWrite(pin4, B1);
digitalWrite(pin5, B1);
digitalWrite(pin6, B1);
digitalWrite(pin7, B0);
digitalWrite(gnd1, B0);
digitalWrite(gnd2, B1);
}
break;
case 6:
for (int i=0; i<timer1; i++){
digitalWrite(pin1, B1);
digitalWrite(pin2, B1);
digitalWrite(pin3, B1);
digitalWrite(pin4, B1);
digitalWrite(pin5, B1);
digitalWrite(pin6, B1);
digitalWrite(pin7, B0);
digitalWrite(gnd1, B0);
digitalWrite(gnd2, B1);
}
break;
case 7:
for (int i=0; i<timer1; i++){
digitalWrite(pin1, B0);
digitalWrite(pin2, B0);
digitalWrite(pin3, B1);
digitalWrite(pin4, B0);
digitalWrite(pin5, B0);
digitalWrite(pin6, B1);
digitalWrite(pin7, B1);
digitalWrite(gnd1, B0);
digitalWrite(gnd2, B1);
}
break;
case 8:
for (int i=0; i<timer1; i++){
digitalWrite(pin1, B1);
digitalWrite(pin2, B1);
digitalWrite(pin3, B1);
digitalWrite(pin4, B1);
digitalWrite(pin5, B1);
digitalWrite(pin6, B1);
digitalWrite(pin7, B1);
digitalWrite(gnd1, B0);
digitalWrite(gnd2, B1);
}
break;
case 9:
for (int i=0; i<timer1; i++){
digitalWrite(pin1, B0);
digitalWrite(pin2, B0);
digitalWrite(pin3, B1);
digitalWrite(pin4, B1);
digitalWrite(pin5, B1);
digitalWrite(pin6, B1);
digitalWrite(pin7, B1);
digitalWrite(gnd1, B0);
digitalWrite(gnd2, B1);
}
break;
}
}
Все бы хорошо, но при срабатывании события таймера, либо первая, либо вторая цифра на индикаторе пропадает на время выполнения процедуры ds1820. Чем реже сделать период таймера, тем это будет менее заметно. Хочется найти решение этой проблемы. Подскажите, пожалуйста, может я чего неправильно делаю.
Записал видео того мерцания, как выгрузится, так выложу сюда.