analogRead возвращает максимум 255
- Войдите на сайт для отправки комментариев
Пнд, 06/11/2017 - 14:14
плата Pro Mini 3.3 V
при подаче VCC на А0, analogRead возвращает 255
при включеном INPUT_PULLUP analogRead возвращает 1023, при подаче GND - около 760
Скетч секретный? Если нет, то выложите (только правильно, с номерами строк).
И, пожалуйста, именно тот самый скетч. который так себя ведёт, прямо копи-пастом, а не "любой аналогрид".
при подаче VCC на А0, analogRead возвращает 255
при включеном INPUT_PULLUP analogRead возвращает 1023, при подаче GND - около 760
Не забудьте про внешнее (или внутреннее по Вашему выбору) опорное напряжение AREF, отсчет выходного 0...1023 ведется от него
A0=AREF выход 1023
AO=GND выход 0
код
/* // March 2014 - TMRh20 - Updated along with High Speed RF24 Library fork // Parts derived from examples by J. Coliz <maniacbug@ymail.com> */ /** * Example for efficient call-response using ack-payloads * * This example continues to make use of all the normal functionality of the radios including * the auto-ack and auto-retry features, but allows ack-payloads to be written optionally as well. * This allows very fast call-response communication, with the responding radio never having to * switch out of Primary Receiver mode to send back a payload, but having the option to if wanting * to initiate communication instead of respond to a commmunication. */ #include <SPI.h> #include "nRF24L01.h" #include "RF24.h" #include "printf.h" //#include <readVcc.h> //#include <Vcc.h> // Hardware configuration: Set up nRF24L01 radio on SPI bus plus pins 7 & 8 RF24 radio(7,8); const int analogInPin = A1; int sensorValue = 0; // Topology const uint64_t pipes[2] = { 0xABCDABCD71LL, 0x544d52687CLL }; // Radio pipe addresses for the 2 nodes to communicate. // Role management: Set up role. This sketch uses the same software for all the nodes // in this system. Doing so greatly simplifies testing. typedef enum { role_ping_out = 1, role_pong_back } role_e; // The various roles supported by this sketch const char* role_friendly_name[] = { "invalid", "Ping out", "Pong back"}; // The debug-friendly names of those roles role_e role = role_pong_back; // The role of the current running sketch // A single byte to keep track of the data being sent back and forth byte counter = 1; float battVolts; void setup(){ pinMode(analogInPin, INPUT); Serial.begin(115200); printf_begin(); Serial.print(F("\n\rRF24/examples/pingpair_ack/\n\rROLE: ")); Serial.println(role_friendly_name[role]); Serial.println(F("*** PRESS 'T' to begin transmitting to the other node")); // Setup and configure rf radio // analogReference (DEFAULT); // ADCSRA &= ~(bit (ADPS0) | bit (ADPS1) | bit (ADPS2)); // clear prescaler bits // ADCSRA |= bit (ADPS0) | bit (ADPS1); radio.begin(); radio.setPALevel(RF24_PA_MAX); radio.setAutoAck(1); // Ensure autoACK is enabled radio.enableAckPayload(); // Allow optional ack payloads radio.setRetries(0,15); // Smallest time between retries, max no. of retries radio.setPayloadSize(1); // Here we are sending 1-byte payloads to test the call-response speed radio.openWritingPipe(pipes[1]); // Both radios listen on the same pipes by default, and switch when writing radio.openReadingPipe(1,pipes[0]); radio.startListening(); // Start listening radio.printDetails(); // Dump the configuration of the rf unit for debugging } void loop(void) { if (role == role_ping_out){ radio.stopListening(); // First, stop listening so we can talk. printf("Now sending %d as payload. ",counter); byte gotByte; unsigned long time = micros(); // Take the time, and send it. This will block until complete //Called when STANDBY-I mode is engaged (User is finished sending) if (!radio.write( &counter, 1 )){ Serial.println(F("failed.")); }else{ if(!radio.available()){ Serial.println(F("Blank Payload Received.")); }else{ while(radio.available() ){ unsigned long tim = micros(); radio.read( &sensorValue, sizeof(sensorValue) ); printf("Round-trip delay: %lu microseconds ",tim-time); Serial.print("sensorValue = "); Serial.print(sensorValue); Serial.println(" "); counter++; } } } // Try again later delay(1000); } // Pong back role. Receive each packet, dump it out, and send it back if ( role == role_pong_back ) { // radio.setPALevel(RF24_PA_LOW); byte pipeNo; byte gotByte; // Dump the payloads until we've gotten everything sensorValue = analogRead(analogInPin); while( radio.available(&pipeNo)){ radio.read( &gotByte, 1 ); radio.writeAckPayload(pipeNo,&sensorValue, sizeof(sensorValue) ); } } // Change roles if ( Serial.available() ) { char c = toupper(Serial.read()); if ( c == 'T' && role == role_pong_back ) { Serial.println(F("*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK")); role = role_ping_out; // Become the primary transmitter (ping out) radio.openWritingPipe(pipes[0]); radio.openReadingPipe(1,pipes[1]); } else if ( c == 'R' && role == role_ping_out ) { Serial.println(F("*** CHANGING TO RECEIVE ROLE -- PRESS 'T' TO SWITCH BACK")); role = role_pong_back; // Become the primary receiver (pong back) radio.openWritingPipe(pipes[1]); radio.openReadingPipe(1,pipes[0]); radio.startListening(); } } }Не, ну в этом коде Вы сами разбирайтесь. Приведите короткий на три строчки код, который демонститрует описанный Вами эффект:
при подаче VCC на А0, analogRead возвращает 255
при включеном INPUT_PULLUP analogRead возвращает 1023, при подаче GND - около 760
Если Вы не можете привести короткий (короткие все работают), то значит ошибка в этом коде, а не в чём-то другом. И если так. то Вы хотть скажите в какой строке Вы эти 255, 1023 и 760 выводите, не заставляёте людей рыться в Вашем коде без Вашей помощи.
Я вот например НЕ ВИЖУ в этом коде чтобы Вы где-то печатали результат analogRead. Где Вы это делаете? А если не делаете, то с чего Вы взяли, что он возвращает то, что Вы написали?
sensorValue = analogRead(analogInPin); while( radio.available(&pipeNo)){ radio.read( &gotByte, 1 ); radio.writeAckPayload(pipeNo,&sensorValue, sizeof(sensorValue) ); }Для отладки результат вывожу по радиоканалу на другой модуль.
Фактически нормально не работает сам analogRead. Как можно получить 760 при подаче GND на А0?
Вы можете поставить вывод значения sensorValue сразу во вторую строку и посмотреть, что же там на самом деле?
Мало ли что Вы там куда-то передаёте и откуда мне знать как Вы там это принимаете и как печатаете, тем болеее, что того кода (который принимает и печатает) Вы не показали! Я не вижу с чего Вы взяли, что там 760.
Для отладки результат вывожу по радиоканалу на другой модуль.
Вы ещё почтой России в Зимбабве его пошлите. Выведите СРАЗУ после чтения с порта результат в Serial - и посмотрите, что там.
Код универсальный для приемника и передатчика, конфигурируется через терминал. Произвольные значения передаются нормально.
Когда pinMode(analogInPin, INPUT)
А0 в воздухе -
Now sending 12 as payload. Round-trip delay: 608 microseconds sensorValue = 1023
А0 на GND -
Для отладки результат вывожу по радиоканалу на другой модуль.
Вы ещё почтой России в Зимбабве его пошлите. Выведите СРАЗУ после чтения с порта результат в Serial - и посмотрите, что там.
Как проще всего это сделать для Pro Mini ?
В наличии Pro Mini, Nano, NRF24 2 шт.
Как проще всего это сделать для Pro Mini ?
В наличии Pro Mini, Nano, NRF24 2 шт.
USB-TTL-конвертер в помощь, и в любой терминалке смотреть, хоть в том же мониторе порта в Arduino IDE.
Вот ещё, на всякий: https://electronics.stackexchange.com/questions/70769/arduino-incorrect-readings-from-analog-pin
Убрав radio.setPayloadSize(1) все работает нормально. Спасибо всем кто откликнулся.
Убрав radio.setPayloadSize(1) все работает нормально. Спасибо всем кто откликнулся.
надеюсь. вы понимаете, в чем причина? или обьяснить?
Один байт пересылался? Ну, вот блин, Вам вчера говорили, что Вы не показала как Вы это принимаете :(
Секретничайте дальше.
Ну, вот блин, Вам вчера говорили, что Вы не показала как Вы это принимаете :(
Секретничайте дальше.
Код универсальный для приемника и передатчика, конфигурируется через терминал.
надеюсь. вы понимаете, в чем причина? или обьяснить?
Я честно не понимаю, как при INPUT_PULLUP я получал 1023 при сухом А0, и не получал 0 при GND на А0.
Я честно не понимаю, как при INPUT_PULLUP я получал 1023 при сухом А0, и не получал 0 при GND на А0.
А после удаления radio.setPayloadSize(1) какие данные получаете?
Я честно не понимаю, как при INPUT_PULLUP я получал 1023 при сухом А0, и не получал 0 при GND на А0.
Да всё вы правильно получали, вам говорили - выводить сразу после чтения в Serial, и не парить людам моск надуманными проблемами.