Mundarija:
- 1 -qadam: 1 -qadam: O'chirish davri
- 2 -qadam: 2 -qadam: Kodni yozing
- 3 -qadam: 3 -qadam: Abajur sotib oling
- 4 -qadam: 4 -qadam: Hammasini birga torting
- 5 -qadam: 5 -qadam: O'yin kartalarini yaratish
Video: Haqiqiy qiyinchilik: 5 qadam
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:24
Zamonaviy dunyo odamlardan jismoniy muhitdan chiqib, raqamli muhitda yashashni talab qiladi.
Alning paydo bo'lishi va texnologiyaning tarqalishi bilan odamlar mashinaga haddan tashqari ishonishadi va uni har doim to'g'ri deb hisoblaydilar.
"Haqiqatan ham" soxta yolg'onni aniqlash testini yaratish orqali bu noto'g'ri ishonchni yo'qotishga mo'ljallangan. Odamlar haqiqatan ham ishlayotganiga osonlikcha ishonishadi, lekin noto'g'ri javoblar berilsa, bu ularning texnologiyaga bo'lgan ishonchini yo'qotadi.
1 -qadam: 1 -qadam: O'chirish davri
Chunki mening asarlarimda faqat bitta yorug'lik bor, shuning uchun lehimlash juda oson. Asosiy muammo boshida, men ikkita nurni lehimlayman, lekin men ekspozitsiya qismini darhol qoplamadim. Shunday qilib, ikkita sim bir -biriga tegganda. Qisqa.
2 -qadam: 2 -qadam: Kodni yozing
p.p1 {marj: 0.0px 0.0px 0.0px 0.0px; chiziq balandligi: 15,0 piksel; shrift: 12.0px marta; rang: #000000; fon rangi: #ffffff}
p.p2 {marj: 0.0px 0.0px 0.0px 0.0px; chiziq balandligi: 15,0 piksel; shrift: 12.0px marta; rang: #000000; fon rangi: #ffffff; min balandligi: 14.0px} span.s1 {shrift-kerning: yo'q}
2 -qadam: Kodni yozing
/*********************************************************************
Bu nRF52 asosidagi Bluefruit LE modullarimiz uchun namuna
Adafruit do'konida bugun birini oling!
Adafruit bu ochiq kodli kodni taqdim etadigan vaqt va resurslarni sarflaydi.
Iltimos, Adafruit va ochiq manbali uskunalarni sotib oling
Adafruit mahsulotlari!
MIT litsenziyasi, qo'shimcha ma'lumot olish uchun Litsenziyani tekshiring
Yuqoridagi barcha matnlar va pastdagi ekran ochilishi kerak
har qanday qayta taqsimlash
*********************************************************************
/ Ushbu eskiz NeoPixel boshqaruvida ishlatilishi mo'ljallangan
// yuzasi Adafruit Bluefruit LE Connect mobil ilovasida.
/
/ - Ushbu eskizni kompilyatsiya qiling va nRF52 Feather -ga o'chiring
// - Bluefruit LE Connect ilovasini oching
// - NeoPixel yordam dasturiga o'tish
// - Aloqa o'rnatish uchun "ulanish" tugmasini bosing
// piksellar joylashuvi haqidagi meta-ma'lumotlarni yuborish
// - qurilmangizdagi piksellarni yangilash uchun NeoPixel yordam dasturidan foydalaning
/* DIQQAT: Bu eskizga Adafruit_Neopixel -ning kamida 1.1.0 versiyasi kerak edi !!! */
#qo'shing
#qo'shing
#qo'shing
#define NEOPIXEL_VERSION_STRING "Neopixel v2.0"
#define PIN 16 / * NeoPixels haydash uchun ishlatiladigan pin * /
#MAXCOMPONENTS ni aniqlang 4
uint8_t *pixelBuffer = NULL;
uint8_t kengligi = 0;
uint8_t balandligi = 0;
uint8_t qadam;
uint8_t komponentlariValue;
bool - 400 Gts;
uint8_t komponentlari = 3; // faqat 3 va 4 - haqiqiy qiymatlar
Adafruit_NeoPixel neopixel = Adafruit_NeoPixel ();
// BLE xizmati
BLEDfu bledfu;
BLEDis bledis;
BLEUart bleuart;
bo'sh o'rnatish ()
{
Serial.begin (115200);
while (! Seriyali) kechikish (10); // mahalliy usb bilan nrf52840 uchun
Serial.println ("Adafruit Bluefruit Neopixel testi");
Serial.println ("--------------------------------");
Serial.println ();
Serial.println ("Iltimos, Bluefruit Connect LE ilovasi yordamida ulaning");
// Neopiksellarni sozlash
neopixel.begin ();
// Bluefruit -ni boshlang
Bluefruit.begin ();
Bluefruit.setTxPower (4); // Qo'llab -quvvatlanadigan qiymatlar uchun bluefruit.h -ni tekshiring
Bluefruit.setName ("Bluefruit52");
Bluefruit. Periph.setConnectCallback (connect_callback);
// OTA DFU izchil bo'lishi uchun, agar mavjud bo'lsa, birinchi navbatda qo'shilishi kerak
bledfu.begin ();
// Qurilma haqida ma'lumot xizmatini sozlash va ishga tushirish
bledis.setManufacturer ("Adafruit Industries");
bledis.setModel ("Bluefruit Feather52");
bledis.begin ();
// BLE UART xizmatini sozlash va ishga tushirish
bleuart.begin ();
// Reklama o'rnating va boshlang
startAdv ();
}
void startAdv (bekor)
{
// Reklama to'plami
Bluefruit. Advertising.addFlags (BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
Bluefruit. Advertising.addTxPower ();
// Bluart 128-bitli uuidni qo'shing
Bluefruit. Advertising.addService (bleuart);
// Ikkilamchi skanerlashga javob paketi (ixtiyoriy)
// Reklama paketida "Ism" uchun joy yo'qligi uchun
Bluefruit. ScanResponse.addName ();
/* Reklama berishni boshlang
* - Agar uzilgan bo'lsa, avtomatik reklamani yoqing
* - Interval: tez rejim = 20 ms, sekin rejim = 152,5 ms
* - Tez rejim uchun kutish vaqti - 30 soniya
* - Vaqt tugashi bilan boshlash (taymut) = 0 abadiy reklama qilinadi (ulanmaguncha)
*
* Tavsiya etilgan reklama oralig'i uchun
*
*/
Bluefruit. Advertising.restartOnDisconnect (rost);
Bluefruit. Advertising.setInterval (32, 244); // 0,625 milodiy birlikda
Bluefruit. Advertising.setFastTimeout (30); // tezkor rejimda soniya soni
Bluefruit. Advertising.start (0); // 0 = n soniyadan keyin reklamani to'xtatmang
}
void connect_callback (uint16_t conn_handle)
{
// Joriy ulanish haqida ma'lumot oling
BLEConnection* ulanishi = Bluefruit. Connection (conn_handle);
char central_name [32] = {0};
ulanish-> getPeerName (markaziy_ nomi, hajmi (markaziy_ nomi));
Serial.print ("Ulangan");
Serial.println (central_name);
Serial.println ("Iltimos," Neopixels "yorlig'ini tanlang," Ulanish "tugmasini bosing va dam oling");
}
bo'sh halqa ()
{
// Echo olingan ma'lumotlarni
agar (Bluefruit.connected () && bleuart.notifyEnabled ())
{
int buyrug'i = bleuart.read ();
almashtirish (buyruq) {
"V" holati: {// Versiyani oling
commandVersion ();
tanaffus;
}
"S" holati: {// O'rnatish o'lchovlari, komponentlari, qadam …
commandSetup ();
tanaffus;
}
"C" holati: {// Rang bilan tozalash
commandClearColor ();
tanaffus;
}
"B" holati: {// Yorqinlikni sozlash
commandSetBrightness ();
tanaffus;
}
"P" holati: {// Pixel -ni o'rnating
commandSetPixel ();
tanaffus;
}
case 'I': {// Yangi rasmni oling
commandImage ();
tanaffus;
}
}
}
}
void swapBuffers ()
{
uint8_t *base_addr = pixelBuffer;
int pixelIndex = 0;
uchun (int j = 0; j <balandlik; j ++)
{
uchun (int i = 0; i <kenglik; i ++) {
agar (komponentlar == 3) {
neopixel.setPixelColor (pixelIndex, neopixel. Color (*base_addr, *(base_addr+1), *(base_addr+2)));
}
boshqa {
neopixel.setPixelColor (pixelIndex, neopixel. Color (*base_addr, *(base_addr+1), *(base_addr+2), *(base_addr+3)));
}
base_addr+= komponentalar;
pixelIndex ++;
}
pixelIndex += qadam - kenglik; // PixelIndex -ni keyingi qatorga o'tkazing (qadamni hisobga oling)
}
neopixel.show ();
}
void commandVersion () {
Serial.println (F ("Buyruq: versiya tekshiruvi"));
sendResponse (NEOPIXEL_VERSION_STRING);
}
void commandSetup () {
Serial.println (F ("Buyruq: O'rnatish"));
kenglik = bleuart.read ();
balandlik = bleuart.read ();
qadam = bleuart.read ();
komponentlarValue = bleuart.read ();
is400Hz = bleuart.read ();
neoPixelType pixelType;
pixelType = komponentlarValue + (is400Hz? NEO_KHZ400: NEO_KHZ800);
komponentlar = (komponentlarValue == NEO_RGB || komponentlarValue == NEO_RBG || komponentlarValue == NEO_GRB || komponentlarValue == NEO_GBR || komponentlarValue == NEO_BRG || komponentlarValue == NEO_BGR)? 3: 4;
Serial.printf ("\ tsize: %dx %d / n", kenglik, balandlik);
Serial.printf ("\ tstride: %d / n", qadam);
Serial.printf ("\ tpixelType %d / n", pixelType);
Serial.printf ("\ tkomponentlari: %d / n", komponentlar);
agar (pixelBuffer! = NULL) {
o'chirish pixelBuffer;
}
uint32_t hajmi = kengligi*balandligi;
pixelBuffer = yangi uint8_t [hajmi*komponentlari];
neopixel.updateLength (hajmi);
neopixel.updateType (pixelType);
neopixel.setPin (PIN);
// Bajarildi
sendResponse ("OK");
}
void commandSetBrightness () {
Serial.println (F ("Buyruq: SetBrightness")));
// Qiymatni o'qing
uint8_t yorqinligi = bleuart.read ();
// Yorqinlikni o'rnating
neopixel.setBrightness (nashrida);
// Piksellarni yangilang
almashtirishBuffers ();
// Bajarildi
sendResponse ("OK");
}
void commandClearColor () {
Serial.println (F ("Buyruq: ClearColor"));
// Rangni o'qing
uint8_t rangi [MAXCOMPONENTS];
uchun (int j = 0; j <komponentlar;) {
agar (bleuart.available ()) {
rang [j] = bleuart.read ();
j ++;
}
}
// Barcha chiroqlarni rangga o'rnating
int hajmi = kenglik * balandlik;
uint8_t *base_addr = pixelBuffer;
uchun (int i = 0; i <o'lcham; i ++) {
uchun (int j = 0; j <komponentlar; j ++) {
*base_addr = rang [j];
base_addr ++;
}
}
// Buferlarni almashtirish
Serial.println (F ("ClearColor tugallandi"));
almashtirishBuffers ();
agar (komponentlar == 3) {
Serial.printf ("\ t aniq (%d, %d, %d) n", rang [0], rang [1], rang [2]);
}
boshqa {
Serial.printf ("\ t aniq (%d, %d, %d, %d) n", rang [0], rang [1], rang [2], rang [3]);
}
// Bajarildi
sendResponse ("OK");
}
void commandSetPixel () {
Serial.println (F ("Buyruq: SetPixel"));
// O'qish pozitsiyasi
uint8_t x = bleuart.read ();
uint8_t y = bleuart.read ();
// Ranglarni o'qing
uint32_t pixelOffset = y*kenglik+x;
uint32_t pixelDataOffset = pixelOffset*komponentlari;
uint8_t *base_addr = pixelBuffer+pixelDataOffset;
uchun (int j = 0; j <komponentlar;) {
agar (bleuart.available ()) {
*base_addr = bleuart.read ();
base_addr ++;
j ++;
}
}
// Ranglarni o'rnating
uint32_t neopixelIndex = y*qadam+x;
uint8_t *pixelBufferPointer = pixelBuffer + pixelDataOffset;
uint32_t rangi;
agar (komponentlar == 3) {
color = neopixel. Color (*pixelBufferPointer, *(pixelBufferPointer+1), *(pixelBufferPointer+2));
Serial.printf ("\ tcolor (%d, %d, %d) n", *pixelBufferPointer, *(pixelBufferPointer+1), *(pixelBufferPointer+2));
}
boshqa {
color = neopixel. Color (*pixelBufferPointer, *(pixelBufferPointer+1), *(pixelBufferPointer+2), *(pixelBufferPointer+3));
Serial.printf ("\ tcolor (%d, %d, %d, %d) n", *pixelBufferPointer, *(pixelBufferPointer+1), *(pixelBufferPointer+2), *(pixelBufferPointer+3));
}
neopixel.setPixelColor (neopixelIndex, rang);
neopixel.show ();
// Bajarildi
sendResponse ("OK");
}
void commandImage () {
Serial.printf ("Buyruq: %dx %d, %d, %d / n", kenglik, balandlik, komponentlar, qadam);
// Yangi pikselli buferni oling
int hajmi = kenglik * balandlik;
uint8_t *base_addr = pixelBuffer;
uchun (int i = 0; i <o'lcham; i ++) {
uchun (int j = 0; j <komponentlar;) {
agar (bleuart.available ()) {
*base_addr = bleuart.read ();
base_addr ++;
j ++;
}
}
/*
agar (komponentlar == 3) {
uint32_t indeksi = i*komponentlari;
Serial.printf ("\ tp %d (%d, %d, %d) n", i, pixelBuffer [indeks], pixelBuffer [indeks+1], pixelBuffer [indeks+2]);
}
*/
}
// Buferlarni almashtirish
Serial.println (F ("Rasm olingan"));
almashtirishBuffers ();
// Bajarildi
sendResponse ("OK");
}
void sendResponse (char const *javob) {
Serial.printf ("Javob yuborish: %s / n", javob);
bleuart.write (javob, strlen (javob)*sizeof (char));
}
3 -qadam: 3 -qadam: Abajur sotib oling
4 -qadam: 4 -qadam: Hammasini birga torting
Tavsiya:
NTP sinxronlash bilan haqiqiy ikkilik soat: 4 qadam
Haqiqiy ikkilik soat NTP sinxronlashi bilan: Haqiqiy ikkilik soat kunning vaqtini an'anaviy "ikkilik soat" dan farqli o'laroq, to'liq kunning ikkilik kasrlari yig'indisi sifatida ko'rsatadi. bu vaqtni soat/daqiqa/soniyaga mos keladigan ikkilik kodlangan o'nli raqamlar sifatida ko'rsatadi. An'anaviy
Havo - haqiqiy mobil havo gitara (prototip): 7 qadam (rasmlar bilan)
Havo - haqiqiy mobil havo gitarasi (prototip): Xo'sh, bu mening bolalik orzusiga yaqinlashishning birinchi qismi haqida juda qisqa ko'rsatma bo'ladi. Men bolaligimda har doim sevimli san'atkorlarim va guruhlarim gitara chalishni juda yaxshi ko'rardim. Men ulg'ayganimda, men
Haqiqiy vaqtda soat modulidan qanday foydalanish kerak (DS3231): 5 qadam
Haqiqiy vaqtda soat modulidan qanday foydalanish kerak (DS3231): DS3231-bu past haroratli, juda aniq I2C real vaqtda soat (RTC), haroratni kompensatsiyalangan kristalli osilator (TCXO) va kristalli. Qurilma batareya quvvatini o'z ichiga oladi va uning asosiy quvvati quvvat olganda vaqtni aniq saqlaydi
Renegade-i (Haqiqiy narsaga o'xshash dasturlashtiriladigan IC tester): 3 qadam (rasmlar bilan)
Renegade-i (Haqiqiy narsaga o'xshagan dasturlashtiriladigan IC Tester): MILLION DOLLAR ARZI. Siz hech qachon uyda o'z shaxsiy IC sinov qurilmangizga ega bo'lishni orzu qilganmisiz? Faqat ICni sinab ko'radigan gadjet emas, balki "dasturlashtiriladigan" mashina, o'zini semicon test sanoatining eng yirik futbolchilaridan biri kabi his qiladi, muvaffaqiyatli
Haqiqiy tugmachali simli parvoz uchun akril planshet stendi: 4 qadam
Haqiqiy tugmachali parvoz simlari uchun akril planshet stendi: bu parvoz simulyatori dasturidan foydalanish uchun planshet (masalan, iPad) uchun stend. Aylanadigan kodlovchi modullari va Arduino Mega -dan foydalanib, men simni maxsus asbob funktsiyalarini boshqarish uchun jismoniy tugmachalarni xaritaga solish mumkin bo'lgan echimni yaratdim. Siz kabi