קורס אמבדד – RB19-03 מבוא למיקרובקרים – תכנות ואלקטרוניקה
ברוכים הבאים לעולם האומנות הדיגיטאלית : האומנות של שילוב בין חיישנים ושליטה בשפת תכנות
גלאי נפח PIR SENSOR
https://wokwi.com/projects/350062679695557204
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
/* http://www.robotronix.co.il PIR sensor tester PIR : HIGH --> Motion detected PIR : LOW --> Motion ended */ int ledPin = 12; // choose the pin for the LED int inputPin = 14; // choose the input pin (for PIR sensor) int pirState = LOW; // we start, assuming no motion detected int val = 0; // variable for reading the pin status void setup() { pinMode(ledPin, OUTPUT); // declare LED as output pinMode(inputPin, INPUT); // declare sensor as input Serial.begin(9600); } void loop() { val = digitalRead(inputPin); // read input value if (val == HIGH) { // check if the input is HIGH digitalWrite(ledPin, HIGH); // turn LED ON if (pirState == LOW) { // we have just turned on Serial.println("Motion detected!"); // We only want to print on the output change, not state pirState = HIGH; } } else { digitalWrite(ledPin, LOW); // turn LED OFF if (pirState == HIGH) { // we have just turned of Serial.println("Motion ended!"); // We only want to print on the output change, not state pirState = LOW; } } } |
שימוש בחיישן מרחק – נזכור מהירות הקול באויר 343 מטר לשניה
https://wokwi.com/projects/367903941031500801
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
// www.robotronix.co.il // רובוטרוניקס קורס C510 // שיעור 8 - צללים טונים #define speaker 5 #define LedRed 3 #define LedGreen 8 const int pingPin = 7; // Trigger Pin of Ultrasonic Sensor const int echoPin = 6; // Echo Pin of Ultrasonic Sensor void setup() { // pin setting pinMode(pingPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(LedRed , OUTPUT); pinMode(LedGreen, OUTPUT); digitalWrite(LedRed, HIGH); digitalWrite(LedGreen , HIGH); Serial.begin(9600); // Starting Serial Terminal delay(250); digitalWrite(LedRed, LOW); digitalWrite(LedGreen , LOW); Serial.println("starting ..."); } void loop() { long duration, inches, cm; // generate pulse ___|^^^^^|_______________ digitalWrite(pingPin, LOW); delayMicroseconds(2); digitalWrite(pingPin, HIGH); delayMicroseconds(10); digitalWrite(pingPin, LOW); // read pulse duration = pulseIn(echoPin, HIGH); cm = microsecondsToCentimeters(duration); // Serial.print(inches); // Serial.print("in, "); Serial.print(cm); Serial.print("cm"); Serial.println(); if(cm > 200 ) { noTone(speaker); // Stop sound } else { if(cm>=200 && cm<=350 ) { tone(speaker, 3000 -cm*5); // 3000hz - (cm* 5 ) hz delay(50); noTone(speaker); // Stop sound } else { tone(speaker, 3000 -cm*5); // 3000hz - (cm* 5 ) hz // delay(50); noTone(speaker); // Stop sound } } if(cm > 200) // 20 cm { digitalWrite(LedRed, LOW); digitalWrite(LedGreen, HIGH); } else { digitalWrite(LedRed ,HIGH); digitalWrite(LedGreen, LOW); } delay(200); } long microsecondsToCentimeters(long microseconds) { return (microseconds / 29 / 2); } /* In the code, the division by 29 is used to convert the duration of the ultrasonic pulse (measured in microseconds) into a distance measurement in centimeters. This conversion is based on the speed of sound in air and the round-trip travel time of the ultrasonic pulse. The speed of sound in air is approximately 343 meters per second (or 34300 centimeters per second). To calculate the distance traveled by the ultrasonic pulse, you need to consider the time it takes for the pulse to travel from the sensor to the obstacle and back. Since the pulse needs to travel the distance twice (to the obstacle and back), the time measured by the pulseIn() function represents the round-trip time. To calculate the one-way distance traveled by the pulse, you divide the round-trip time by 2. However, the pulseIn() function returns the duration in microseconds, so you need to convert it to seconds by dividing it by 1,000,000. Thus, you have the time taken by the pulse for a one-way trip in seconds. To convert this time to distance in centimeters, you multiply it by the speed of sound (34300 cm/s). The resulting value is the distance traveled by the pulse in centimeters. Here's the breakdown of the calculation: duration is the pulse duration measured by pulseIn() in microseconds. microsecondsToCentimeters(duration) function divides the duration by 29 (approximately the speed of sound divided by 2), giving the one-way distance traveled by the pulse in centimeters. Keep in mind that this is an approximation as the speed of sound can vary slightly with factors like temperature and humidity. */ |
משפטי תנאי וטבלת אמת
מבוא לפונקציות – נלמד מספר דוגמאות במהלך ההרצאה
random פונקציה שמייצרת מספרים אקראים
קישור לתוכנית : https://wokwi.com/projects/367875548685763585
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
void setup() { Serial.begin(115200); } void loop() { // Generate random value between -3 and 19 int randomValue; randomValue = random(-3, 19); Serial.print("Random Value: "); Serial.println(randomValue); delay(500); // Adjust the delay as needed } |
לוגיקה NOT , AND , OR
משפט אמת – השמש זורחת בלילה
משפט שקר- פיל יודע לעוף
משפט אמת : A=5 אז A גדול מ 3
משפט שקל A=-5 אז A גדול מ 0
אופרטורים לוגים
! = NOT – שלילה
&& = AND – גם
|| = OR – או
שימוש בשפטים לוגים
אם טמפרטורת חיצונית מעל 35 מעלות צלזיוס וטמפרטורת תא גידול מעל 35 מעלות צלזיוס סגור תאורת גידול
אם ( מאוור קירור תקוע או טמפרטורה מעל 42 מעלות ) – סגור מערכת קירור השקה את המתקן גידול למשך10 שניות המתן 15 דקות
אם אין שמן ברכב , או מנוע מעל 85 מעלות או מערכת קירור לא עובדת – הדלק מנורת מנוע OVER HEAT בצבע אדום
דוגמא לשימוש AND בתוכנה
https://wokwi.com/projects/367887965727181825
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
char msg[80]; // array to store incoming characters int idx = 0; // index into array int ledPins[] = {15, 2, 4, 5}; int numLeds = 4; int i = 0; int a ,b; void setup() { // array of GPIO pins Serial.begin(115200); Serial.println("Program start "); for (i=0; i < numLeds; i++) { pinMode(ledPins[i], OUTPUT); } // Initialize each GPIO pin as an output and turn on the LED for (i = 3; i >= 0; i--) { digitalWrite(ledPins[i], LOW); } //---------------------------------------------- a=0 , b =1; if ( (a==1) && (b==1) ) // a==1 and b==1 { for (i = 3; i >= 0; i--) { digitalWrite(ledPins[i], HIGH); } } if ( (a==0) && (b==0) ) // a==1 and b==1 { for (i = 3; i >= 0; i--) { digitalWrite(ledPins[i], LOW); } } if ( (a==1) && (b==0) ) // a==1 and b==1 { digitalWrite(ledPins[0], LOW); digitalWrite(ledPins[1], HIGH); digitalWrite(ledPins[2], LOW); digitalWrite(ledPins[3], HIGH); } if ( (a==0) && (b==1) ) // a==0 and b==1 { digitalWrite(ledPins[0], HIGH); digitalWrite(ledPins[1], LOW); digitalWrite(ledPins[2], HIGH); digitalWrite(ledPins[3], LOW); } } void loop() { } |
הרץ את התרגיל הבא – נתח בכיתה את התרגיל :
https://wokwi.com/projects/367907000473290753
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
char msg[80]; // array to store incoming characters int idx = 0; // index into array int ledPins[] = {15, 2, 4, 5}; int numLeds = 4; int i = 0; int a ,b; void setup() { // array of GPIO pins Serial.begin(115200); Serial.println("Program start "); for (i=0; i < numLeds; i++) { pinMode(ledPins[i], OUTPUT); } // Initialize each GPIO pin as an output and turn on the LED for (i = 3; i >= 0; i--) { digitalWrite(ledPins[i], LOW); } //---------------------------------------------- } void loop() { a=random(0,2); b=random(0,2); if ( (a==1) && (b==1) ) // a==1 and b==1 { for (i = 3; i >= 0; i--) { digitalWrite(ledPins[i], HIGH); } } if ( (a==0) && (b==0) ) // a==1 and b==1 { for (i = 3; i >= 0; i--) { digitalWrite(ledPins[i], LOW); } } if ( (a==1) && (b==0) ) // a==1 and b==1 { digitalWrite(ledPins[0], LOW); digitalWrite(ledPins[1], HIGH); digitalWrite(ledPins[2], LOW); digitalWrite(ledPins[3], HIGH); } if ( (a==0) && (b==1) ) // a==0 and b==1 { digitalWrite(ledPins[0], HIGH); digitalWrite(ledPins[1], LOW); digitalWrite(ledPins[2], HIGH); digitalWrite(ledPins[3], LOW); } delay(1500); } |
תרגיל כיתה 1 : בקר לתוכנת אינקובטור
בנה תוכנית בשפת C אשר מייצרת מספר אקראי בין מינוס 20 ל מינוס 42 כולל וצביה אותו לתוך משתנה בשם temp
המערכת שומרת על טמפרטורה על ידי הפעלת מערכת קירר או חימום .
- אם הערך גדול מ 32 מדליקה המערכת אור אדום פין 15 , שולחת פקודה בטרמניל FAN ON
- אם הערך גדול או שווה 27 מעלות וקטן 32 המערכת מדליקה אור כתום פין 4
- אם הערך קטן שווה ל 26 וגדול שווה 16 כולל מעלות מדליקה אור ירוק פין 0
- אם הערך קטן מ 16 מדליקה אור כחול וכותבת למסך " Heater ON" פין 2
השתמש בדוגמאות של של הרצאה קודמת לפי הנידרש
תרגיל כיתה 2 (חובה) : תיקון תקלות בתוכנה
(מטרת התרגול לדעת להתמודד עם תקלות קימפול ) נא לפנות למתרגל אם לא מצליח בכיתה , לעזרה .
- תקן את התוכנה הבאה : https://wokwi.com/projects/367896431241151489
- תקן את התוכנה הבאה : https://wokwi.com/projects/367902856073034753
- תקן את התוכנה הבאה : https://wokwi.com/projects/367902914973648897
פונקציות המשך
https://wokwi.com/projects/367874955701336065
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#include "ESP32Servo.h" Servo myservo; int potpin = 34; int val; void add1(float x , float y) // function do not return value { float c; c=x+y; Serial.print("x+y="); Serial.println(c); } float add2(float x , float y) // function return value { float c; c=x+y; return(c); } void setup() { float temp; Serial.begin(115200); Serial.println("Start"); myservo.attach(19); add1(10,15); //--------------------------------- temp= add2(5,5); Serial.print("x+y="); Serial.println(temp); } void loop() { val = analogRead(potpin); val = map(val, 0, 4095, 0, 180); myservo.write(val); delay(15); } |
מערכים פשוטים ולולאות
https://wokwi.com/projects/367908097224040449
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
#define debug false float price [10]; void fill(void) { int i; for(i=0;i<10;i++) { if (debug == true ) { price[i]=100; } else { price[i]=random(0,150); } } } void print(void) { int i; for(i=0;i<10;i++) { Serial.print(i); Serial.print(" "); Serial.println(price[i]); } } void printAvg(void) { int j; float avg=0; for(j=0;j<10;j++) { avg=avg+price[j]; } avg=avg/10; Serial.println("----------------------"); Serial.print("Avg : "); Serial.println(avg); } void setup() { // put your setup code here, to run once: Serial.begin(115200); Serial.println("Array start"); fill(); print(); printAvg(); } void loop() { // put your main code here, to run repeatedly: delay(10); // this speeds up the simulation } |
הרצ את התוכנית במחשב
מבוא למחרוזות – מערכים המשך
מערך הינו משתנה עם הרבה מאוד תאים , ניתן לפנות לכל מתשנה דרך אינדקס.
תו בודד : משתנה טיפוס char
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void setup() { // Initialize serial communication at 9600 bits per second Serial.begin(9600); } void loop() { // Declare and initialize a char variable char myCharacter = 'A'; // Print the char variable Serial.print("The character is: "); Serial.println(myCharacter); // Wait for a second delay(1000); } |
טבלת – ASCII
בנה תוכנית בשפת C בסביבת ארדואינו שמדפיסה טבלת ASCII – שימוש בפונקציה ()char
https://wokwi.com/projects/367911371728770049
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
void printAsciiTable(void) { int j; float avg=0; for(j=0;j<255;j++) { Serial.print("Dec : "); Serial.print(j); Serial.print(" , "); Serial.println(char(j)); } } void setup() { // put your setup code here, to run once: Serial.begin(115200); Serial.println("Array start"); printAsciiTable(); } void loop() { // put your main code here, to run repeatedly: delay(10); // this speeds up the simulation } |
קליטת תו בודד –
https://wokwi.com/projects/367911659129827329
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
char msg[80]; // array to store incoming characters int idx = 0; // index into array int ledPins[] = {15, 2, 4, 5}; int numLeds = 4; int i = 0; char ch; void setup() { // array of GPIO pins Serial.begin(115200); Serial.println("Program start "); for (i=0; i < numLeds; i++) { pinMode(ledPins[i], OUTPUT); } // Initialize each GPIO pin as an output and turn on the LED for (i = 3; i >= 0; i--) { digitalWrite(ledPins[i], LOW); delay(500); } } void loop() { // No code needed in the loop for this example // Check if data is available to read if (Serial.available() > 0) { ch = Serial.read(); if (ch=='1') { digitalWrite(ledPins[0], HIGH); Serial.println("key 1 pressed"); } if (ch=='2') { digitalWrite(ledPins[1], HIGH); Serial.println("key 2 pressed"); } if (ch=='3') { digitalWrite(ledPins[2], HIGH); Serial.println("key 3 pressed"); } if (ch=='4') { digitalWrite(ledPins[3], HIGH); Serial.println("key 4 pressed"); } if (ch=='5') { for (i = 3; i >= 0; i--) { digitalWrite(ledPins[i], LOW); delay(500); } } if (ch=='6') { for (i = 3; i >= 0; i--) { digitalWrite(ledPins[i], HIGH); delay(500); } } } } |
מחרוזות :
הגדרת מחרזות והדפסה שלהם
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
void setup() { // Initialize serial communication at 9600 bits per second Serial.begin(9600); char msg[80]; strcpy(msg, "http://robotronix.co.il"); // copy the URL into the msg array Serial.println(msg); // print the URL // Print the length of msg Serial.print("Length of msg: "); Serial.println(strlen(msg)); // Check the URL and print the appropriate message if (strstr(msg, ".co.il") != NULL) { Serial.println("Israeli site"); } else if (strstr(msg, ".com") != NULL) { Serial.println("Commercial site"); } else if (strstr(msg, ".it") != NULL) { Serial.println("Italian site"); } // Check if the site uses HTTPS or HTTP if (strstr(msg, "https://") != NULL) { Serial.println("Site is secure"); } else if (strstr(msg, "http://") != NULL) { Serial.println("Site is not secure"); } } void loop() { // No need for code in the loop for this example } |
קריאת ערכים מכניסה סיריאלית
https://wokwi.com/projects/367273385352846337
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
char msg[80]; // array to store incoming characters int idx = 0; // index into array void setup() { // Initialize serial communication at 9600 bits per second Serial.begin(9600); } void loop() { // Check if data is available to read if (Serial.available() > 0) { char receivedChar = Serial.read(); // If received character is a newline, print the message and reset the index if (receivedChar == '\n') { msg[idx] = '\0'; // Null-terminate the C-string Serial.print("Received message: "); Serial.println(msg); idx = 0; // Reset index to start storing at the beginning of msg } else if (idx < sizeof(msg) - 1) { // Ensure we don't go past the end of the array // Add the received character to the msg array msg[idx] = receivedChar; idx++; } } } |
תרגיל כיתה 3 :
1. הוסף לתוכנית הבאה משקה moka ללד כחול : https://wokwi.com/projects/367273385352846337
2. תקן את התוכנית הבא רמז שורה 9 : https://wokwi.com/projects/367252012078679041
3. תקן את השגיאות בקוד התכונה : https://wokwi.com/projects/367273813452882945
תרגיל כיתה 4 : מנעול חשמלי – ( עבודה בזוגות )
1.בנה תוכנה של מנעול חשמלי הכוללךת סרבו , לד אדום , לד ירוק., סרבו מאותחל למצב 0 מעלות
2 נתון קוד פתיחה "1234"
3.למשתמש יש 3 ניסיונות להקלדת קוד מתשמש טעה מדליק לד אדום , אם טעה ב 3 פעם בהקלת סיסמא , התוכנה נתקעת ל 10 שניות
4. אם הקוד נכון נלדק לד ירוק ,סרבו זז ל 180 ונשמע צפצוף 3 פעמים
מסך OLED
https://wokwi.com/projects/350341364144144978
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED width, in pixels #define SCREEN_HEIGHT 64 // OLED height, in pixels // create an OLED display object connected to I2C Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); void setup() { Serial.begin(9600); // initialize OLED display with I2C address 0x3C if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("failed to start SSD1306 OLED")); while (1); } delay(2000); // wait two seconds for initializing oled.clearDisplay(); // clear display oled.setTextSize(1); // set text size oled.setTextColor(WHITE); // set text color oled.setCursor(0, 2); // set position to display (x,y) oled.println("Robotronix.co.il"); // set text oled.display(); // display on OLED } void loop() { } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
void setup() { // Initialize serial communication at 9600 bits per second Serial.begin(9600); } void loop() { // Define weight and height float weight = 70.0; // weight in kilograms float height = 1.75; // height in meters // Calculate BMI and print result calculateAndPrintBMI(weight, height); // Wait for a second delay(1000); } void calculateAndPrintBMI(float weight, float height) { // Calculate BMI float bmi = weight / (height * height); // Print the result Serial.print("BMI is: "); Serial.println(bmi); // Print BMI classification if (bmi < 18.5) { Serial.println("Underweight"); } else if (bmi < 24.9) { Serial.println("Normal weight"); } else if (bmi < 29.9) { Serial.println("Overweight"); } else { Serial.println("Obesity"); } } |
אקסלומר וגיירוסקופ – אלקטרוני