2018年1月5日 星期五

moodle_at_xmapp_windows更新與搬家紀錄

windows系統下moodle搬家要用到的相關資料
由於檔案很大,所以很難搬,PHP也更新成新版了,舊的方法資料夾檔案硬搬會失敗

第一個是想把外掛都搬過去,所以先重新命名xampp/apps/htdocs資料夾變成htdocs_1
複製了原來moodle的xampp/apps/htdocs資料夾去相同位置,打開新moodle就開始下載更新,然後就完成了(可喜可賀...)

接著就進行緩慢的搬家過程,搬家時由於匯入檔案只要超過某個大小,就會匯不進去,查了資料發現是這些問題
Moodle作業上傳檔案大小設定
PHP, MySQL參數設定參考網頁

改完就可以上傳很大很大的檔案,也變得比較快了(似乎彷彿...)

課程備份的方式是在課程頁面/系統管理/課程管理/備份 把檔案下載下來再打包就OK了

不過要把所有課程掛回去好像是非常非常緩慢的過程,畢竟有些檔案有點大(200mb以上,9mb的大概要搬20分鐘....),可能是部分有放影片檔,把影片檔刪掉應該就沒問題了。

-----------------------------
php.ini
要修改的包括以下幾項
max_execution_time
max_input_time
memory_limit
post_max_size
upload_max_filesize
default_socket_timeout
mysql.connect_timeout

2017年12月13日 星期三

arduino溫濕度計輸出LCD(四) 雙偵測器顯示

一個DHT11可以,那是否可以設定兩個以上的溫濕度計呢?
看到有人問這個問題,不過我google不到成品,那就自己設計看看
反正應該不難,就是給他貼兩倍就對了
在#define這邊增加一個 DHT2PIN 4 ,設定是pin4,所以第一個DHT插pin2,第二個插pin4
增加DHT dht2(DHT2PIN, DHTTYPE); 其實我也不知道這個在幹嘛,不過總覺得要增加

這部分增加一組可以存數據的h2、t2、f2(其實f是華氏溫度根本也沒用到其實可以刪...)
  //第二個sensor
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h2 = dht2.readHumidity();
  // Read temperature as Celsius (the default)
  float t2 = dht2.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f2 = dht2.readTemperature(true);

這一段我看不懂也不知道怎麼改,於是我沒複製兩份
  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

然後覺得跑出來的數字有小數點,但是這個DHT11根本無法測量小數點差異,於是加了int()將讀到的數字取整數(這個部分如果沒問小P老師我找半天找不到...)

  lcd.print(int(h));  //int(h)取h的整數
  lcd.print("% ");

以下是修改後的程式碼,應該可以順利運作才是,而且拔除其中一個還能顯示!error!,完成這個雙溫濕度計偵測器的方案。不過DHT11感覺在濕度不是很精準,我買了很多個每個插上去數值都不太一樣,可能還是需要校正或是注意一下。
成品長這樣




// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include "DHT.h"

#define DHTPIN 2     // what digital pin we're connected to
#define DHT2PIN 4    // what digital2 pin we're connected to

// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// 設定 LCD I2C 位址
//LED_Fundino紅色板子用
//LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
//LED_MH黑色板子用
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

DHT dht(DHTPIN, DHTTYPE);
DHT dht2(DHT2PIN, DHTTYPE);

