手机追星拍摄效果https://www.bilibili.com/video/BV14g411m7Ut?vd_source=c748f0905deed633de7597d610ad91cc
3D模型文件在这个群里:681038889 里面保姆级教程
材料的购买:立创商城新人注册优惠券入口可以在这注册领30优惠券,在这里注册有时候还会有不定时的优惠券发放
手机拍摄效果:
手机直出,淡淡的银河系星河,实际上比这个好看一些。
快门速度:S,开到1分钟都不会有拖影。
AF对焦模式开到MF拉到无穷远拍星星
ISO是感光度,大晚上的不建议开超过400
加上了显示屏,使用方法看B站视频,
就是先用指星笔指到北极星,然后调整手机或者相机到你想拍的星星就行了。
大佬用照相机拍的木星
可能是仙女座吧
手机放外边可以打开自动点击器,这样可以间隔一段时间拍一张照片,后期叠加一下或者做个视频都是很方便的。
程序如下:
#include <MsTimer2.h>//定时器库的头文件
#include <Wire.h>
// 引入驱动OLED0.91所需的库
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // 设置OLED宽度,单位:像素
#define SCREEN_HEIGHT 32 // 设置OLED高度,单位:像素
// 自定义重置引脚,虽然教程未使用,但却是Adafruit_SSD1306库文件所必需的
#define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define NS 7 //南北半球(正反转)
#define a 5 //a+
#define aa 6 //a-
#define b 9 //b+
#define bb 10 //b-
#define SS0 12 //速度编码1
#define SS1 11 //~2
#define SS2 8 //~3
#define scanMs 20 //定义扫描时间
const int tab[8][4] = {
{1, 0, 0, 0},
{1, 0, 1, 0},
{0, 0, 1, 0},
{0, 1, 1, 0},
{0, 1, 0, 0},
{0, 1, 0, 1},
{0, 0, 0, 1},
{1, 0, 0, 1}
};
static int tab_i = 0;//查表循环
//速度表: {{Ms},{Us}} 恒星速/5X/MAX /1h /2h /3h /5h /12h延时速度
//计算:恒星日:23:56:04 = 86164s /2916/96/2 ~ 153.899ms/step
//如需月亮速:89428s /2916/96/2~159.729ms/step
const int Sptab[2][8] = {
{153 , 30 , 0 , 6 , 12 , 19 , 32 , 76 },
{345 , 780, 800, 412, 824, 237, 162, 950}
};
void scanSp();
long double previousMillis = 0; //上一次转换电平绝对时间
int A = 0;
int Comtime = 0; //补偿恒星速中断、读写、判断耗时 us
int Comtimeset;
float ms = 0.0;
float us = 0.0;
int ctl[4]; //0N1S, 2-5Speed
int b1 = b;
int bb1 = bb;
//int time1 = 0;
//int time2;
void setup()
{
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
pinMode(a, OUTPUT);
pinMode(aa, OUTPUT);
pinMode(b, OUTPUT);
pinMode(bb, OUTPUT);
pinMode(NS, INPUT_PULLUP); //输入上拉 南北半球(正反转)
pinMode(SS0, INPUT_PULLUP); //speed
pinMode(SS1, INPUT_PULLUP); //
pinMode(SS2, INPUT_PULLUP); //
pinMode(A1, INPUT);
pinMode(A2, INPUT);
for (;;) {
if (!digitalRead(A1))//增加补偿
{
delay(40);
if (!digitalRead(A1))
{
Comtime++;
}
Comtimeset = Comtime;
}
else if (!digitalRead(A2))//减小补偿
{
delay(40);
if (!digitalRead(A2))
{
Comtime--;
}
Comtimeset = Comtime;
}
words_display();
display.display();
if (digitalRead(2) && digitalRead(3)) //加减速按键同时按下,开始追星
{
break;
}
}
MsTimer2::set(scanMs, scanSp);//中断扫描引脚
MsTimer2::start();
}
void scanSp()
{
if (digitalRead(3))//kj
{
for (int i = 0; i <= 7; i++) {
tt(a, aa, b1, bb1, i);
delay(1);
}
}
if (digitalRead(2))//js
{
for (int i = 0; i <= 7; i++) {
tt(a, aa, bb, b, i);
delay(1000);
}
delay(100);
}
if (!digitalRead(A1))//kj
{
ctl[0] = digitalRead(NS);
ctl[1] = digitalRead(SS0);
ctl[2] = digitalRead(SS1);
ctl[3] = digitalRead(SS2);
Speed(ctl);//计算延时毫秒数
}
}
void words_display()
{
ctl[0] = digitalRead(NS);
ctl[1] = digitalRead(SS0);
ctl[2] = digitalRead(SS1);
ctl[3] = digitalRead(SS2);
Speed(ctl);//计算延时毫秒数
int spp = ctl[3] + 2 * ctl[2] + 4 * ctl[1];
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1.5);
display.setCursor(0, 0);
display.print("speed:");
display.print(spp);
display.setCursor(50, 0);
display.print("HS:");
if (digitalRead(NS))
{
display.print("N");
}
else
{
display.print("S");
}
display.setCursor(83, 0);
display.print("RT:");
display.print(millis() / 1000);
display.print("s");
display.setCursor(0, 10);
display.print("CT:");
display.print(Comtime);
display.setCursor(50, 10);
display.print(int(ms));
display.print("MS ");
display.print(int(us));
display.print("US");
}
void Speed(int ct[4]) //速度与方向
{
int spp = ct[3] + 2 * ct[2] + 4 * ct[1]; // 0-7
if (ct[0] == 0) {
b1 = b;
bb1 = bb;
}
else {
b1 = bb;
bb1 = b;
}
switch (spp) {
case 0: { //star000
ms = Sptab[0][0];
us = Sptab[1][0] - Comtime;
} break;
case 1: { //5Xstar001
ms = Sptab[0][1];
us = Sptab[1][1];
} break;
case 7: { //MAX111
ms = Sptab[0][2];
us = Sptab[1][2];
} break;
case 2: { //1h 010
ms = Sptab[0][3];
us = Sptab[1][3];
} break;
case 3: { //2h 011
ms = Sptab[0][4];
us = Sptab[1][4];
} break;
case 4: { //3h 100
ms = Sptab[0][5];
us = Sptab[1][5];
} break;
case 5: { //5h 101
ms = Sptab[0][6];
us = Sptab[1][6];
} break;
case 6: { //12h 110
ms = Sptab[0][7];
us = Sptab[1][7];
} break;
default : {
} break;
}
//Serial.println(ms);
//Serial.println(us);
}
void tt(int a1, int aa1, int b1, int bb1, int tab_i) //一个电机循环
{
digitalWrite(a1, tab[tab_i][0]);
digitalWrite(aa1, tab[tab_i][1]);
digitalWrite(b1, tab[tab_i][2]);
digitalWrite(bb1, tab[tab_i][3]);
}
void loop() {
if (ms >= 20) { //大于20ms时才使用millis()计时
long double currentMillis = millis();
//time1 = micros();
tt(a, aa, b1, bb1, tab_i);
if (currentMillis - previousMillis >= ms) {
delayMicroseconds (us);
previousMillis = currentMillis + us / 1000;
tab_i++;
if (tab_i >= 8) tab_i = 0;
//time2 = micros();
//Serial.println(time2-time1);
}
}
else {
for (int i = 0; i <= 7; i++) {
tt(a, aa, b1, bb1, i);
delay(ms);
delayMicroseconds (us);
}
}
}
!注意:请使用浏览器自带下载,迅雷等下载软件可能无法下载到有效资源。
欢迎加入EEWorld参考设计群,也许能碰到搞同一个设计的小伙伴,群聊设计经验和难点。 入群方式:微信搜索“helloeeworld”或者扫描二维码,备注:参考设计,即可被拉入群。 另外,如您在下载此设计遇到问题,也可以微信添加“helloeeworld”及时沟通。
EEWorld Datasheet 技术支持