Arduino Uno Wind Speed Way 2

#include <math.h>
#include <millisDelay.h>

#define windSensorPin 2
millisDelay timerDelay;

int windCounter = 0;
float windSpeedM = 0;
float windSpeedK = 0;
int windPulse = 0;
int pulses = 0;
int startTest = 1;
int windTest1 = 1;
int windTest2 = 0;
int windTimer = 1;
int result = 1;

int timerStart = 1;

void setup() {
// Set console baud rate
Serial.begin(19200);
pinMode(windSensorPin, OUTPUT);
// pinMode(RainPin, OUTPUT);
// pinMode(windDirectionPin, INPUT);
delay(10);

}

void loop() {
if (digitalRead(windSensorPin) < 1 && startTest == 1 )
{
// windDirValue = analogRead(windDirectionPin);
// windDir = map(windDirValue, 1, 1024, 1, 5000);
windTest1 = 1;
windTest2 = 1;
windTimer = 1;
result = 1;
startTest = 0;
}
WindSpeed();
if (digitalRead(windSensorPin) < 1 && timerStart == 1)
{
timerDelay.start(3000);
result = 1;
timerStart = 0;
}
if (timerDelay.justFinished() && result == 1)
{
windSpeedM = 1.25 * (pulses/3);
windSpeedK = windSpeedM * 1.60934;
Serial.print(“WindSpeed: “);
Serial.print(windSpeedM);
Serial.print(” mph tt”);
Serial.print(windSpeedK);
Serial.println(” kphtt”);

// Blynk.virtualWrite(V2,windSpeed);
pulses = 0;
windSpeedM = 0;
startTest = 1;
result = 0;
timerStart = 1;

}

}
void WindSpeed()
{
if (digitalRead(windSensorPin) < 1)
{
windCounter++;
}
if (windCounter > 0 && digitalRead(windSensorPin) == 1 && windTest1 == 1)
{
windPulse += 1;
windCounter = 0;

}

if (windPulse == 3 && windTest2 == 1)
{
pulses += 2;
//Serial.println(pulses);
windPulse = 0;
}

}

ref:https://community.createlabz.com/knowledgebase/mini-weather-station-rain-gauge-wind-speed-wind-direction-using-blynk-and-sim800c/

Arduino Uno Wind Speed Way 1

#include “TimerOne.h” // Timer Interrupt set to 2 second for read sensors
#include <math.h>
#include <Time.h>

// speed ok near speed-3.ino

#define WindSensorPin (2) // The pin location of the anemometer sensor
char wind[10]; //empty array where to put the numbers going to the master

int LastValue;
//int wind = 0;
volatile bool IsSampleRequired; // this is set true every 2.5s. Get wind speed
volatile unsigned int TimerCount; // used to determine 2.5sec timer count
volatile unsigned long Rotations; // cup rotation counter used in interrupt routine
volatile unsigned long ContactBounceTime; // Timer to avoid contact bounce in interrupt routine
float WindSpeed; // speed miles per hour
byte x = 0;

void setup() {
Serial.begin(19200);
pinMode(WindSensorPin, INPUT);
attachInterrupt(digitalPinToInterrupt(WindSensorPin), isr_rotation, FALLING);
Serial.println(“Davis Anemometer Test”);
Serial.println(“Speed (MPH)tKnotstDirectiontStrength”);
Timer1.initialize(500000);
Timer1.attachInterrupt(isr_timer);

}

