
Вернее столько было, когда сделали фотографию. Несмотря на огромное множество всяческих модификаций часов - нельзя не заметить эту. По оригинальности она превосходит все предыдущие проекты. Простая и в то же время очень оригинальная модификация. Как же это работает? Наверное, принцип работы можно объяснить одним словом - 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");
}