之前的简易时钟对时是需要重新烧录源码,并且对完时后还要把对时的那部分源码注释掉再烧录一遍,且写入等待时间不可控,容易造成误差。所以又找到一个串口调时的代码,比较方便。 用法上先烧录这个代码,打开串口,串口输入当前日期时间,以逗号分隔(注意在英文状态下)。 格式为: 年,月,日,时,分,秒,星期 星期数:Sunday=1,MOnday=2,...Saturday=7。比如,今天是2017年9月3日23时23分23秒星期日。 填入2017,09,03,23,23,23,1即可。注意单数前要加0(星期不用)。 对完时无误后再烧录之前那个时钟代码。 代码: /* Arduino 连接 DS1302 代码来源:http://quadpoint.org/projects/arduino-ds1302 增加了串口调整时间代码 */ #include <stdio.h> #include <string.h> #include <DS1302.h> /* 接口定义 CE(DS1302 pin4) -> Arduino D4 IO(DS1302 pin5) -> Arduino D5 SCLK(DS1302 pin6) -> Arduino D6 */ uint8_t CE_PIN = 4; uint8_t IO_PIN = 5; uint8_t SCLK_PIN = 6; /* 日期变量缓存 */ char buf[50]; char day[10]; /* 串口数据缓存 */ String comdata = ""; int numdata[7] ={0}, j = 0, mark = 0; /* 创建 DS1302 对象 */ DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN); void print_time() { /* 从 DS1302 获取当前时间 */ Time t = rtc.time(); /* 将星期从数字转换为名称 */ memset(day, 0, sizeof(day)); switch (t.day) { case 1: strcpy(day, "Sunday"); break; case 2: strcpy(day, "Monday"); break; case 3: strcpy(day, "Tuesday"); break; case 4: strcpy(day, "Wednesday"); break; case 5: strcpy(day, "Thursday"); break; case 6: strcpy(day, "Friday"); break; case 7: strcpy(day, "Saturday"); break; } /* 将日期代码格式化凑成buf等待输出 */ snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d", day, t.yr, t.mon, t.date, t.hr, t.min, t.sec); /* 输出日期到串口 */ Serial.println(buf); } void setup() { Serial.begin(9600); rtc.writeProtect(false); rtc.halt(false); } void loop() { /* 当串口有数据的时候,将数据拼接到变量comdata */ while (Serial.available() > 0) { comdata += char(Serial.read()); delay(2); mark = 1; } /* 以逗号分隔分解comdata的字符串,分解结果变成转换成数字到numdata[]数组 */ if(mark == 1) { Serial.print("You inputed : "); Serial.println(comdata); for(int i = 0; i < comdata.length() ; i++) { if(comdata[i] == ',' || comdata[i] == 0x10 || comdata[i] == 0x13) { j++; } else { numdata[j] = numdata[j] * 10 + (comdata[i] - '0'); } } /* 将转换好的numdata凑成时间格式,写入DS1302 */ Time t(numdata[0], numdata[1], numdata[2], numdata[3], numdata[4], numdata[5], numdata[6]); rtc.time(t); mark = 0;j=0; /* 清空 comdata 变量,以便等待下一次输入 */ comdata = String(""); /* 清空 numdata */ for(int i = 0; i < 7 ; i++) numdata[i]=0; } /* 打印当前时间 */ print_time(); delay(1000); } 用到的库: https://github.com/msparks/arduino-ds1302 注意这个代码必须用这个库,这也是我之前那个为什么要重命名库的原因了。两个库不能重名,一定要用对应的,不然编译不了。 参考文章:http://www.geek-workshop.com/thread-205-1-1.html
以前买过一个4位的数码管一直没用过, 放着也是吃灰,就拿来做一个简易时钟吧。我并不需要什么复杂的功能,能显示时间就行,所以连按钮也没有设计。 硬件: Arduino nano一块 DS1302时钟电路一个 TM1637-4位数码管一个 杜邦线若干 连接: DS1302: VCC — VCC GND — GND RST — D4 DAT — D5 CLK — D6 4位数码管: VCC — VCC GND — GND CLK — D3 DIO — D2 连接图: 代码: #include <ds1302.h>//这里因为我有多个1302的库,所以把库重命名了 #include <TM1637Display.h> // DS1302 初始化設定 DS1302 rtc(4, 5, 6);//RST-4,DAT-5,CLK-6 // 設定 TM1637 接腳 #define CLK 3 #define DIO 2 TM1637Display display(CLK, DIO); boolean colon = true ; String dw = ""; String hh = ""; String mm = ""; String ss = ""; float t = 0; void setup() { // 設定時鐘執行模式,取消寫入保護 rtc.halt(false); rtc.writeProtect(false); // Setup Serial connection Serial.begin(9600); display.setBrightness(0xA); // 第一次設定寫入 DS1302 RTC時鐘,之後可以加上註解 // rtc.setDOW(SUNDAY); // 設定每週星期幾? // rtc.setTime(20, 16, 30); // 設定24小時時間 20:16:30 // rtc.setDate(19, 3, 2017); // 設定日期(日, 月, 年) } void loop() { // 取得星期幾 Serial.print(rtc.getDOWStr()); Serial.print(" "); // 取得日期 Serial.print(rtc.getDateStr()); Serial.print(" -- "); // 取得時間 dw = rtc.getTimeStr(); Serial.println(dw); hh = dw.substring(0,2); // 時數 mm = dw.substring(3,5); // 分鐘數 ss = dw.substring(6,8); // 秒數 // 顯示四位數中間的冒號 uint8_t segto; int value = 1000; // 顯示 時:分 int t = hh.toInt()*100 + mm.toInt(); // 顯示 分:秒 // int t = mm.toInt() *100 +ss.toInt(); segto = 0x80 | display.encodeDigit((t / 100)%10); display.setSegments(&segto, 1, 1); delay(500); // 顯示時間 display.showNumberDec(t, true); delay(500); } 涉及到的库: http://www.rinkydinkelectronics.com/download.php?f=DS1302.zip https://github.com/avishorp/TM1637 成品图: 最后套一个壳子: 参考文章:http://atceiling.blogspot.ca/2017/03/arduino-rtc-tm1637.html
有时需要测一下引脚的输出情况,最直观的就是测波形了,买个示波器不太可能了,太贵了没必要。只好自己做一个了。 硬件: Arduino UNO一块 Arduino nano一块(用来产生方波) Nokia5110屏幕一块 电位器一个(我用的是500欧的) 面包板一块 面包线若干 连接: Nokia5110: RST — D3 CE — D4 DC — D5 Din — D6 CLK — D7 Vcc — Vcc BL — Vcc Gnd — Gnd 电位器: 两脚的两端分别接Vcc和Gnd,另一脚接A1. Arduino nano的D9接UNO的A0. 连线图(点击放大): 代码: UNO: #include <Adafruit_GFX.h> #include <Adafruit_PCD8544.h> #include <SPI.h> #define DISPLAY_WIDTH 84 #define DISPLAY_HEIGHT 48 #define ARDUINO_PRECISION 1023.0 Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3); //Analog Pins int channelAI = A0; // probe #define DELAY_POTENTIMETER //disabled it I don't have it connected #ifdef DELAY_POTENTIMETER int delayAI = A1; // delay potentiometer #endif float delayVariable = 0; float scale = 0; int xCounter = 0; int yPosition = 0; int readings[DISPLAY_WIDTH+1]; int counter = 0; unsigned long drawtime = 0; unsigned long lastdraw = 0; int frames = 0; void setup(void) { display.begin(); display.setContrast(60);// you might have a slightly different display so it might not be the optimal value for you display.clearDisplay(); } void loop() { #ifdef DELAY_POTENTIMETER delayVariable = analogRead(delayAI); delayVariable = (delayVariable/100); #endif scale = (float)(DISPLAY_HEIGHT-1)/ARDUINO_PRECISION; //record readings for(xCounter = 0; xCounter <= DISPLAY_WIDTH; xCounter++) { yPosition = analogRead(channelAI); readings[xCounter] = (yPosition*scale); #ifdef DELAY_POTENTIMETER delay (delayVariable); #endif } display.clearDisplay(); //Draw Voltage Ref Lines display.drawLine( 10, 0, 10, DISPLAY_HEIGHT-1, BLACK); display.drawLine( 5, (DISPLAY_HEIGHT-1)-(.2 *ARDUINO_PRECISION * scale), 10, (DISPLAY_HEIGHT-1)-(.2 *ARDUINO_PRECISION * scale), BLACK); display.drawLine( 0, (DISPLAY_HEIGHT-1)-(.4 *ARDUINO_PRECISION * scale), 10, (DISPLAY_HEIGHT-1)-(.4 *ARDUINO_PRECISION * scale), BLACK); display.drawLine( 5, (DISPLAY_HEIGHT-1)-(.6 *ARDUINO_PRECISION * scale), 10, (DISPLAY_HEIGHT-1)-(.6 *ARDUINO_PRECISION * scale), BLACK); display.drawLine( 0, (DISPLAY_HEIGHT-1)-(.8 *ARDUINO_PRECISION * scale), 10, (DISPLAY_HEIGHT-1)-(.8 *ARDUINO_PRECISION * scale), BLACK); //display.drawLine( 5, (DISPLAY_HEIGHT-1)-(.84 *ARDUINO_PRECISION * scale), 10, (DISPLAY_HEIGHT-1)-(.84 *ARDUINO_PRECISION * scale), BLACK); //Draw Voltage Ref Numbers display.setCursor(0,((DISPLAY_HEIGHT-1)-(.2 *ARDUINO_PRECISION * scale))-3); display.print((int)(5.0*0.2)); display.setCursor(0,((DISPLAY_HEIGHT-1)-(.4 *ARDUINO_PRECISION * scale))-3); display.print((int)(5.0*0.4)); display.setCursor(0,((DISPLAY_HEIGHT-1)-(.6 *ARDUINO_PRECISION * scale))-3); display.print((int)(5.0*0.6)); display.setCursor(0,((DISPLAY_HEIGHT-1)-(.8 *ARDUINO_PRECISION * scale))-3); display.print((int)(5.0*0.8)); for(xCounter = 0; xCounter <= DISPLAY_WIDTH; xCounter++) { display.drawPixel(xCounter, (DISPLAY_HEIGHT-1)-readings[xCounter], BLACK); if(xCounter>1){ display.drawLine(xCounter-1, (DISPLAY_HEIGHT-1)-readings[xCounter-1], xCounter, (DISPLAY_HEIGHT-1)-readings[xCounter], BLACK); } } //Draw FPS display.setCursor((DISPLAY_WIDTH-1)-11,0); display.print(frames); //Draw Voltage display.setCursor(((DISPLAY_WIDTH-1)/2),0); display.print(analogRead(channelAI)/ARDUINO_PRECISION*5.0); display.display(); //Calculate FPS drawtime = micros(); frames=1000000/*a second*//(drawtime-lastdraw); lastdraw = drawtime; } nano: void setup() { // 下面的等值于 OC1A = 输出用于定时器1的CTC模式 pinMode(9, OUTPUT); // 设置默认关联了D9(查表得知)为输出 TCCR1B=0; // 只是个复位的习惯可以不要 TCCR1A=_BV(COM1A0); // 要是困扰的话你也可以写成 TCCR1A = 0b01000000; //这里和上一个表示了 = CTC 模式, 开启比较器(默认输出), prescaler = 1 TCCR1B = _BV(WGM12)|_BV(CS10) ; // 这里等值于 TCCR1B = 0b00001001; // 最有意思的了,16位的玩意来确定要一个怎样的频率 OCR1A = 1000; // 计算为:F_CPU/2/Need_HZ-1 来得到你想要的,遗憾的是四舍五入来截取频率 } void loop(){ //这次啥也没做 } 成品图: 涉及到的库文件下载: https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library https://github.com/adafruit/Adafruit-GFX-Library 参考文章: http://www.instructables.com/id/Nokia-5110-Arduino-Oscilloscope/ http://www.geek-workshop.com/thread-13315-1-1.html
最近忍痛买了一块正版的Arduino UNO,80多块,真的贵,都能买一个NanoPiNEO了。不过正版的做工确实好,性能也稳定。 所以之前买的兼容版就又拿来做点东西啦,这次是一个简单的温湿度计。 硬件: Arduino UNO一块 DHT11温湿度模块一个 IIC1602显示模块一个 Arduino UNO底板一块 杜邦线若干 连接: IIC1602: VCC — VCC GND — GND SDA — SDA SCL — SCL DHT11: VCC — VCC GND — GND DAT — pin12 照例先检测1602的地址,代码见:http://blog.readgroup.cn/post/52,不再重复了。 DHT11的库自带有,没有的话用这个:https://github.com/adafruit/DHT-sensor-library 基础库:https://github.com/adafruit/Adafruit_Sensor 代码: //DHT11 Sensor: #include "DHT.h" #define DHTPIN 12 // what digital pin we're connected to #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE); //I2C LCD: #include <Wire.h> // Comes with Arduino IDE #include <LiquidCrystal_I2C.h> // Set the LCD I2C address LiquidCrystal_I2C lcd(0x27,16,2); void setup() { Serial.begin(9600); lcd.begin(16,2); Serial.println("Mohamed Chaara Temp and Humidity Sensor Test"); dht.begin(); } void loop() { // Reading temperature or humidity takes about 250 milliseconds! // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) int h = dht.readHumidity(); int t = dht.readTemperature(); // set the cursor to (0,0): lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); // print from 0 to 9: lcd.print("Temp: "); lcd.print(t); lcd.write(0xDF); lcd.print("C"); // set the cursor to (16,1): lcd.setCursor(0,1); lcd.print("Humidity: "); lcd.print(h); lcd.print("%"); Serial.print("Temp: "); Serial.print(t); Serial.print("C, Humidity: "); Serial.print(h); Serial.println("%"); } 成品图: 参考文章:http://www.instructables.com/id/Arduino-TempHumidity-Sensor-Using-DHT11-and-I2C-LC/
给之前那个OSU专用键盘加一个呼吸灯。 硬件:Arduino pro mini 要使用支持PWM的引脚,查一下引脚图即可。 代码: 示例1: int pins[] = {9}; int length = sizeof(pins) / sizeof(int); //想实现呼吸灯效果 需用到支持PWM的引脚 void setup() { } void loop() { int flag = 0; //渐亮渐暗状态切换 int sped = 5; //步长 for (int fadeValue = 0 ; fadeValue <= 255; ) { for(int i=0;i<length;i++){ analogWrite(pins[i], fadeValue); //analogWrite PWM输出0~255 } delay(60); if(fadeValue >= 255){ flag = 1; } if(fadeValue <= 0){ flag = 0; } if(flag == 1){ fadeValue -= sped; }else{ fadeValue += sped; } } } 示例2: void setup () { pinMode(9,OUTPUT); } void loop() { for (int a=0; a<=255;a++) //循环语句,控制PWM亮度的增加 { analogWrite(9,a); delay(8); //当前亮度级别维持的时间,单位毫秒 } for (int a=255; a>=0;a--) //循环语句,控制PWM亮度减小 { analogWrite(9,a); delay(8); //当前亮度的维持的时间,单位毫秒 } delay(8); //完成一个循环后等待的时间,单位毫秒 } 以上两种都可以达到效果,我目前用的是示例2,这也是我修改过的。 参考文章: http://www.jianshu.com/p/65d5ccbfca82 http://www.geek-workshop.com/forum.php?mod=viewthread&tid=1126
最近真是把好多以前毕设用的Arduino都拿出来玩了,这次是一个8*8的LED点阵。 硬件: Arduino pro mini一块 8*8点阵一个 杜邦线若干 CH340串口转USB模块一个 连线: Matrix pin no. Row Column Arduino pin number 1 5 - 13 2 7 - 12 3 - 2 11 4 - 3 10 5 8 - 16 (analog pin 2) 6 - 5 17 (analog pin 3) 7 6 - 18 (analog pin 4) 8 3 - 19 (analog pin 5) 9 1 - 2 10 - 4 3 11 - 6 4 12 4 - 5 13 - 1 6 14 2 - 7 15 - 7 8 16 - 8 9 硬件连接图(点击放大): 注意: 1.此图为有丝印的一面朝下。 2.硬件必须这么连接,不能改引脚,因为后面用到的软件是这么定义引脚的。 编程: 这次不用IDE了,直接用一款可视化的编程工具Mind+。 直接在里面选取好模块,连线,画图就可以了,见最前面那张图。注意自己的点阵是共阴还是供阳,修改true或者false。 最后烧录,因为pro mini没有自带串口,所以要用一个USB转串口的模块进行烧录。接好VCC,GND,TX接RX,RX接TX,点击upload,等待编译后出现upload时按板子上的复位按钮,就可以了。注意,如果不按或者没有及时按,都会导致烧录失败。
闲置了好久的一些散件,觉得还是用来干点什么比较好,so,就做了这么一个超声波测距的东西。 硬件:Arduino UNO一块 HC-SR04超声波测距模块一个 IIC1602显示模块一个 UNO固定板一块 连接: 超声波:VCC — 5v Trig — D5 Echo — D4 GND — GND IIC1602:VCC — VCC GND — GND SDA — SDA SCL — SCL 首先检测自己的1602地址,打开串口,设置波特率9600,写入以下代码: #include <Wire.h> void setup() { Wire.begin(); Serial.begin(9600); Serial.println("\nI2C Scanner"); } void loop() { byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 1; address < 127; address++ ) { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); nDevices++; } else if (error==4) { Serial.print("Unknow error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(5000); // wait 5 seconds for next scan } 之后就能看到地址了,我的是0x3F。 然后写入以下代码: #include <LiquidCrystal_I2C.h> #include <Wire.h> LiquidCrystal_I2C lcd(0x3F,16,2);//设置I2C驱动板的地址,楼主的是0x3F,请根据上一步获得的写入,不然不会再LCD上显示信息 int inputPin=4; // 定义超声波信号接收接口 int outputPin=5; // 定义超声波信号发出接口 int ledpin=13; void setup() { Serial.begin(9600); pinMode(ledpin,OUTPUT); pinMode(inputPin, INPUT); pinMode(outputPin, OUTPUT); } void loop() { lcd.init(); digitalWrite(outputPin, LOW); // 使发出发出超声波信号接口低电平2ms delayMicroseconds(2); digitalWrite(outputPin, HIGH); // 使发出发出超声波信号接口高电平10ms,这里是至少10μs delayMicroseconds(10); digitalWrite(outputPin, LOW); // 保持发出超声波信号接口低电平 float distance = pulseIn(inputPin, HIGH); // 读出脉冲时间 distance= 1.3+distance/58; // 将脉冲时间转化为距离(加上底座高度单位:厘米) Serial.print(distance); Serial.println("cm");//向串口监视器中输出距离信息 lcd.backlight(); lcd.setCursor(0,0);//光标从这里开始 lcd.print("Distance is"); lcd.setCursor(0,1);//换行后显示距离 lcd.print(distance); lcd.println("cm");//在LCD上输出距离信息 delay(100);//刷新时间100ms,也就是0.1s } 到这就可以了。 注意:1.第一步获取的地址如果不同,要修改第二部分的代码里面相应的部分。 2.1602的对比度在板子后面有蓝色的旋钮可以调节。 3.IDE版本超过1.6的话,IIC的库可能不正常,导致1602只能显示第一个字符,这里提供下我用的库,我的IDE版本是1.8.3。下载:LiquidCrystal_I2C1602V1.rar 最后成品图: 参考文章: http://www.arduino.cn/thread-21927-1-1.html
之前搭建的时候SSL证书使用了自己签发的,网页访问会弹出不信任提示,自己用当然没什么问题啦,但看着有点不完美。后来想到阿里云和腾讯云现在都有免费的SSL证书可以使用,于是便去签发了一个。 这次使用的是阿里云的,填完信息后等待验证签发就行,全程自动,速度还可以。 签好后选择最后那个其他的下载,下好后文件夹里会有许多文件,我们要用到的只有两个。 一串数字开头的.key和.pem两个文件。 然后把.key里面的内容复制到,pem里面放在最上面。 之后重命名.pem文件为server.pem替换掉之前自己签发的那个即可。 然后启用HSTS用来自动从http跳转到https 打开配置文件/etc/lighttpd/lighttpd.conf 在最后加入以下代码: server.modules += ( "mod_setenv" ) $HTTP["scheme"] == "https" { setenv.add-response-header = ( "Strict-Transport-Security" => "max-age=63072000; includeSubdomains; preload") } 重启服务器,再访问便可以了。
之前折腾过树莓派的显示服务器信息的屏幕,想着也给NanoPiNEO来一块。 硬件:Nokia5110屏幕一块。 首先要把NanoPiNEO上的排针焊好,只焊两排的那个就够用了。 安装wiringNP,就是wiringPi的NanoPi专用版,这点说明这个板子还是可以的,该有的还有。 git clone https://github.com/friendlyarm/WiringNP cd WiringNP/ chmod 755 build ./build 接着把线接好,对照着引脚图接线(注意所标引脚为wiringNP的标号): RST:外部复位引脚——5 CE:显示屏使能引脚——4 DC:数据/命令引脚——1 Din:串行数据输入端——16 CLK:串行时钟输入端——15 Vcc:电源引脚——9 BL: 背光灯——8 Gnd:地——GND (引脚可以根据实际情况自行更改,注意VCC一定要接控制引脚,方便软件控制对比度,BL直接接VCC也行。) 引脚图: 然后下载驱动程序: wget http://blog.readgroup.cn/filetool/a/nokia5110forNanoPiNEO.zip unzip nokia5110forNanoPiNEO.zip cd nokia5110forNanoPiNEO 接下来需要编译显示程序,在目录下编译生成cpushow。 cc -o cpushow pcd8544_rpi.c PCD8544.c -L/usr/local/lib -lwiringPi 编译完成后,会在当前目录下生成可执行文件 cpushow ,然后执行这个文件。 sudo ./cpushow 一切正常的话会先出现NanoPiNEO的图标,然后进入后显示系统相关信息,包括:启动时间,CPU使用率,内存使用情况,CPU温度,星期,日期,时间和IP地址。 最后在/etc/rc.local加入开机启动:cd /cpushow所在目录 && ./cpushow & 最后效果(还是用的上次那个树莓派的壳,完美塞进去,还能稍微固定下): 补充:1.原来的代码是为树莓派写的,但我用了下基本没问题,修改了一些地方就行了,主要是温度,刚开始一直是0,查了代码没问题,后来进系统去查temp文件才发现,dietpi的温度已经是两位数的正常值,不需要再除以1000。(文件中的程序都修改好了,直接可用) 2.原来的开机图标是树莓派的图标,用字模软件做了个NanoPiNEO的字标,看着好点,尤其随着开机启动,挺像那么回事。 3.刚开始折腾的时候,屏幕一直会乱码,以为是代码问题,改了好久都不行,又试了别的库还是不行,最后拿下来用Arduino测试了一下看看是不是屏幕坏的,也不是。Arduino显示好的,然后我突然发现了问题,居然是我用来连接的杜邦线有问题,换了一下再试就可以了。这个真的是坑了我好长时间。下次一定要买质量好的线! 参考文章:http://blog.lxx1.com/2001
首先说下使用的环境: 硬件:NanoPi NEO 操作系统:Dietpi 为什么会现在才想到搭建这个系统呢,之前一直没有同步本地文件的需求,但要开工写毕业论文了,需要把论文随时备份,所以就需要一个能够同步的网盘。为什么要自己搭建呢?一来市面上的网盘我已经失去信任了,二来万一网络什么的出问题也能够直接从实体机把文件拷出来,提高可靠性。好了,下面来记录下步骤。 1.首先刷入系统,参考以前文章,这里不再重复。 登录SSH,等待系统初始化完成后开始安装软件。这里直接使用系统自带的软件管理系统安装,分别勾选: XFCE(一个桌面环境,也可以根据自己喜好安装别的。装桌面是为了远程方便,也可以不装。) Tightvnc server(VNC服务。) XRDP(远程桌面。如果不要桌面环境,那么以上这3个都不要安装。) owncloud(本篇主角,系统里带了,直接选择安装就好。但可能不是最新版,后续可以自己升级。) LLSP(web服务环境,这个比较轻量,自用够了,也可以选别的。) vsFTPD(FTP软件,这个权限比较高,能够访问根目录。) 主要就是这几个,空格键打*选择,完了直接进入安装程序。有需要可以安装中文字库和输入法。 好了之后就可以通过windows的远程桌面进入了。 2.配置web服务环境。 进入/etc/lighttpd/lighttpd.conf修改配置文件,把根目录改为/var/www/owncloud 开启SSL: 在/etc/lighttpd目录下新建一个ssl文件夹并用openssl生成一个证书: cd /etc/lighttpd/ sudo mkdir ssl sudo openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes (server.pem的文件名可以自定义,这个证书的有效期为1年。生成过程要填一些信息,随意即可。sudo chmod 400 server.pem给文件加权限) 接着修改SSL配置文件: sudo nano /etc/lighttpd/conf-available/10-ssl.conf 修改为以下内容: $SERVER["socket"] == ":443" { ssl.engine = "enable" ssl.pemfile = "/etc/lighttpd/ssl/server.pem" server.name = "server" server.document-root = "/var/www/owncloud" ssl.cipher-list = "ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH:!AESGCM" ssl.honor-cipher-order = "enable" } 之后执行以下命令启用和重启web服务即可。 sudo lighttpd-enable-mod ssl sudo systemctl restart lighttpd.service (在SSH模式下可以不加sudo,因为已经是root权限了。但在远程桌面模式下要加,不然有时会权限不够。) 3.之后登录配置好owncloud即可使用,下载电脑手机客户端开始使用。 还有个外网访问的问题,依然是使用frp软件。这里注意,frp的服务端和客户端的版本要对应,不然会连接不上。记得给frpc文件777权限。 设置frp开机自启:在/etc/rc.local中exit 0之前加入代码:cd /root/frp/ && ./frpc -c frpc.ini & 为了安全考虑,frp中只配置了443端口的外网访问。也就是通过外网只能以https访问,http无法连接。局域网内都可以使用。 补充: 修改owncloud的登录页背景图:owncloud\core\img\background.jpg 修改网页标题和底部标语:owncloud\lib\private\legacy\defaults.php 遇到文件无法删除被锁定的情况,进入phpmyadmin,执行以下命令: DELETE FROM oc_file_locks WHERE 1 php7.0遇到提示无法访问 /dev/urandom,在php.ini中open_basedir=.:/tmp/:/dev/urandom