الدرس 26 · الوحدة 12: إدارة استهلاك الطاقة وتحسين الكفاءة
المشروع الختامي: تطبيق أجهزة ذكية متكامل
من أول شاشةٍ إلى تطبيقٍ ذكيٍّ متكامل: المقرر كلّه في مشروع. ⏱ نحو 70 دقيقة.
بعد هذا الدرس ستستطيع أن:
- تبني تطبيق أجهزةٍ ذكية متكاملًا يجمع مهارات المقرر.
- تدمج التنقّل والمستشعرات والثيم والطاقة في بنيةٍ منظّمة.
- تطبّق معايير التسليم المستمدّة من نواتج المقرر.
١المقرر كلّه في تطبيق
نجمع ما تعلّمناه في تطبيقٍ واحد: «مساعد الميدان» — يعرض الموقع، ويتكيّف مع الإضاءة، ويرشّد الطاقة عند الحاجة، ويوفّر أداة ميزانٍ بالإمالة، كلّها عبر تبويبات.
٢التطبيق المتكامل
يدمج التبويبات + الموقع + الضوء (ثيم) + البطارية (توفير) + الإمالة (أداة الميزان). حرّك المستشعرات الأربعة:
import { useState } from 'react';import { View, Text, Pressable, StyleSheet } from 'react-native';import { useLocation, useBattery, useLight, useTilt } from 'smartdevice'; const TABS = [{ k: 'home', t: '🏠' }, { k: 'level', t: '📐' }, { k: 'power', t: '🔋' }]; export default function App() { const [tab, setTab] = useState('home'); const loc = useLocation(); const bat = useBattery(); const lux = useLight(); const dark = lux < 50; const eco = bat.saver || bat.level < 20; const C = dark ? { bg: '#14202B', fg: '#E8F0F7', card: '#1E2D3A', muted: '#90A4B8' } : { bg: '#FFF8F0', fg: '#2A2017', card: '#FFFFFF', muted: '#7A6A58' }; return ( <View style={[styles.app, { backgroundColor: C.bg }]}> <View style={[styles.header, { borderColor: C.card }]}> <Text style={[styles.loc, { color: C.fg }]}>📍 {loc.city}</Text> <Text style={{ color: bat.level < 20 ? '#E57373' : C.muted }}>🔋 {bat.level}%</Text> </View> {eco && <Text style={styles.eco}>🍃 وضع التوفير نشط</Text>} <View style={styles.body}> {tab === 'home' && <Home C={C} dark={dark} />} {tab === 'level' && <Level C={C} />} {tab === 'power' && <Power C={C} bat={bat} eco={eco} />} </View> <View style={[styles.tabbar, { backgroundColor: C.card }]}> {TABS.map((x) => ( <Pressable key={x.k} style={styles.tab} onPress={() => setTab(x.k)} accessibilityRole="button"> <Text style={[styles.ti, { opacity: tab === x.k ? 1 : 0.4 }]}>{x.t}</Text> </Pressable> ))} </View> </View> );} function Home({ C, dark }) { return ( <View style={{ alignItems: 'center', gap: 6 }}> <Text style={{ color: C.fg, fontSize: 20, fontWeight: 'bold' }}>مساعد الميدان</Text> <Text style={{ color: C.muted }}>{dark ? '🌙 الوضع الليليّ' : '☀️ الوضع النهاريّ'}</Text> </View> );} function Level({ C }) { const { x, y } = useTilt(); const ok = Math.abs(x) <= 3 && Math.abs(y) <= 3; return ( <View style={{ alignItems: 'center', gap: 8 }}> <Text style={{ fontSize: 30 }}>{ok ? '✅' : '↕'}</Text> <Text style={{ color: C.fg, fontWeight: 'bold' }}>{ok ? 'مستوٍ' : 'مائل'}</Text> <Text style={{ color: C.muted }}>x={x}° y={y}°</Text> </View> );} function Power({ C, bat, eco }) { return ( <View style={{ alignItems: 'center', gap: 6 }}> <Text style={{ color: C.fg, fontSize: 34, fontWeight: 'bold' }}>{bat.level}%</Text> <Text style={{ color: C.muted }}>{eco ? 'توفيرٌ: تحديثٌ أبطأ وحركاتٌ معطّلة' : 'أداءٌ كامل'}</Text> </View> );} const styles = StyleSheet.create({ app: { minHeight: 300, borderRadius: 16, overflow: 'hidden', margin: 8 }, header: { flexDirection: 'row', justifyContent: 'space-between', padding: 12, borderBottomWidth: 1 }, loc: { fontWeight: 'bold' }, eco: { backgroundColor: '#1B5E20', color: '#C8E6C9', textAlign: 'center', paddingVertical: 4 }, body: { flex: 1, alignItems: 'center', justifyContent: 'center', padding: 24, minHeight: 150 }, tabbar: { flexDirection: 'row', borderTopWidth: 1, borderColor: '#0002' }, tab: { flex: 1, alignItems: 'center', paddingVertical: 12 }, ti: { fontSize: 24 },});
هذا المشروع يجمع المقرر: تنقّل، مستشعرات، ثيمٌ متكيّف، توفير طاقة، وأداة ميزان — في تطبيقٍ واحد متماسك.
٣قائمة تسليم المشروع
قبل تسليم مشروعك، تحقّق من هذه المعايير المستمدّة من نواتج المقرر:
| المعيار | الناتج |
|---|---|
| يعمل على المنصّتين (كودٌ واحد RN) | الأول والثاني |
| يقرأ مستشعرين على الأقل بصحّة | الثالث |
| واجهةٌ متقنة ومتاحة | الرابع |
| وضع توفيرٍ بخفضٍ ≥15% موثّق | الرابع |
| تنقّلٌ واضح وبنيةٌ منظّمة | الثاني |
توقّع وتحقّق
المشروع المتكامل يدمج:
الثيم المتكيّف يأتي من مستشعر:
وضع التوفير يُشتقّ من:
أفضل بنيةٍ للمشروع:
الخلاصة
- المشروع يجمع المقرر: تنقّل + مستشعرات + ثيمٌ متكيّف + توفير طاقة.
- اقرأ المستشعرات في الأعلى، وليستهلك كل تبويبٍ ما يحتاج.
- راجع معايير التسليم: منصّتان، مستشعرات، إتقان، توفيرٌ موثّق، بنيةٌ منظّمة.
تحدٍّ برمجي: لوحة متكاملة مصغّرة
متقدمادمج الموقع والبطارية والضوء في رأسٍ واحد.
المطلوب:
- استورد
useLocationوuseBatteryوuseLight. <Text testID="city">المدينة، و<Text testID="bat">نسبة البطارية.<Text testID="theme">: «ليل» إن كان الضوء أقلّ من 50 وإلا «نهار».
👀 اعرض الناتج المطلوب (وجرّبه)
✓ التحقق الآلي من حلّك:
- الكود يعمل بلا أخطاء في Console
- المدينة الرياض
- البطارية 80%
- الثيم «نهار» ابتداءً
- دمج ثلاثة مستشعرات
💡 تلميح 1
اقرأ الثلاثة بخطّافاتها ثم اعرض كلًّا في Text.
💡 تلميح 2
القيَم الابتدائيّة: الرياض، 80%، ضوء 70 ← نهار.
حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
import { View, Text, StyleSheet } from 'react-native';import { useLocation, useBattery, useLight } from 'smartdevice'; export default function App() { const loc = useLocation(); const bat = useBattery(); const lux = useLight(); const dark = lux < 50; return ( <View style={[styles.box, { backgroundColor: dark ? '#14202B' : '#FFF8F0' }]}> <Text testID="city" style={[styles.v, { color: dark ? '#fff' : '#E8820C' }]}>📍 {loc.city}</Text> <Text testID="bat" style={{ color: dark ? '#E8F0F7' : '#333' }}>🔋 {bat.level}%</Text> <Text testID="theme" style={{ color: dark ? '#90A4B8' : '#7A6A58' }}>{dark ? 'ليل' : 'نهار'}</Text> </View> );} const styles = StyleSheet.create({ box: { padding: 16, gap: 6, borderRadius: 12 }, v: { fontSize: 18, fontWeight: 'bold' },});