22222 — Arduino Nano simulation

22222

An interactive Arduino Nano circuit simulation you can run free in your browser on Velxio, by sadf.

Components

Sketch code

#include <Wire.h>
#include <LiquidCrystal.h>

// LCD引脚定义
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
#define BEEP_PIN   9
#define LED_PIN    11
#define KEY_SET    A1
#define KEY_ADD    A2
#define KEY_SUB    A3

// 全局变量
uint8_t mode = 0;
uint16_t year = 2026;
uint8_t mon = 7, day = 12;
uint8_t h = 11, min = 42, s = 0;
uint8_t alarm_h = 7, alarm_m = 0;
bool alarm_trigger = false;

unsigned long keyTime = 0;
const unsigned long keyDelay = 350;

// DS1307
#define DS1307_ADDR 0x68
void initRTC();
uint8_t bcd2dec(uint8_t val) { return (val >> 4) * 10 + (val & 0x0F); }
uint8_t dec2bcd(uint8_t val) { return ((val / 10) << 4) | (val % 10); }

// RTC上电初始化,清除CH停止位,仿真无电池也能走时
void initRTC()
{
  Wire.beginTransmission(DS1307_ADDR);
  Wire.write(0);
  Wire.write(0x00);
  Wire.endTransmission(true);
  delay(100);
}

void rtcRead()
{
  Wire.beginTransmission(DS1307_ADDR);
  Wire.write(0);
  Wire.endTransmission(true);
  Wire.requestFrom(DS1307_ADDR, 7);
  s = bcd2dec(Wire.read() & 0x7F);
  min = bcd2dec(Wire.read());
  h = bcd2dec(Wire.read() & 0x3F);
  Wire.read();
  day = bcd2dec(Wire.read());
  mon = bcd2dec(Wire.read());
  year = bcd2dec(Wire.read()) + 2000;
}

void rtcWrite()
{
  Wire.beginTransmission(DS1307_ADDR);
  Wire.write(0);
  Wire.write(dec2bcd(s) & 0x7F);
  Wire.write(dec2bcd(min));
  Wire.write(dec2bcd(h));
  Wire.write(0);
  Wire.write(dec2bcd(day));
  Wire.write(dec2bcd(mon));
  Wire.write(dec2bcd(year - 2000));
  Wire.write(0);
  Wire.endTransmission(true);
}

// BMP280
#define BMP280_ADDR 0x76
uint16_t dig_T1;
int16_t dig_T2, dig_T3;

uint16_t read16(uint8_t reg)
{
  uint16_t value;
  Wire.beginTransmission(BMP280_ADDR);
  Wire.write(reg);
  Wire.endTransmission(true);
  Wire.requestFrom(BMP280_ADDR, 2);
  value = (Wire.read() << 8) | Wire.read();
  return value;
}

void bmp280Init()
{
  Wire.beginTransmission(BMP280_ADDR);
  Wire.write(0xD0);
  Wire.endTransmission(true);
  if(Wire.requestFrom(BMP280_ADDR,1) && Wire.read() == 0x58)
  {
    dig_T1 = read16(0x88);
    dig_T2 = read16(0x8A);
    dig_T3 = read16(0x8C);
  }
  Wire.beginTransmission(BMP280_ADDR);
  Wire.write(0xF4);
  Wire.write(0x27);
  Wire.endTransmission(true);
}

float getTemperature()
{
  Wire.beginTransmission(BMP280_ADDR);
  Wire.write(0xF7);
  Wire.endTransmission(true);
  Wire.requestFrom(BMP280_ADDR, 3);
  uint8_t msb = Wire.read();
  uint8_t lsb = Wire.read();
  uint8_t xlsb = Wire.read();
  int32_t adc = ((uint32_t)msb << 12) | ((uint32_t)lsb << 4) | (xlsb >> 4);
  int32_t var1 = ((((adc >> 3) - ((int32_t)dig_T1 << 1))) * ((int32_t)dig_T2)) >> 11;
  int32_t var2 = (((((adc >> 4) - ((int32_t)dig_T1)) * ((adc >> 4) - ((int32_t)dig_T1))) >> 12) * ((int32_t)dig_T3)) >> 14;
  int32_t t_fine = var1 + var2;
  float temp = ((t_fine * 5) + 128) >> 8;
  temp = temp / 100.0f;
  // 人工温度补偿,修改后面数字调整显示温度
  float offset = 28.0;
  temp = temp + offset;
  return temp;
}

// 蜂鸣器、LED函数
void shortBeep() { tone(BEEP_PIN, 1000, 100); }
void alarmSound() { tone(BEEP_PIN, 800); }
void stopBeep() { no

More projects by sadf