По факту не знаю - скетч залил; Кнопку на 3 пин и на землю. И получается: загружаю тару, как вес становится равным - загорается светодиод 7 пина, на пине 8 гаснет. Снимаю тару с грузом - 7 пин гаснет, 8 светится.. как и раньше без флагов и прерывания... моторов пока нет.. проверить будут они крутиться или нет пока не могу. Буду почту ждать...гребаный али...второй месяц уже.. Это я пока пытаюсь отработать схему, да и подучиться.. поколупаться... а что будет если...любопытно, но во многих библиотеках не пишут какая функция что делает и как правильно её писать..методом тыка..
А на сайтах : Код (C++): void loop() { for (int i = 0; i < 10; i ++) { // усредняем показания, считав значения датчика 10 раз units = + scale.get_units(), 10; // суммируем показания 10 замеров } Так где же правильно? И за чем нужен цикл "for (int i = 0; i < 10; i ++)", если выражение "scale.get_units(10), 1" уже само по себе выдаёт среднее арифметическое из 10 показаний(ну или из стольки сколько в скобках будет)? Код (C++): Serial.println("Before setting up the scale:"); // by the SCALE parameter set with set_scale
Чтобы понять, где правильно - надо знать основы языка. Вы этого - не хотите, вам не нужно. При этом - не верите, когда вам говорят, что это - неправильно. Можете пойти на те сайты, которые распространяют эту неправильную дичь - и посоветоваться там, раз не верите, что вам говорят здесь. По факту же: то, что написано "на сайтах" - неправильно.
Уроды, чо с нас взять... https://arduino.ru/forum/programmir...-davleniya-v-konkretnoe-vremya#comment-485357 В твоём случае, хрень это units =+ scale.get_units(), 10; // суммируем показания 10 замеров
Автору поста: давайте представим, что у нас возвращаемое значение с весов - константа, например, значение 10. И нам надо получить среднее с 10 замеров. Ниже - два кода, один - неправильный, второй - правильный. Результаты можно проанализировать в мониторе порта. Итак: 1. Неправильный: Код (C++): int get_units() { return 10; // как будто на весах 10 грамм всегда } void setup() { Serial.begin(9600); int average = 0; for(int i=0;i<10;i++) { average = + get_units(), 10; Serial.println(average); } Serial.println(average/10); } void loop() { } 2. Правильный: Код (C++): int get_units() { return 10; // как будто на весах 10 грамм всегда } void setup() { Serial.begin(9600); int average = 0; for(int i=0;i<10;i++) { average += get_units(); Serial.println(average); } Serial.println(average/10); } void loop() { } Сделайте над собой усилие - запустите оба скетча и дайте сюда выхлоп с монитора порта - а то вдруг мы все тут заблуждаемся, и "на сайтах" всё правильно, а мы тут дичь порем. Ась?
Изучаю, изучаю...http://arduino.ru/Reference . но там многого нету. Хочу, нужно, но не всё сразу. Я тоже могу сказать что неправильно и не объяснить - тогда толку от того что сказал?
Вам объяснили - учите основы С++. Вам этого не надо, потому что это - для вас сложно и ненужно, гораздо проще делать вид, что все вокруг - говно, а вы в белом. Если бы вы открыли учебник по языку С/С++ и прочитали первые несколько глав - то многие вопросы отпали бы сами собой. Но это же сложно, правда? Единственно правильное объяснение - вам было дано. Остальное - от лукавого, и вы так и будете тыкаться, как слепой кутёнок.
То есть то, что есть разница - вы увидели по выхлопу в мониторе порта, так? А теперь ответьте мне на вопрос - почему такая разница, и почему вариант, который "на всех сайтах" - неправильный?
Так учебник по С/С++ или по Ардуино? Читал по Ардуино учебник и не только начало.. А вот С/С++ слишком заморочен.. очень много всего. Этого я не знаю.. Знать все кто писал эти скетчи - чудотворцы...
Именно учебник по С/С++, в среде Arduino IDE идёт программирование именно на этих языках (детали опустим). Гуглите "Керниган и Ритчи", "Страуструп", первые ссылки.
Самые правильные книги - это Керниган и Ритчи, а таже Страуструп. Первая - по языку С, вторая - по языку С++. Читать попсовых полуграмотных авторов на "всех сайтах" - такое себе. Керниган и Ритчи: https://nsu.ru/xmlui/bitstream/handle/nsu/9058/kr.pdf Страуструп: http://www.8361.ru/6sem/books/Straustrup-Yazyk_programmirovaniya_c.pdf Читайте, они интересные.
Не знаете именно потому, что у вас отсутствуют САМЫЕ БАЗИСНЫЕ знания. Чтобы ответить на мой вопрос - достаточно потратить день, прочитав про операторы и структуру языка. Но делать это надо, читая нормальную литературу, а не полуграмотных блогеров и прочую шушару. З.Ы. Например, Asper Daffy - даст фору десятку таких, как Джерему Блум, поверьте на слово. И стоит прислушиваться к тому, что вам говорят противные "гуру" - у вас прям неприятие проскакивает. Форум, кстати - это общение по интересам, не более того. И вам, естестенно, никто ничем не обязан. Но, как видите - пытаются помочь, несмотря на ваши отбрыкивания.
А Вы уверены, что код новый? Попробуйте этот, после снятия тары - нажать кнопку, выложите вывод в монитор порта. Код (C++): // HX711 к Arduino pin 4->CLK 5->DAT 5V->VCC GND->GND //дИСПЛЕЙ 1602 и oled VCC — 5V GND — GND SDA — A4 SCL — A5 // The HX711 board can be powered from 2.7V to 5V so the Arduino 5V power should be fine. #include <LiquidCrystal_I2C.h> #include "HX711.h" #define calibration_factor -7400.0 #define LOADCELL_DOUT_PIN 5 #define LOADCELL_SCK_PIN 4 HX711 scale; LiquidCrystal_I2C lcd(0x27, 16, 2); int X = 21; float units; const byte ledPin = 7; const byte ledPin3 = 3; volatile byte flag = 1; void Button_press() { flag = 0; } void setup() { lcd.init(); // Инициализация дисплея lcd.backlight(); // Подключение подсветки lcd.setCursor(0, 0); // Установка курсора в начало первой строки Serial.begin(9600); scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN); scale.set_scale(); scale.tare(); scale.set_scale(calibration_factor); attachInterrupt(1, Button_press, FALLING); Serial.println("Code 19:03"); } void loop() { static byte prev_flag = 0; for (int i = 0; i < 5; i ++) // усредняем показания, считав значения датчика 3 раза { units += scale.get_units(); // суммируем показания 3 замера } units /= 5.0; lcd.clear(); lcd.setCursor(0, 0); lcd.print(units); if(flag != prev_flag) { Serial.print("New flag ="); Serial.println(flag); prev_flag=flag; } if ( (units * 10.0) >= X ) { if (flag == 0) { digitalWrite(7, HIGH);//КОНЕЦ, СТАВИТСЯ НА ПАУЗУ.Прерывание. При нажатии кнопки начать сначала. digitalWrite(8, LOW); Serial.println("Pin 7 = HIGH"); flag=1; } } else { if (flag == 0) { digitalWrite(7, LOW); //КОНЕЦ, СТАВИТСЯ НА ПАУЗУ.Прерывание. При нажатии кнопки начать сначала. digitalWrite(8, HIGH); Serial.println("Pin 7 = LOW"); } } }
Мне кажется - это ваше личное восприятие ситуации, не более того. Проблема в том, что любая попытка объяснить человеку, как пишется слово, если человек не знает азбуки - обречена провал, ибо начинать надо, как раз - с азбуки. В контексте обсуждаемого - это азбука как раз, которой вы не владеете, пока что.