void setup() {
  // 初始化 LCD,一行 16 的字元,共 2 行,預設開啟背光
  lcd.begin(16, 2);
  //
  Serial.begin(9600);
  dht.begin();
  // 閃爍兩次
  for (int i = 0; i < 1; i++) {
    lcd.backlight(); // 開啟背光
    delay(250);
    lcd.noBacklight(); // 關閉背光
    delay(250);
  }
  lcd.backlight();

  // 輸出初始化文字
  lcd.setCursor(0, 0); // 設定游標位置在第一行行首
  lcd.print("Hello, Maker!");
  delay(500);
  lcd.setCursor(0, 1); // 設定游標位置在第二行行首
  lcd.print("thermometer*2");
  delay(1000);
  lcd.clear(); //顯示清除
}
void loop() {
  // Wait a few seconds between measurements.
  delay(100);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  //第二個sensor
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h2 = dht2.readHumidity();
  // Read temperature as Celsius (the default)
  float t2 = dht2.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f2 = dht2.readTemperature(true);

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  lcd.setCursor(0, 0); // 設定游標位置在第一行行首
  lcd.print("sensor1 sensor2");
  lcd.setCursor(0, 1); // 設定游標位置在第二行行首
   
  // 如果拔除sensor1出現error
  if (isnan(h) || isnan(t) || isnan(f)) {
    lcd.print("!error!");
    return;
  }
  lcd.print(int(h));  //int(h)取h的整數
  lcd.print("% ");
  lcd.print(int(t));
  lcd.print("C ");
  
  // 如果拔除sensor2出現error
  if (isnan(h2) || isnan(t2) || isnan(f2)) {
    lcd.print("!error!");
    return;
  }
  lcd.print(int(h2));
  lcd.print("% ");
  lcd.print(int(t2));
  lcd.print("C");
}

arduino溫濕度計輸出LCD(三) 溫濕度計數據顯示於LCD

接下來要整合兩個文章,就可以將DHT11溫濕度計讀到的數據傳給LCD
首先要知道溫濕度計裡的程式碼代表的意思
Serial.print()  是把數據傳給電腦
lcd.print() 就是把數據傳給LCD
lcd.print("%   "); 這個是印出"雙引號中的文字",僅限於英數與符號

這樣我們就可以結合兩個程式讓數據輸出到LCD了,以下是我修改後的程式碼


#include "DHT.h"
#define DHTPIN 2     // what digital pin we're connected to

// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// 設定 LCD I2C 位址
//LED_Fundino紅色PCF8574T板子用
//LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
//LED_MH黑色PCF8574A1板子用
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  // 初始化 LCD,一行 16 的字元,共 2 行,預設開啟背光
  lcd.begin(16, 2);
  //
  Serial.begin(9600);
  dht.begin();
  // 閃爍兩次
  for (int i = 0; i < 1; i++) {
    lcd.backlight(); // 開啟背光
    delay(250);
    lcd.noBacklight(); // 關閉背光
    delay(250);
  }
  lcd.backlight();

  // 輸出初始化文字
  lcd.setCursor(0, 0); // 設定游標位置在第一行行首
  lcd.print("Hello, Maker!");
  delay(500);
  lcd.setCursor(0, 1); // 設定游標位置在第二行行首
  lcd.print("thermometer");
  delay(1000);
  lcd.clear(); //顯示清除
}
void loop() {
  // Wait a few seconds between measurements.
  delay(100);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);
  lcd.setCursor(0, 0); // 設定游標位置在第一行行首
  lcd.print("Humidity Temp.");
  lcd.setCursor(0, 1); // 設定游標位置在第二行行首
   
  // 如果拔除sensor1出現error
  if (isnan(h) || isnan(t) || isnan(f)) {
    lcd.print("!error!");
    return;
  }
  lcd.print(h);  //int(h)取h的整數
  lcd.print("%   ");
  lcd.print(t);
  lcd.print("C ");
}


這樣就可以做出一個簡單的溫濕度計並且顯示在LCD螢幕上了
如果插上行動電源就可以帶著走完全沒問題。


arduino溫濕度計輸出LCD(二) LCD顯示Hello World!

LCD輸出真得很折騰...
試了很多次無法成功,因為不同廠牌的I2C程式碼有點不同,可能要注意

一樣丟關鍵字餵狗"LCD arduino"
【自造學堂】Arduino如何透過I2C控制LCD模組
Arduino 使用 1602 IIC(I2C) LCD 點陣液晶模組   (這個文章的輸入部份我試不出來)

先按圖索驥接好裝置

開啟arduino程式→草稿碼→匯入程式庫→管理程式庫搜尋"newliquidcrystal" →選第一個"Newliquidcrystal_1.3.5"→ 安裝

根據第一篇文章修改成以下樣子,上傳到板子就可以了

// Arduino IDE 內建
#include <Wire.h>
// LCD I2C Library,從這裡可以下載:
// https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
#include <LiquidCrystal_I2C.h>

// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
// 設定 LCD I2C 位址,兩種不同晶片有不同設定方式,如果第一個不行請改第二個
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
//LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

void setup() {
  // 初始化 LCD,一行 16 的字元,共 2 行,預設開啟背光
  lcd.begin(16, 2);
  // 閃爍三次
  for(int i = 0; i < 3; i++) {
  lcd.backlight(); // 開啟背光
  delay(250);
  lcd.noBacklight(); // 關閉背光
  delay(250);
  }
  lcd.backlight();
  // 輸出初始化文字
  // 設定游標位置在第一行行首
  lcd.setCursor(0, 0);
  lcd.print("LCDtest");
  delay(1000);
  // 設定游標位置在第二行行首
  lcd.setCursor(0, 1);
  lcd.print("Hello, World!");
  delay(6000);
  // 顯示清除
  lcd.clear();
}

void loop() {
  // 設定游標位置在第一行行首
  lcd.setCursor(0, 0);
  lcd.print("count");
  // 設定游標位置在第二行行首
  lcd.setCursor(0, 1);
  lcd.print(millis()/1000);
}



注意這兩行,會根據板子要設定成不一樣的程式
// 設定 LCD I2C 位址,兩種不同晶片有不同設定方式,如果第一個不行請改第二個
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
//LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
我買的兩塊板子就有不同

上面那塊要設定成LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
下面那塊要設定成LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
如果設定錯誤還是可以上傳到板子,不過LCD完全沒有反應,所以可能在這邊要注意一下。

2017年12月12日 星期二

arduino溫濕度計輸出LCD(一)電腦上輸出DHT11溫濕度計數據

這次終於有心想突破:溫濕度數據顯示於LCD 這件事情
以下是我的學習記錄,這文章會記錄從無到有的學習歷程,所以可能會比較繁瑣,不過我想詳細的記錄自己搜尋資料、解決問題、運算思維等後設認知部分,以利未來學習其他流程時也能簡化成這個學習模組。

我想要攻克的任務流程如下,如果想跳到結果得可以選擇以下文章
(一) 電腦上輸出DHT11溫濕度計數據
(四) 雙偵測器顯示,修改成自己喜歡的顯示模式

首先先蒐集資料,發現我的溫濕度計是DHT11
於是丟"dht11 arduino"進去餵google,找到這些文章

Arduino範例19:利用DHT11抓取溫度和濕度

知道要將DHT11的+接5V,-接GND,out接D2腳位

開啟arduino程式草稿碼匯入程式庫管理程式庫


 搜尋"DHT11"選第一個"DHT sensor liberary"安裝
安裝完才可以開始寫程式

第一個可以運行的程式長這樣

// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include "DHT.h"

#define DHTPIN 2     // what digital pin we're connected to

// Uncomment whatever type you're using!這裡可以改成不同的DHT偵測器
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println("DHTxx test!");

  dht.begin();
}

void loop() {
  // Wait a few seconds between measurements.等待時間,越短讀取數據越快,但DHT11儀器有極限值
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!抓取溫濕度計的數據,存入h,t,f三個數值裡面
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).檢察是否錯誤的程式碼
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  // Compute heat index in Fahrenheit (the default)這邊看不懂...
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  //輸出給電腦以下資訊
  Serial.print("濕度: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("溫度: ");
  Serial.print(t);
  Serial.print(" oC   ");
  Serial.print(f);
  Serial.println(" oF\t");
}

成功之後就可以讀出這樣的數據了


如果出現錯誤訊息,無法灌給arduino板子的話,我除錯的方法有1.重插板子2.重新安裝DHT sensor liberary,這樣就突破第一關了。

2017年9月14日 星期四

關於高中職升學的建議-戰略、戰術與戰法

關於高中職升學的建議

恭喜你進入國三階段,今年最重要的事情是面對人生中第一次的大考,而考試本身的重點不僅是在於考多少分數,更重要的是培養:如何面對不能逃避的戰爭的能力,這些能力包含心態、作息、方法與後設認知(知道自己怎麼知道的認知),這些能力是會跟著你一輩子的,而這次升學也會決定你人生的某個方向。

