This is code to my project smart watch fan.
настройка аннулирования () {
}
включить
включить
определение ONE_WIRE_BUS 10
OneWire OneWire (ONE_WIRE_BUS);
Датчики температуры Dallast (и OneWire);
int tempPin = ONE_WIRE_BUS; // выход LM35
int fan = 11; // вывод на вентилятор
int temp;
int tempMin = 28; // температура начала вращения вентилятора
int tempMax = 35; // максимальная температура, когда вентилятор вращается на 100%
int fanSpeed;
настройка аннулирования () {
pinMode (вентилятор, ВЫХОД);
Serial.begin (9600);
sensors.begin();
pinMode (настройка температуры, ВВОД);
}
void loop () {
temp = readTemp(); // получаем температуру
if(temp < tempMin) { // если temp меньше минимума
fanSpeed = 0; // кулер не вращается
Цифровая запись (вентилятор, НИЗКИЙ УРОВЕНЬ);
}
if((temp >= tempMin) && (temp <= tempMax)) { // если temp больше минимума
fanSpeed = map(temp, tempMin, tempMax, 0, 255); // текущая скорость вентилятора
analogWrite(fan, fanSpeed); // вращаем кулер со скоростью fanSpeed
}
Серийный номер.печать ("TEMP:");
Serial.print(temp); // отображение температуры
жк-дисплей.печать ("C");
задержка (1000);
}
int readTemp() { // получить температуру и переконвертировать ее в цельсии
датчики.requestTemperatures();
temp = sensors.getTempCByIndex(0);
температура возврата * 0.48828125;
}void loop () {
}
/].
*/
/*
Ретро-часы Arduino версии v1.0 - u8g (поддерживает u8glib)
Получите последнюю версию приложения для Android host по адресу
------> https://github.com/godstale/retrowatch
------> или http://www.hardcopyworld.com
Автор: Су Ен Бэ (godstale@hotmail.com)
Весь приведенный выше текст должен быть включен в любое распространение
*/
включить
включить
включает
включить "bitmap.h"
включить "U8glib.h"
///////////////////////////////////////////////////////////////////
//----- Экземпляр OLED
// ВАЖНОЕ ПРИМЕЧАНИЕ: Полный список поддерживаемых устройств
// со всеми вызовами конструктора здесь: http://code.google.com/p/u8glib/wiki/device
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
//----- BT instance
SoftwareSerial BTSerial(2, 3); //Connect HC-06, RX, TX
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
//----- Протокол
//----- Анализ транзакций Bluetooth
определение TR_MODE_IDLE 1
определение TR_MODE_WAIT_CMD 11
определение TR_MODE_WAIT_MESSAGE 101
определение TR_MODE_WAIT_TIME 111
определение TR_MODE_WAIT_ID 121
определение TR_MODE_WAIT_COMPLETE 201
определение ТРАНЗАКЦИИ_START_BYTE 0xfc
определение ТРАНЗАКЦИИ_END_BYTE 0xfd
определить CMD_TYPE_NONE 0x00
определение CMD_TYPE_RESET_EMERGENCY_OBJ 0x05
определение CMD_TYPE_RESET_NORMAL_OBJ 0x02
определение CMD_TYPE_RESET_USER_MESSAGE 0x03
определение CMD_TYPE_ADD_EMERGENCY_OBJ 0x11
define CMD_TYPE_ADD_NORMAL_OBJ 0x12
define CMD_TYPE_ADD_USER_MESSAGE 0x13
define CMD_TYPE_DELETE_EMERGENCY_OBJ 0x21
define CMD_TYPE_DELETE_NORMAL_OBJ 0x22
define CMD_TYPE_DELETE_USER_MESSAGE 0x23
определение CMD_TYPE_SET_TIME 0x31
определение CMD_TYPE_REQUEST_MOVEMENT_HISTORY 0x32
определение CMD_TYPE_SET_CLOCK_STYLE 0x33
определить CMD_TYPE_SET_INDICATOR 0x34
определение CMD_TYPE_PING 0x51
определение CMD_TYPE_AWAKE 0x52
определение CMD_TYPE_SLEEP 0x53
определение CMD_TYPE_REBOOT 0x54
Указатель байтовой ТРАНЗАКЦИИ = TR_MODE_IDLE;
байт TR_COMMAND = CMD_TYPE_NONE;
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
//----- Буфер, параметры
//----- Буфер элементов сообщения
определение MSG_COUNT_MAX 7
определение MSG_BUFFER_MAX 19
символ без знака msgBuffer[MSG_COUNT_MAX][MSG_BUFFER_MAX];
char msgParsingLine = 0;
char msgParsingChar = 0;
символ msgCurDisp = 0;
//----- Буфер аварийных предметов
определение EMG_COUNT_MAX 3
определение EMG_BUFFER_MAX 19
символ emgBuffer[EMG_COUNT_MAX][EMG_BUFFER_MAX];
char emgParsingLine = 0;
char emgParsingChar = 0;
char emgCurDisp = 0;
//----- Время
определение ВРЕМЕНИ ОБНОВЛЕНИЯ_ИНТЕРВАЛА 60000
время в байте = 1;
идентификатор байта = 1;
byte iWeek = 1; // 1: ВС, ПН, ВТ, СР, ЧТ, ПТ, СБ
байт iAmPm = 0; // 0:00, 1:00
количество байтов iHour = 0;
иминуты байтов = 0;
байт - это секунда = 0;
определение TIME_BUFFER_MAX 6
char timeParsingIndex = 0;
char timeBuffer[6] = {-1, -1, -1, -1, -1, -1};
PROGRMEM const char* const weekString[] = {"", "Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"};
PROGMEM const char* const ampmString[] = {"AM", "PM"};
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
//----- Функции дисплея
определить DISPLAY_MODE_START_UP 0
определение DISPLAY_MODE_CLOCK 1
определение РЕЖИМА ОТОБРАЖЕНИЯЭМГЕНСЫМСГ 2
define DISPLAY_MODE_NORMAL_MSG 3
define DISPLAY_MODE_IDLE 11
byte displayMode = DISPLAY_MODE_START_UP;
define CLOCK_STYLE_SIMPLE_ANALOG 0x01
define CLOCK_STYLE_SIMPLE_DIGIT 0x02
define CLOCK_STYLE_SIMPLE_MIX 0x03
byte clockStyle = CLOCK_STYLE_SIMPLE_MIX;
define INDICATOR_ENABLE 0x01
логический индикатор обновления = true;
byte centerX = 64;
центр байта = 32;
байт iRadius = 28;
определение IDLE_DISP_INTERVAL 60000
определение CLOCK_DISP_INTERVAL 60000
определение АВАРИЙНОЙ СИТУАЦИИДИСПИНТЕРВАЛ 5000
define MESSAGE_DISP_INTERVAL 3000
неподписанное длительное время ожидания = 0;
unsigned long prevDisplayTime = 0;
unsigned long next_display_interval = 0;
unsigned long mode_change_timer = 0;
определение CLOCK_DISPLAY_TIME 300000
определение EMER_DISPLAY_TIME 10000
определение MSG_DISPLAY_TIME 5000
PROGMEM const char* const strIntro[] = {"Ретро", "Часы", "Arduino v1.0"};
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
//----- Кнопочное управление
int buttonPin = 5;
логическое значение isClicked = ВЫСОКОЕ;
///////////////////////////////////////////////////////////////////
настройка аннулирования () {
//Serial.begin (9600); // ПРЕДУПРЕЖДЕНИЕ: Не включайте это, если недостаточно памяти
//Serial.println(F("RetroWatch v1.0 u8g"));
//----- Кнопка установки
pinMode (PIN-код кнопки, ВВОД); // Определяет pin-код кнопки
//----- Инициализировать буфер сообщений
init_emg_array();
init_msg_array();
//----- Настройка функций дисплея
centerX = u8g.getWidth() / 2;
Центр = u8g.getHeight() / 2;
iRadius = centerY - 2;
//----- Настройка последовательного подключения с помощью BT
BTSerial.begin(9600); // установите скорость передачи данных для порта BT
//----- Показать логотип
drawStartUp(); // Показать логотип RetroWatch
задержка (3000);
}
void loop () {
получено логическое значение = false;
длительное текущее время без знака = 0;
// Получить ввод с помощью кнопки
if (digitalRead (buttonPin) == НИЗКИЙ) isClicked = НИЗКИЙ;
// Получать данные с пульта дистанционного управления и анализировать
isReceived = receiveBluetoothData();
// Обновить время на часах
current_time = миллис ();
Время обновления (current_time);
// Режим отображения
onDraw (current_time);
// Если данные не поступают, подождите некоторое время, чтобы сэкономить заряд батареи
если (!получено)
задержка (300);
}
///////////////////////////////////
//----- Утилиты
///////////////////////////////////
аннулирует init_msg_array() {
для(int i=0; i<MSG_COUNT_MAX; i++) {
для (int j=0; j<MSG_BUFFER_MAX; j ++) {
msgBuffer [i] [j] = 0x00;
}
}
msgParsingLine = 0;
msgParsingChar = 0; // First 2 byte is management byte
msgCurDisp = 0;
}
void init_emg_array() {
for(int i=0; i<EMG_COUNT_MAX; i++) {
for(int j=0; j<EMG_BUFFER_MAX; j++) {
emgBuffer[i][j] = 0x00;
}
}
emgParsingLine = 0;
emgParsingChar = 0; // Первые 2 байта - это байт управления
emgCurDisp = 0;
}
///////////////////////////////////
//----- Функции определения времени
///////////////////////////////////
аннулирует значение setTimeValue() {
iMonth = буфер времени[0];
iDay = буфер времени [1];
iWeek = таймер [2]; // 1: ВС, ПН, ВТ, СР, ЧТ, ПТ, СБ
iAmPm = буфер времени [3]; // 0:00, 13:00
iHour = буфер времени [4];
iMinutes = буфер времени [5];
}
недействительное время обновления (неподписанное длительное текущее время) {
if(iMinutes >= 0) {
if(current_time - prevClockTime > UPDATE_TIME_INTERVAL) {
// Увеличьте время
Мгновенные действия++;
если (iMinutes >= 60) {
iMinutes = 0;
iHour++;
если (iHour > 12) {
iHour = 1;
(iAmPm == 0) ? iAmPm = 1 : iAmPm = 0;
if(iAmPm == 0) {
iWeek++;
если (iWeek > 7)
iWeek = 1;
iDay++;
если (iDay> 30) // Да. день не указан точно.
iDay = 1;
}
}
}
prevClockTime = current_time;
}
}
else {
displayMode = DISPLAY_MODE_START_UP;
}
}
///////////////////////////////////
//----- BT, функции анализа данных
///////////////////////////////////
// Разбор пакета в соответствии с текущим режимом
логическое значение receiveBluetoothData() {
int isTransactionEnded = false;
пока (!isTransactionEnded) {
если(BTSerial.available()) {
байт c = BTSerial.read();
//if(c == 0xFE && TRANSACTION_POINTER != TR_MODE_WAIT_MESSAGE) возвращает false;
if(TRANSACTION_POINTER == TR_MODE_IDLE) {
parseStartSignal(c);
}
else if(TRANSACTION_POINTER == TR_MODE_WAIT_CMD) {
parseCommand (c);
}
else if(TRANSACTION_POINTER == TR_MODE_WAIT_MESSAGE) {
Разбор сообщения (c);
}
else if(TRANSACTION_POINTER == TR_MODE_WAIT_TIME) {
parseTime(c);
}
else if(TRANSACTION_POINTER == TR_MODE_WAIT_ID) {
parseId(c);
}
else if(TRANSACTION_POINTER == TR_MODE_WAIT_COMPLETE) {
isTransactionEnded = parseEndSignal(c);
}
} // End of if(BTSerial.available())
еще {
isTransactionEnded = true;
}
}// Конец while()
возвращает true;
} // Завершение получения BluetoothData()
аннулирует parseStartSignal (байт c) {
//drawLogChar(c);
if(c == TRANSACTION_START_BYTE ТРАНЗАКЦИИ) {
TRANSACTION_POINTER = TR_MODE_WAIT_CMD;
TR_COMMAND = CMD_TYPE_NONE;
}
}
аннулирует parseCommand (байт c) {
if(c == CMD_TYPE_RESET_EMERGENCY_OBJ || c == CMD_TYPE_RESET_NORMAL_OBJ || c == CMD_TYPE_RESET_USER_MESSAGE) {
TRANSACTION_POINTER = TR_MODE_WAIT_COMPLETE;
TR_COMMAND = c;
processTransaction();
}
else if(c == CMD_TYPE_ADD_EMERGENCY_OBJ || c == CMD_TYPE_ADD_NORMAL_OBJ || c == CMD_TYPE_ADD_USER_MESSAGE) {
TRANSACTION_POINTER = TR_MODE_WAIT_MESSAGE;
TR_COMMAND = c;
if(c == CMD_TYPE_ADD_EMERGENCY_OBJ) {
//Serial.println("# start - ADD_EMERGENCY_OBJ");
emgParsingChar = 0;
if(emgParsingLine >= MSG_COUNT_MAX || emgParsingLine < 0)
emgParsingLine = 0;
для (int i=3; i<EMG_BUFFER_MAX; i++)
emgBuffer[emgParsingLine] [i] = 0x00;
}
else if(c == CMD_TYPE_ADD_NORMAL_OBJ) {
//Serial.println("# start - ADD_NORMAL_OBJ");
msgParsingChar = 0;
if(msgParsingLine >= MSG_COUNT_MAX || msgParsingLine < 0)
msgParsingLine = 0;
для (int i=3; i<MSG_BUFFER_MAX; i++)
msgBuffer[msgParsingLine][i] = 0x00;
}
}
еще, если (c == CMD_TYPE_DELETE_EMERGENCY_OBJ || c == CMD_TYPE_DELETE_NORMAL_OBJ || c == CMD_TYPE_DELETE_USER_MESSAGE) {
TRANSACTION_POINTER = TR_MODE_WAIT_COMPLETE;
TR_COMMAND = c;
}
else if(c == CMD_TYPE_SET_TIME) {
TRANSACTION_POINTER = TR_MODE_WAIT_TIME;
TR_COMMAND = c;
}
еще, если (c == CMD_TYPE_SET_CLOCK_STYLE || c == CMD_TYPE_SET_INDICATOR) {
TRANSACTION_POINTER = TR_MODE_WAIT_ID;
TR_COMMAND = c;
}
еще {
TRANSACTION_POINTER = TR_MODE_IDLE;
TR_COMMAND = CMD_TYPE_NONE;
}
}
аннулирует синтаксическое сообщение (байт c) {
if(c == TRANSACTION_END_BYTE ТРАНЗАКЦИИ) {
Процесстранзакции ();
TRANSACTION_POINTER = TR_MODE_IDLE;
}
if(TR_COMMAND == CMD_TYPE_ADD_EMERGENCY_OBJ) {
if(emgParsingChar < EMG_BUFFER_MAX - 1) {
if(emgParsingChar > 1) {
emgBuffer[emgParsingLine][emgParsingChar] = c;
}
emgParsingChar++;
}
еще {
TRANSACTION_POINTER = TR_MODE_IDLE;
Процесстранзакции ();
}
}
else if(TR_COMMAND == CMD_TYPE_ADD_NORMAL_OBJ) {
if(msgParsingChar < MSG_BUFFER_MAX - 1) {
if(msgParsingChar > 1) {
msgBuffer[msgParsingLine][msgParsingChar] = c;
}
msgParsingChar++;
}
else {
TRANSACTION_POINTER = TR_MODE_IDLE;
processTransaction();
}
}
else if(TR_COMMAND == CMD_TYPE_ADD_USER_MESSAGE) {
// Not available yet.
TRANSACTION_POINTER = TR_MODE_WAIT_COMPLETE;
}
}
пустое время синтаксического анализа (байт c) {
if(TR_COMMAND == CMD_TYPE_SET_TIME) {
if(timeParsingIndex >= 0 && timeParsingIndex < TIME_BUFFER_MAX) {
Буфер времени[timeParsingIndex] = (int)c;
timeParsingIndex++;
}
еще {
Процесстранзакции ();
TRANSACTION_POINTER = TR_MODE_WAIT_COMPLETE;
}
}
}
недействительный синтаксический идентификатор (байт c) {
if(TR_COMMAND == CMD_TYPE_SET_CLOCK_STYLE) {
clockStyle = c;
Процесстранзакции ();
}
else if(TR_COMMAND == CMD_TYPE_SET_INDICATOR) {
if(c == INDICATOR_ENABLE)
updateIndicator = true;
ещё
updateIndicator = false;
Процесстранзакции ();
}
TRANSACTION_POINTER = TR_MODE_WAIT_COMPLETE;
}
логический синтаксический сигнал (байт c) {
if(c == TRANSACTION_END_BYTE ТРАНЗАКЦИИ) {
TRANSACTION_POINTER = TR_MODE_IDLE;
возвращает true;
}
возвращает false;
}
аннулирует транзакцию процесса() {
if(TR_COMMAND == CMD_TYPE_RESET_EMERGENCY_OBJ) {
init_emg_array();//init_msg_array();
}
else if(TR_COMMAND == CMD_TYPE_RESET_NORMAL_OBJ) {
init_msg_array();//init_emg_array();
}
else if(TR_COMMAND == CMD_TYPE_RESET_USER_MESSAGE) {
// Пока недоступен.
}
else if(TR_COMMAND == CMD_TYPE_ADD_NORMAL_OBJ) {
//Serial.println("# processTransaction() - ADD_NORMAL_OBJ");
msgBuffer[msgParsingLine][0] = 0x01;
msgBuffer[msgParsingLine][MSG_BUFFER_MAX-1] = 0x00;
msgParsingChar = 0;
msgParsingLine++;
if(msgParsingLine >= MSG_COUNT_MAX)
msgParsingLine = 0;
setNextDisplayTime(millis(), 0); // update screen immediately
}
else if(TR_COMMAND == CMD_TYPE_ADD_EMERGENCY_OBJ) {
//Serial.println("# processTransaction() - ADD_EMERGENCY_OBJ");
emgBuffer[emgParsingLine][0] = 0x01;
emgBuffer[emgParsingLine][EMG_BUFFER_MAX - 1] = 0x00;
emgParsingChar = 0;
emgParsingLine++;
if(emgParsingLine >= EMG_COUNT_MAX)
emgParsingLine = 0;
startEmergencyMode();
Установите время воспроизведения (миллис (), 2000);
}
else if(TR_COMMAND == CMD_TYPE_ADD_USER_MESSAGE) {
}
еще, если(TR_COMMAND == CMD_TYPE_DELETE_EMERGENCY_OBJ || TR_COMMAND == CMD_TYPE_DELETE_NORMAL_OBJ || TR_COMMAND == CMD_TYPE_DELETE_USER_MESSAGE) {
// Пока недоступен.
}
else if(TR_COMMAND == CMD_TYPE_SET_TIME) {
Установите значение времени ();
timeParsingIndex = 0;
setNextDisplayTime(миллис (), 0); // немедленно обновите экран
}
if(TR_COMMAND == CMD_TYPE_SET_CLOCK_STYLE || CMD_TYPE_SET_INDICATOR) {
setNextDisplayTime(миллис (), 0); // немедленно обновите экран
}
Top comments (0)