void loop() {
if(IsSampleRequired)
{
// convert to mp/h using the formula V=P(2.25/T)
// V = P(2.25/2.5) = P * 0.9
WindSpeed = Rotations * 0.48;

Rotations = 0; // Reset count for next sample
// wind = WindSpeed;

IsSampleRequired = false;

Serial.print(WindSpeed); Serial.println(“tt”);
// Serial.print(getKnots(WindSpeed)); Serial.print(“t”);
// Serial.print(CalDirection);
// getHeading(CalDirection); Serial.print(“tt”);
// getWindStrength(WindSpeed);

}
}
void isr_timer() {

TimerCount++;

if(TimerCount == 5)
{
IsSampleRequired = true;
TimerCount = 0;
}
}
void isr_rotation () {

if ((millis() – ContactBounceTime) > 15 ) { // debounce the switch contact.
Rotations++;
ContactBounceTime = millis();
}

ref:http://cmfc-weatherstation.blogspot.com/2016/

install DHT Raspbian 10

ทำการ update และ upgrade Raspbian

sudo apt-get update
sudo apt-get upgrade
download libray DHT โดยใช้ของ adafruit
git clone https://github.com/adafruit/Adafruit_Python_DHT.git
เข้า ไปใน folder เพื่อติดตั้ง library
cd Adafruit_Python_DHT
ติดตั้ง Library DHT ด้วยคำสั่ง
sudo python3 setup.py install
ทดลองเข้า folder เพื่อทดสอบการทำงาน
cd examples
sudo ./AdafruitDHT.py 11 8

ModuleNotFoundError: No module named ‘Adafruit_DHT’

ModuleNotFoundError: No module named ‘Adafruit_DHT’
เพราะใน Raspbian ล่าสุดเป็น python3 จึงต้องติดตั้งแบบ python3

ใช้คำสั่ง
sudo python3 setup.py install

Raspberry PI DHT Thingspeak Python3

import Adafruit_DHT

from time import time, sleep

from urllib.request import urlopen

import sys

WRITE_API = “Your ThingSpeak Write API” # Replace your ThingSpeak API key here

BASE_URL = “https://api.thingspeak.com/update?api_key={}”.format(WRITE_API)

SENSOR_PIN = 8 #GPIO 8

SENSOR_TYPE = Adafruit_DHT.DHT11

SensorPrevSec = 0

SensorInterval = 2 # 2 seconds

ThingSpeakPrevSec = 0

ThingSpeakInterval = 120 # 120 seconds

try:

    while True:     

        if time() – SensorPrevSec > SensorInterval:

            SensorPrevSec = time()

            humidity, temperature = Adafruit_DHT.read_retry(SENSOR_TYPE, SENSOR_PIN)

            print(“Humidity = {:.2f}%\tTemperature = {:.2f}C”.format(humidity, temperature))

           if time() – ThingSpeakPrevSec > ThingSpeakInterval:

                  ThingSpeakPrevSec = time()

                  thingspeakHttp = BASE_URL + “&field1={:.2f}&field2={:.2f}”.format(temperature, humidity)

                 print(thingspeakHttp)

                 conn = urlopen(thingspeakHttp)

                 print(“Response: {}”.format(conn.read()))

            conn.close()

            sleep(10)

   except KeyboardInterrupt:

    conn.close()

modify from:https://tutorial.cytron.io/2019/10/16/send-sensors-data-to-thingspeak-using-raspberry-pi/

Raspberry Pi DHT11 DHT22 Temperature and Humidity Sensor Python

sudo pip3 install Adafruit_DHT


แบบที่ 1 

#!/usr/bin/python
import sys
import Adafruit_DHT
while True:
humidity, temperature = Adafruit_DHT.read_retry(11, 8) #DHT11
# humidity, temperature = Adafruit_DHT.read_retry(22, 8) #DHT22
if humidity is not None and temperature is not None:
print (‘Temp={0:0.1f}*C Humidity={1:0.1f} %’.format(temperature, humidity))
else:
print (‘Failed to get reading. Try again!’)

แบบที่ 2

#!/usr/bin/python
import sys
import Adafruit_DHT
import time
sensor=Adafruit_DHT.DHT11 # ใส่อุปกรณ์ที่ใช้ในที่นี้คือ DHT11
#sensor=Adafruit_DHT.DHT22
pin=8 # PIN ของ GPIO ที่เชื่อมต่อกับ DHT
while True:
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
print(‘Temp: {0:0.1f} C Humidity: {1:0.1f} %’.format(temperature, humidity))
else:
print(“Sensor Failure. Check wiring.”);
time.sleep(1);

QuasarARM การกลับมาแก้ตัวอีกครั้ง #8

วันนี้ได้ R35 ขนาด 100 โอห์ม 0805 มาต่อแล้ว ทดลองจ่ายไฟ โลกก็สว่างขึ้นทันที

เท่านี้ก็สุขใจ ระหว่างรอ อุปกรณ์ที่เหลือทยอยมา หาเวลาประกอบอีก board ดู

QuasarARM การกลับมาแก้ตัวอีกครั้ง #7

วันนี้ได้ลองบัดกรี switch powerแและ menu ไล้ตะกั่ว ที่จุด switch UP DOWN LEFT RIGHT OK ครบ พอต่อไฟ กด POWER ก็ทำงาน กด MENU ก็แสดงได้ ยูเรก้าอีกครั้ง เอาสายไฟมาจิ้มครงปุ่มก็เลื่อนได้ โอเคเลย เป้าหมายคือการไปปรับ BACKLIGHT ของ LCD ในเมนู   หาข้อมูลของตารางเมนู จนเจอหวิธีปรับความสว่่าง Backlight ลองตั้ง Level จน 99 ก็ยังไม่สว่าง มานั่งเดาว่าขา 12 ของ STM32 บัดกรีไม่ดีหรือเปล่าหว่า ไล่ไปพบว่า R35 100 โอห์ม 1206 ไม่ได้ใส่ไว้  กำลังสั่งมา  ว่างๆจะเอา 100 โอห์ม 0805 ใส่ไปแทนก่อน    

QuasarARM การกลับมาแก้ตัวอีกครั้ง #6

คราวก่อนเราใช้ไฟ 3.3V จาก USB TTL UART  คราวนี้จะบัดกรีอุปกรณ์เพิ่มเติม โดยตั้งใจจะจ่ายไฟ ด้วยตนเอง และเชื่อม LCD 16×2 สีฟ้า เพื่อดูการทำงาน และเป็นกำลังใจให้ตัวเอง บนหนทางอีกยาวไกล
  • บัดกรี  AMS1117-3.3 ตามแบบต้องใช้ LD1117S33 แต่อันนี้ถอดจากอันเดิมได้ เอามาก่อน ไม่ลืมบัดกรีสาย ต่อ ไปยัง LP2985-33 แค่นี้ CPU ก็ทำงานแล้ว
  • จุดหนึ่งใช้ AMS1117 5 โวลท์ ตามแบบต้องใช้ LD1117S50 ของที่เพิ่งซื้อมายังงี้ แทนกันได้  จ่ายไฟให้กับ LCD มี VR10k อีก 1 ตัว
  • บัดกรี Resistor Capacitor และ Transistor BC846 องค์ประกอบให้ LCD ทำงาน
  • บัดกรี FM IC KT0803L  ส่วนนี้เกือบครบขาด L 1uH กับ Transistor 2SC3356
  • บัดกรี  MC34119
  • บัดกรี 24C08
มาดูที่ board  ต้องใช้ connector แบบยาว เอา LCD มาเชื่อม ลืมซื้ออุปกรณ์ ไม่มี ต้องโมดิฟายอุปกรณ์เอา เสียเวลามาก เชื่อมสายไฟเข้าก่อน AMS ทั้งคู่ต่อ power supply ตั้งไฟ 6V พอพร้อมแล้วจ่ายไฟ พบว่า LED สีฟ้า Diag แว๊บขึ้นมา มองจอ LCD เหมือนมีอะไรแว๊บ แต่มองไม่เห็นจอมืดมาก ลองปรับ VR10k พบตัวอักษร ขึ้นมารางๆ แสดงว่า ทำงานก็ดีใจ   แต่ก็สงสัยว่าทำไม LCD ไม่สว่างเลย  แม่บ้านให้ลูกมาตามไปนอนแล้ววันนี้คงพอแค่นี้ก่อน มีโอกาสพรุ่งนี้จะหาวิธีทำให้ LCD สว่างและทดสอบการทำงานของปุ่มต่างๆ รวมทั้งสั่งซื้ออุปกรณ์ที่เหลือให้ครบ นี่ยังไม่รวม การพัน Searchcoil คอยที่ยังต้องใช้เวลาศึกษาอีกนานสักระยะหนึ่ง  

QuasarARM การกลับมาแก้ตัวอีกครั้ง #5

วันนี้พอมีเวลา ก็ทำการทดลองการ upload  Firmware โดย Download มาจาก https://fandy.ucoz.org/publ/metalloiskatel_quot_kvazar_quot_quot_quasar_quot/metalloiskatel_quot_quasar_arm_quot/2-1-0-5  โดยใช้ Download Firmware รุ่น 2.6.3M ส่วนอุปกรณ์การอัพโหลด ได้ซื้อ FT232 USB to TTL UART มาไว้นานแล้ว และใช้ซอฟต์แวร์ upload ของ STMicroelectronics คือ STM32 Flash loader demonstrator (FLASHER-STM32) https://www.st.com/en/development-tools/flasher-stm32.html ความเข้าใจเดิมคือต้องupload ผ่าน ST-Link V2 ผ่านทาง Single wire interface module (SWIM) ผ่านทางขา NRST SWDCLK SWDIO GND VCC แต่ดูตัวอย่างจากเว็บ youtube ที่มีคนอัพโหลดเฟิร์มแวร์ที่ QuasarARM อุปกรณ์ที่สำเร็จมาแล้ว ก็ผ่าน TTL UART ในการ Upload ครั้งนี้ ใช้
  • ไฟ VCC 3.3V ของ UART บัดกรีขั้วมาลงบอร์ด
  •  GND จาก  UART กับ GND ของ board
  • เชื่อม TX ฝั่ง UART  เข้ากับ RX ของ board
  •  RX ฝั่ง UART เข้ากับ TX ของ board
จากนั้นเสียบ USB TTL เข้ากับคอม  Device Manager แสดง COM5 มาวัดไฟเข้าก็ 3.3V โอเค พร้อม โปรแกรม STM32 Flash loader demonstrator  ระบบแสดง COM5 อัตโนมัติ ปรับ speed จาก 115200 เป็น 9600 เอาแบบช้าแต่ชัวร์ 🙂 กด Next ถ้าระบบเชื่อมกัน จะผ่านไปเมนูถัดไป พอกดปุ่ม โปรแกรมค้างทันที แล้วขึ้น ข้อความ No response from the target,the Boot loader can not be started. Please, verify the boot mode configuration and the flash protection status, Reset your device then try again… ข้อความนี้เห็นมาเยอะมากแล้วใน board เดิม แสดงว่า อุปกรณ์ไม่เชื่อมกัน cpu ไม่ทำงาน ไม่ได้ตั้ง boot mode  แต่นี่เป็น board ใหม่ มีคนทำสำเร็จ YouTube แสดงว่า ต้องมีอะไรผิดพลาด ต้องตรวจสอบอีกครั้ง พบว่า ไม่ได้ต่อไฟ 3.3V อีกจุด จาก IC LP2985-33 เนื่องจาก สั่งของแล้วยังไม่มา จึงต่อสายไฟ เชื่อม 3.3V มาเข้าอีกจุด คราวนี้ลองย้อนการทำงานใหม่ พอกด Next จอก็ขึ้น ยูเรก้า ผ่านแล้ว เท่าที่ดูใน youtube มาจุดนี้นี่สำเร็จไปค่อนนึงแล้ว กด Next จากนั้นกด Next ใส่ชื่อไฟล์ ที่upload ลงไป ผมใช้ QuasarARM_261M.hex จากนั้นกด Next ขั้นตอน load ไปเรื่อยๆ จน upload เสร็จ ยูเรกา อีกครั้ง