Очень оригинальные часы. Arduino + 3 стрелочных измерительных прибора.

источник              <<<назад

Не подскажите, который час? 7 часов 46 минут 41 секунда.

Очень оригинальные часы

Вернее столько было, когда сделали фотографию. Несмотря на огромное множество всяческих модификаций часов - нельзя не заметить эту. По оригинальности она превосходит все предыдущие проекты. Простая и в то же время очень оригинальная модификация. Как же это работает? Наверное, принцип работы можно объяснить одним словом - Arduino. Для тех, кто не знаком - это открытая платформа для разработки ваших собственных прототипов. Adafruit Ethernet (XPort) Shield обеспечивает возможность подключить устройство к серверу времени SNTP, а Adafruit Proto Shield дает возможность создать интерфейс для аналоговых измерителей. Схема драйвера крайне проста.

Устройство содержит три драйвера для измерителей, которые подключаются к трем PWM каналам Arduino. У каждого драйвера есть два потенциометра - с помощью их можно настраивать начальное и крайнее положение стрелки. В каждом драйвере используется операционный усилитель. Сложнее - найти и изменить аналоговые измерители, в данном случае использованы Simpson D'Arsonval, со шкалой 0-5 AMP. Правда, необходимо заменить резистор. После этого меняем шкалу - фотографируем или сканируем старую и делаем новую в Photoshop'е.

Код прилагается.

--------------------------------------------------------------------
// Clock with 3 Simpson Meters
// Michael 5/12/2008
// Version .1
//

// Include Statements
#include <AFSoftSerial.h>
#include <AF_XPort.h>
#include <string.h>

// Address for SNTP server
#define IPADDR "192.43.244.18" // time.nist.gov
#define PORT 13 // sntp port

// PWM Port pins on Arduino
#define HOURSPIN 11
#define MINUTESPIN 10
#define SECONDSPIN 9

// Central Standard Time correction for UTC string
#define UTC_CST 5

// buffer for storing received strings
char linebuffer[256]; // large buffer for storing data
int iRet, iLoop;

// pins on XPORT
#define XPORT_RXPIN 2
#define XPORT_TXPIN 3
#define XPORT_RESETPIN 4
#define XPORT_DTRPIN 5
#define XPORT_CTSPIN 6
#define XPORT_RTSPIN 7

AF_XPort xport = AF_XPort(XPORT_RXPIN, XPORT_TXPIN, XPORT_RESETPIN, XPORT_DTRPIN, XPORT_RTSPIN, XPORT_CTSPIN);


// initialization values
int iHours;
int iMinutes;
int iSeconds;
char cHours[3];
char cMinutes[3];
char cSeconds[3];

// run once
void setup()
{
pinMode(HOURSPIN, OUTPUT);
pinMode(MINUTESPIN, OUTPUT);
pinMode(SECONDSPIN, OUTPUT);

Serial.begin(57600);
xport.begin(57600);

calMeter();
getTime();
}


void loop() // run over and over again
{
Serial.print(iHours);
Serial.print(":");
Serial.print(iMinutes);
Serial.print(":");
Serial.print(iSeconds);
Serial.print(" ");

analogWrite(HOURSPIN, 255 - (iHours * 20 ) - (iMinutes/3));
analogWrite(MINUTESPIN, 255 - (iMinutes * 4 ));
analogWrite(SECONDSPIN, 255 - (iSeconds * 4 ));

iSeconds = iSeconds + 1;
if (iSeconds == 60)
{
iMinutes = iMinutes + 1;
iSeconds = 0;
}
if (iMinutes == 60)
{
iHours = iHours + 1;
iMinutes = 0;
}
if (iHours == 12)
{
iHours = 0;
getTime();
}
delay(1000); // wait 1 second?
}

void calMeter(void)
{
Serial.println("Set ZERO ");
analogWrite(HOURSPIN, 255);
analogWrite(MINUTESPIN, 255);
analogWrite(SECONDSPIN, 255);
delay(10000);
Serial.println("Set FULL SCALE ");
analogWrite(HOURSPIN, 255 - (12 * 20));
analogWrite(MINUTESPIN, 255 - (60 * 4));
analogWrite(SECONDSPIN, 255 - (60 * 4));
delay(10000);
Serial.println("Set HALF SCALE ");
analogWrite(HOURSPIN, (255 - (12 * 20)/2));
analogWrite(MINUTESPIN, (255 - (60 * 4)/2));
analogWrite(SECONDSPIN, (255 - (60 * 4)/2));
delay(10000);

}
void getTime(void)
{
do
{
iRet = xport.reset();
Serial.print("At xport_reset Ret: ");
Serial.println(iRet, HEX);
} while (iRet != ERROR_NONE);

do
{
iRet = xport.connect(IPADDR, PORT);
Serial.print("At xport_connect Ret: ");
Serial.println(iRet, HEX);
} while (iRet != ERROR_NONE);
for( iLoop = 0; iLoop < 2; iLoop++)
{
iRet = xport.readline_timeout(linebuffer, 255, 3000); // get 2 lines
Serial.print(linebuffer);
}

strncpy(cHours, linebuffer+15, 2); //hours
iHours = atoi(cHours);
iHours = iHours + 12 - UTC_CST;
if (iHours >= 24)
iHours = iHours - 24;
else if (iHours >= 12)
iHours = iHours - 12;

strncpy(cMinutes, linebuffer+18, 2); //minutes
iMinutes = atoi(cMinutes);
strncpy(cSeconds, linebuffer+21, 2); //seconds
iSeconds = atoi(cSeconds);

Serial.print("\nConverted time: ");
Serial.print(iHours);
Serial.print(":");
Serial.print(iMinutes);
Serial.print(":");
Serial.print(iSeconds);
Serial.print(" \n");

}