對國中生而言,你從小到大的生活圈可能不會超過2公里,你的同學也大多是從他們的2公里生活圈過來的,不過升上高中職之後,你的同學可能就是以縣市為單位,集合到這所學校,所以你可能會遇到不同生活形態與文化的衝擊,高中職會匯集讀書能力接近、智力智商接近,甚至於社經地位接近的同縣市同學,這對你未來發展中一定具有很大影響力的,這生活圈的範圍可能擴展到大約10公里。
而高中職的下一步:大學科大,就會從全台灣集中到你的學校,你會看到更多元的樣態,這些具有不同人生經歷的同儕,會型塑出不一樣的文化與環境,直接的影響你人生未來與心態。
大抵上來說,人生的精采與豐富的程度,跟他能夠觸及的生活圈有很大關係,雖然現在網路或書籍資源有漸漸迎向一個沒有界線的生活圈,但其實多數人還是畫地自限在一個小範圍內,這對於生命而言是非常可惜的一件事情,請好好的拓展你的生活界線與視野,在未來能夠展翅高飛。這就是為什麼要打好這一仗的關係。

而我們將面對考試這件事情分成三個層面:戰略、戰術與戰法
「戰略」就是為誰而戰,為何而戰,你的目的與願景是什麼?
高中職升學考試對於一個國中生而言,可能是為了自己更美好的未來、為了尋求知識能力同溫層的未來同儕、為了父母師長念書、為了光宗耀祖、為了跟喜歡的人念同一所學校、為了高中職校風校服的夢幻泡泡、為了不想輸等等……
如果你能知道自己為了什麼要念書,應該要趁這次機會培養怎樣的能力,這樣你就可以時常用這個原因堅定自己的腳步,也就是所謂的:莫忘初衷。

立定了方向後,你必須開始規劃需要做的事情,也就是行事曆與課表,這就是所謂的「戰術」層面。
把國中三年的課本疊起來吧!你會發現國中課本只有5*6學期=30本,而且這30本書其實不會很厚,內容其實也不多,所以不要擔心,你一定可以完成的。
請記得:計畫總是趕不及變化,但沒有計畫就一事無成。計畫是用來落後的,心態是用來調整的。知道死線deadline,才能更主動的推動自己。
在安排課表的時候,有個重要的觀念要提醒你,最重要的課表內容是:玩樂、休息、空白與運動的時間,請一定記得放在你的課表之中。
課表是以一周七天、每個小時為單位,一到五大概有10-15個小時可以運用,三上可能還用不到星期日這天,星期天就好好休息吧,100天左右在考慮規劃周日課表,下面是簡單的課表形式。


































午休


































19:00-20:00







20:00-21:00







21:00-22:00







當你確實按表操課,你的長輩家人也會更尊重你的安排與信任你的能力,要展現自己的決心與規劃,才有本錢不受他人耳語的撩擾。當他人說:為什麼你現在不去看書,你只要堅定地回答:這個小時是我休息玩樂的時間即可。
空白時間可以用來捕這周的不足,讓你趕不上的計畫有緩衝的餘地(無論是課程進度或是心情都可以緩衝)。這個星期哪個科目沒有達標呢?我的心情狀況如何呢?有沒有需要調整的地方?都可以運用這個空白時間來規劃調整。
運動與規律的作息有助於記憶與學習,每周安排至少3個小時的運動,讓身體流汗,把壓力跟負擔通通排掉,至少需要睡眠6小時以上(其實最好是7小時),睡覺是大腦清除無用垃圾、將短期記憶轉換成長期記憶的重要時刻,甚至於做夢可以有跨腦區的連結,啟發你的創意思考,這些讓身體更健康的作為,絕對也會讓你的成績正向的發展,作戰時最忌諱拖延,請確實地按表操課,一年下來,你一定可以學到新的技能,也能更肯定自己有能力可以做好面對未來挑戰的能力,請把這次的大考當作人生的第一戰,然後凱旋歸來吧!


「戰法」部分,就是各科面對的不同方式與解題技巧,這部分留給下回「讀書心法篇」分曉吧。