Очередной пост из серии про Digispark.
Это ответ на частые вопросы о том, что конкретного и полезного можно сделать на Digispark.
Пусть простят меня поклонники ЛЭДтюнинга, ну не вдохновляет меня пока это направление. Поэтому предлагаю реализацию часов и термометра …
ниже смотрите видео как все это работает.
для тех кто захочет все это повторить и "подогнать" под свои условия привожу скетч…
#include <avr/io.h>
#include <util/delay.h>
#include <onewire.h>
int temp, T, t, Ltp, LT, Lt, Htp, HT, Ht;
OneWire ds(1);
byte data[12];
byte addr[8];
void setup() {
DDRB |=(1<<0);
DDRB |=(1<<2);
PORTB &=~(1<<2);
Ltp = 99;
Htp = 0;
}
void loop(){
readTemperature();
_delay_ms(750);
getTemperature();
if (temp > Htp) {Htp = temp;}
if (temp < Ltp) {Ltp = temp;}
HT = Htp/10;
if (HT==0) HT=10;
Ht = Htp%10;
if (Ht==0) Ht=10;
T = temp/10;
if (T==0) T=10;
t = temp%10;
if (t==0) t=10;
LT = Ltp/10;
if (LT==0) LT=10;
Lt = Ltp%10;
if (Lt==0) Lt=10;
writeDigit(LT);
writeDigit(Lt);
writeDigit(0);
writeDigit(0);
writeDigit(T);
writeDigit(t);
writeDigit(0);
writeDigit(0);
writeDigit(HT);
writeDigit(Ht);
_delay_ms(500);
}
void writeDigit(byte d) {
for (byte i=0; i<4; i++) {
PORTB |=(1<<2);
_delay_us(20);
digitalWrite(0, d&(1<<(3-i)));
_delay_us(10);
PORTB &=~(1<<2);
_delay_us(30); }
_delay_us(70);
}
boolean readTemperature(){
if (!ds.search(addr)) {
ds.reset_search();
return false; }
if (OneWire::crc8(addr, 7)!=addr[7]) {
return false; }
if (addr[0]!=0x10 && addr[0]!=0x28) {
return false; }
ds.reset();
ds.select(addr);
ds.write(0x44, 1);
}
boolean getTemperature(){
byte present = 0;
present = ds.reset();
ds.select(addr);
ds.write(0xBE);
for (byte i=0; i<9; i++) {
data[i] = ds.read(); }
temp = (((data[1]<<8)+data[0])/2);
return true;
}